Getting rotation for a DX matrix.
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
Are you trying to get euler angles out of the matrix? Because that's a touchy thing to attempt. Not unworkable, but very problematic.
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:
and we have our reference axis vectors:
... and here, "dot product" comes to help us :)
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]
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]
Hi,
I saw something wrong and corrected now. Please refer to updated message.
Hope this helps.
I saw something wrong and corrected now. Please refer to updated message.
Hope this helps.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement