Getting rotation for a DX matrix.

Started by
2 comments, last by programci_84 14 years, 10 months ago
hi guys i'm forced to get rotation from the matrix as the other outputs are unreliable and are not accessable to alter the code. I have had a look at the matrix articles and i thought i'd knew how to do it, i'd just pick the p[art of the matrix that is not afftected by other rotations or translations e.g. 33 for y rotation and just use inverse cos. This ofcourse fails whne you times matrices together, and therein lies my problem. I now cannot get the rotation. Please, is there a magic way of getting the rotation? JamesCobras
Advertisement
Are you trying to get euler angles out of the matrix? Because that's a touchy thing to attempt. Not unworkable, but very problematic.
SlimDX | Ventspace Blog | Twitter | Diverse teams make better games. I am currently hiring capable C++ engine developers in Baltimore, MD.
Hi,

Seems a very difficult problem to solve :) But I can say something I think :)

You know matrices are built from axis vectors. If you're using row-major ones, first row contains X, second row contains Y and the third row contains Z axis vectors.

Now you can get the axis vectors of the rotated matrix:
mR = [rX, rY, rZ] (right axis)mU = [uX, uY, uZ] (up axis)mL = [lX, lY, lZ] (look axis)


and we have our reference axis vectors:
vR = [1, 0, 0] (right axis)vU = [0, 1, 0] (up axis)vL = [0, 0, 1] (look axis)


... and here, "dot product" comes to help us :)

kR = [rX, rY, 0]kU = [0, uY, uZ]kL = [lX, 0, lZ]dot (kR, vR) = |kR| . |vR| . cos (Alpha) => cos(Alpha) = dot (kR, vR) / |kR|dot (kU, vU) = |kU| . |vU| . cos (Beta)  => cos(Beta)  = dot (kU, vU) / |kU|dot (kL, vL) = |kL| . |vL| . cos (Theta) => cos(Theta) = dot (kL, vL) / |kL|


From these cos(.) values, you can get the rotation angles in radians by using acosf() function. And you can use D3DXToDegree() to get that angles in degrees.
Here,
* Alpha represents rotation angle around z (look) axis vector,
* Beta represents rotation angle around x (right) axis vector,
* Theta represents rotation angle around y (up) axis vector.

This picture can help you to understand how I got these formulas. I'm using this technique to obtain right and up vectors from only look vector.

If anyone saw something wrong, please correct me ;)

Hope this helps.
Rohat.

[Edited by - programci_84 on June 12, 2009 6:01:15 AM]
There's no "hard", and "the impossible" takes just a little time.
Hi,

I saw something wrong and corrected now. Please refer to updated message.

Hope this helps.
There's no "hard", and "the impossible" takes just a little time.

This topic is closed to new replies.

Advertisement