#include <DecomposeAffineC.h>
Decomposes matrix into translation, rotation, scale and scael rotation parts. The class is based on the article: "Polar Matrix Decomposition" by Ken Shoemake, shoemake@graphics.cis.upenn.edu in "Graphics Gems IV", Academic Press, 1994
To reassemble the matrix use following:
Matrix3C rScaleMat, rScaleRotMat, rInvScaleRotMat;
Matrix3C rPosMat, rRotMat, rTM;
QuatC rInvScaleRot;
// scale
rScaleMat.set_scale( rScale );
// scale rot
rScaleRot.from_axis_angle( rScaleAxis, f32ScaleAngle );
rScaleRotMat.set_rot( rScaleRot );
// inv scale rot
rInvScaleRot = rScaleRot.unit_inverse();
rInvScaleRotMat.set_rot( rInvScaleRot );
// rot
rRot.from_axis_angle( rRotAxis, f32RotAngle );
rRotMat.set_rot( rRot );
// pos
rPosMat.set_trans( rPos );
// Compose matrix
rTM = rInvScaleRotMat * rScaleMat * rScaleRotMat * rRotMat * rPosMat;Or using OpenGL:
float32 f32X, f32Y, f32Z, f32A;
QuatC rInvScaleRot = rScaleRot.unit_inverse();
glTranslatef( rPos[0], rPos[1], rPos[2] );
rRot.to_axis_angle( f32X, f32Y, f32Z, f32A );
glRotatef( f32A / (float32)M_PI * 180.0f, f32X, f32Y, f32Z );
rScaleRot.to_axis_angle( f32X, f32Y, f32Z, f32A );
glRotatef( f32A / (float32)M_PI * 180.0f, f32X, f32Y, f32Z );
glScalef( rScale[0], rScale[1], rScale[2] );
rInvScaleRot.to_axis_angle( f32X, f32Y, f32Z, f32A );
glRotatef( f32A / (float32)M_PI * 180.0f, f32X, f32Y, f32Z );
|
|
Constructor.
|
|
|
Desctructor.
|
|
|
Return essential rotation part of the matrix.
|
|
|
Return scale part of the matrix.
|
|
|
Return scale rotation part of the matrix.
|
|
|
Returns sign of the determinant.
|
|
|
Returns the translation part of the matrix.
|