3
\$\begingroup\$

I'm doing character control with kinect. I need to mirror the joint orientation because the character faces the player. Somehow by Googling through internet I've done it and everything works very well. But I have little idea about how the math works, here's my code:

//-------------------------------------------------------------------------------------
Ogre::Quaternion JointOrientationCalculator::buildQuaternion(Ogre::Vector3 xAxis, Ogre::Vector3 yAxis, Ogre::Vector3 zAxis)
{    
    Ogre::Matrix3 mat;    
    if(isMirror)
    {
        mat = Ogre::Matrix3(xAxis.x, yAxis.x, zAxis.x,
                            xAxis.y, yAxis.y, zAxis.y,
                            xAxis.z, yAxis.z, zAxis.z);    
        Ogre::Matrix3 flipMat(1, 0,  0,
                              0, 1,  0,
                              0, 0, -1);    
        mat = flipMat * mat * flipMat;
    }
    else
    {    
        mat = Ogre::Matrix3(xAxis.x, -yAxis.x, zAxis.x,
                           -xAxis.y, yAxis.y, -zAxis.y,
                           xAxis.z,  -yAxis.z, zAxis.z);
    }

    Ogre::Quaternion q;
    q.FromRotationMatrix(mat);      

    return q;
}

When I need to mirror/flip it by axes z I calculate mat = flipMat * mat * flipMat; but I don't understand how this equation works.

\$\endgroup\$

1 Answer 1

1
\$\begingroup\$

That matrix corresponds to the sequence of operations of (1) flipping the z-axis; (2) performing the original rotation; and (3) flipping the z-axis again. You can look at it as switching between "Kinect space" and your on-screen camera space, doing the rotation, then converting back to the original space. The resulting composite operation is the desired rotation, but in the flipped space.

Conceptually, it's similiar to what you'd do to rotate around a specified pivot point: you'd translate the pivot to the origin, then do the rotation, then undo the translation to return the pivot to its original location. In general you'd have a formula like inverse(matPivot) * matRotate * matPivot. However, in the case of your flip, flipMat is its own inverse, so the inverse() call is unnecessary. (By the way, a transform that is its own inverse is called an involution.)

\$\endgroup\$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .