Quaternion rotations

Started by
0 comments, last by DXnut 18 years, 1 month ago
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.
--------------------------Most of what I know came from Frank D. Luna's DirectX books
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;}
--------------------------Most of what I know came from Frank D. Luna's DirectX books

This topic is closed to new replies.

Advertisement