The normal matrix is created via first transposing and then inverting the upper 3×3 part of the world (or world-view) matrix.
normalMat = inverse(transpose(upper33(worldMat))
While it does remove translations, it does not remove scales. Its purpose is to correct the directions the normals face under non-uniform scaling. That is, if the model scales up along its X axis by 2 times, without the inverse transpose matrix the normal will also lean further away from 0 along the X axis, when in fact it should actually point more and more towards 0 along the X axis as the model’s X scaling increases.
Using the inverse transpose reverses the scaling to make this happen.
In short, the inverse-transpose matrix is meant to correct artifacts under non-uniform scaling conditions. It does not remove scaling.
In order to remove scaling you have to either renormalize the vector after multiplying it by the inverse transpose matrix (most common) or renormalize the 3 rows of the inverse-transpose matrix (faster).
It is amazing how often people try to be unique, and yet they are always trying to make others be like them. - L. Spiro 2011
I spent most of my life learning the courage it takes to go out and get what I want. Now that I have it, I am not sure exactly what it is that I want. - L. Spiro 2013
I went to my local Subway once to find some guy yelling at the staff. When someone finally came to take my order and asked, “May I help you?”, I replied, “Yeah, I’ll have one asshole to go.”
L. Spiro Engine: http://lspiroengine.com
L. Spiro Engine Forums: http://lspiroengine.com/forums