• Advertisement
Sign in to follow this  

Quaternion rotations

This topic is 4328 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, I am trying to use quaternions so I can keep track of the rotation on the XYZ axes. I am doing the same thing I have done with matrices (when I don't need to keep track of the rotation on each axis independently).
//I start by making it the identity:

D3DXQuaternionIdentity(&m_KeyFrame.RotateY.Value);

//Then, as the mouse moves to rotate it on the Y-axis MoveXYZ is a calculation of the mouse movement (it's like 0.06 after a small movement)

D3DXQuaternionRotationAxis(&DQ, &D3DXVECTOR3(0.0f, 1.0f, 0.0f), MoveXYZ.y);
D3DXQuaternionNormalize(&DQ, &DQ);
D3DXQuaternionMultiply(&m_KeyFrame.RotateY.Value, &m_KeyFrame.RotateY.Value, &DQ);
D3DXQuaternionNormalize(&m_KeyFrame.RotateY.Value, &m_KeyFrame.RotateY.Value);

//Then I update the frame's matrix:

D3DXMATRIXA16 R;
D3DXMatrixRotationQuaternion(&R, &DQ);
m_pFrame->TransformationMatrix = R * m_pFrame->TransformationMatrix;
(also tried "*= R" here)

This causes major problems trying to render the basic cylinder mesh I skinned here. It basically destroys the TransformationMatrix, and I end up seeing deranged results in the debugger window for it. I found that if I do this it works (where I saved the TransformationMatrix in a new matrix that doesn't get changed): D3DXMATRIXA16 R; D3DXMatrixRotationQuaternion(&R, &m_KeyFrame.RotateY.Value); m_pFrame->TransformationMatrix = R * m_pFrame->OriginalTrans; However, I can't add on new keyframes after this, since they won't be added on to the changes made previously to the TransformationMatrix. What am I doing wrong??? Thanks.

Share this post


Link to post
Share on other sites
Advertisement
Stupid me. [embarrass] I was calling the routine to update the matrix from one place after processing all 3 possible axis rotations. I moved the call into each one, and it works:

D3DXQUATERNION DQ;
if (MoveXYZ.x != 0.0f)
{
D3DXQuaternionRotationAxis(&DQ, &D3DXVECTOR3(1.0f, 0.0f, 0.0f), MoveXYZ.x);
D3DXQuaternionNormalize(&DQ, &DQ);
D3DXQuaternionMultiply(&m_KeyFrame.RotateX.Value, &m_KeyFrame.RotateX.Value, &DQ);
D3DXQuaternionNormalize(&m_KeyFrame.RotateX.Value, &m_KeyFrame.RotateX.Value);
UpdateFrameRotation(DQ);
}
if (MoveXYZ.y != 0.0f)
{
D3DXQuaternionRotationAxis(&DQ, &D3DXVECTOR3(0.0f, 1.0f, 0.0f), MoveXYZ.y);
D3DXQuaternionNormalize(&DQ, &DQ);
D3DXQuaternionMultiply(&m_KeyFrame.RotateY.Value, &m_KeyFrame.RotateY.Value, &DQ);
D3DXQuaternionNormalize(&m_KeyFrame.RotateY.Value, &m_KeyFrame.RotateY.Value);
UpdateFrameRotation(DQ);
}
if (MoveXYZ.z != 0.0f)
{
D3DXQuaternionRotationAxis(&DQ, &D3DXVECTOR3(0.0f, 0.0f, 1.0f), MoveXYZ.z);
D3DXQuaternionNormalize(&DQ, &DQ);
D3DXQuaternionMultiply(&m_KeyFrame.RotateZ.Value, &m_KeyFrame.RotateZ.Value, &DQ);
D3DXQuaternionNormalize(&m_KeyFrame.RotateZ.Value, &m_KeyFrame.RotateZ.Value);
UpdateFrameRotation(DQ);
}

void AnimationCreateDialogsCTL::UpdateFrameRotation(D3DXQUATERNION& DQ)
{
D3DXMATRIXA16 R;
D3DXMatrixRotationQuaternion(&R, &DQ);
m_pFrame->TransformationMatrix = R * m_pFrame->TransformationMatrix;
}

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement