Jump to content
  • Advertisement
Sign in to follow this  
peter_b

extracting scale vector from a transformation matrix?

This topic is 4583 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hello. If i have a transformation matrix, containing translation, rotation, scaling etc.. How can i extract the scale vector from that? (ie. sx,sy,sz). Hope its possible and not as hard as getting the rotation in euler angles from a matrix.. =P Thanks in advance.

Share this post


Link to post
Share on other sites
Advertisement
hmm, I think you can extract it with something like this :


the matrix is like :

m11 m12 m13 m14
m21 m22 m23 m24
m31 m32 m33 m34
m41 m42 m43 m44

then the scale should be :

sx = length(vector3(m11, m12, m13));
sy = length(vector3(m21, m22, m23));
sz = length(vector3(m31, m32, m33));


basically, you take the transformed x, y and z axis, and compute their length to get the scale along each axis.

But i'm not sure if this always works.

Share this post


Link to post
Share on other sites
The scale vector is the vector of singular values of the matrix. You find it by performing the singular value decomposition (SVD) of the matrix.

Much easier, though, is simply knowing it in the first place. Where did the matrix come from? If you generated it yourself, just keep the scale vector around.

Share this post


Link to post
Share on other sites
It was read from a level file in matrix form.. and since i need to do object transformation, i need to know the scale in order to apply it after the rotation etc.. or it will look borked.. =/

In other words, i have to extract it..

Share this post


Link to post
Share on other sites
iv written a program that generates random transformation matrixes composed of translation/scale/rotation, and paic's method seems to work in all cases it can come up with.

Can anyone confirm that this method works everytime?

Share this post


Link to post
Share on other sites
Quote:
Original post by peter_b
iv written a program that generates random transformation matrixes composed of translation/scale/rotation, and paic's method seems to work in all cases it can come up with.

Can anyone confirm that this method works everytime?

From a mathematical point of view: The linear matrix part (that is the 3x3 sub-matrix paic's method decomposes) is influenced by rotations and scaling only as long restricting self to rotations, scalings, and translations. Since a rotation matrix is always orthonormal, the length of the basis vectors could be interpreted as scaling factors.

Now it is most likely to scale first, and then to rotate, and at last to translate. If using column vectors
M := T * R * S
else if using row vectors
M := S * R * T

When actually doing so, one sees that paic's method works well with row vectors and the assumption that the scaling factors are positive, since
sx = sqrt( ( R11 * Sx )2 + ( R12 * Sx )2 + ( R13 * Sx)2 )
= sqrt( R112 + R122 + R132 ) * | Sx |
= | Sx |
due to orthonormality of rotation matrices. (I've used paic's indexing scheme.)

If you use column vectors, then the indexing must be "transposed":
sx = sqrt( ( R11 * Sx )2 + ( R21 * Sx )2 + ( R31 * Sx)2 )
= | Sx |

Additionally, you have to spend more effort if also negative scaling (mirroring) is allowed, namely something like sign comparisons. Althought it isn't possible to detect mirrorings over 2 axes (that will be seen as a rotation) it is possible to detect mirroring over 1 or 3 axes. EDIT: But be aware that it isn't possible to detect what axes were originally mirrored.


So, IMHO under the above assumptions paic's solution should be sufficient for all positive scaling factors.

[Edited by - haegarr on March 29, 2006 7:12:06 AM]

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!