Avoiding Gimbal Lock with Quaternions

Started by
-1 comments, last by Barn Door 21 years, 8 months ago
Hello, Can anybody explain why this code doesn't fix gimbal lock? The principle, I think, is that you maintain a quaternion which holds the current orientation of the object you are trying to spin and then multiply it by a change in orientation before converting to a matrix. (x_rot and z_rot are set in the keyboard handler to a constant and currOrientation is a global quaternion initialized to the identity) Am I close?
    
//initialize matrices

D3DXMatrixIdentity(&rotation);
D3DXMatrixIdentity(&translation);
D3DXMatrixIdentity(&world);

// create quaternion to represent change in orientation

D3DXQUATERNION change;
D3DXQuaternionRotationYawPitchRoll(&change, 0.0f, x_rot, z_rot);

x_rot = z_rot = 0;

//update current orientation

currOrientation*= change;

//change it to a matrix

D3DXMatrixRotationQuaternion(&rotation, &currOrientation);

// add to translation and set

D3DXMatrixTranslation(&translation, 0.0, 0.0f, 5.0);
D3DXMatrixMultiply(&world, &rotation, &translation);

g_d3d_device->SetTransform(D3DTS_WORLD, &world );
     
Thanks, BD. [edited by - Barn Door on July 28, 2002 3:44:48 PM] [edited by - Barn Door on July 28, 2002 3:46:51 PM]

This topic is closed to new replies.

Advertisement