AnselmG

01-10-2007, 04:57 AM

I need to separate the x,y and z rotation components out of a matrix which contains no scaling factor. Therefore I found this website:

www.robertblum.com/articles/category/math/ (http://www.robertblum.com/articles/category/math/)

I tried to implement it that way, but when I use the three results to create the same matrix again, I don't get the original matrix back - some values are (more than slightly) different or with inverted sign.

Probably I just did a mistake. If anyone can fix it out of this code:

rotVals.x = atan2( m_fMVMatrix[9], m_fMVMatrix[10]);

rotVals.y = asin( -m_fMVMatrix[8] );

rotVals.z = atan2( m_fMVMatrix[4], m_fMVMatrix[0]);

GLdouble mat[16] =

{ cos(rotVals.y)*cos(rotVals.z),

(cos(rotVals.z)*sin(rotVals.x)*sin(rotVals.y)) - (sin(rotVals.z)*cos(rotVals.x)),

(cos(rotVals.x)*cos(rotVals.z)*sin(rotVals.y)) + (sin(rotVals.x)*sin(rotVals.z)),

0,

cos(rotVals.y)*sin(rotVals.z),

(sin(rotVals.x)*sin(rotVals.y)*sin(rotVals.z)) + (cos(rotVals.x)*cos(rotVals.z)),

(cos(rotVals.x)*sin(rotVals.y)*cos(rotVals.z)) - (sin(rotVals.x)*cos(rotVals.z)),

0,

-sin(rotVals.y),

-sin(rotVals.x)*cos(rotVals.y),

cos(rotVals.x)*cos(rotVals.y),

0,

pos.x,

pos.y,

pos.z,

1.0

}; it would be great!

www.robertblum.com/articles/category/math/ (http://www.robertblum.com/articles/category/math/)

I tried to implement it that way, but when I use the three results to create the same matrix again, I don't get the original matrix back - some values are (more than slightly) different or with inverted sign.

Probably I just did a mistake. If anyone can fix it out of this code:

rotVals.x = atan2( m_fMVMatrix[9], m_fMVMatrix[10]);

rotVals.y = asin( -m_fMVMatrix[8] );

rotVals.z = atan2( m_fMVMatrix[4], m_fMVMatrix[0]);

GLdouble mat[16] =

{ cos(rotVals.y)*cos(rotVals.z),

(cos(rotVals.z)*sin(rotVals.x)*sin(rotVals.y)) - (sin(rotVals.z)*cos(rotVals.x)),

(cos(rotVals.x)*cos(rotVals.z)*sin(rotVals.y)) + (sin(rotVals.x)*sin(rotVals.z)),

0,

cos(rotVals.y)*sin(rotVals.z),

(sin(rotVals.x)*sin(rotVals.y)*sin(rotVals.z)) + (cos(rotVals.x)*cos(rotVals.z)),

(cos(rotVals.x)*sin(rotVals.y)*cos(rotVals.z)) - (sin(rotVals.x)*cos(rotVals.z)),

0,

-sin(rotVals.y),

-sin(rotVals.x)*cos(rotVals.y),

cos(rotVals.x)*cos(rotVals.y),

0,

pos.x,

pos.y,

pos.z,

1.0

}; it would be great!