Basically, to rotate a flying vehicle (spaceship, airplane, whatever) I am using this system that I found for FPS camera control:
up=D3DXVECTOR3(0.0f, 1.0f, 0.0f); look=D3DXVECTOR3(0.0f, 0.0f, 1.0f); right=D3DXVECTOR3(1.0f, 0.0f, 0.0f); D3DXMATRIX yawMatrix; D3DXMatrixRotationAxis(&yawMatrix, &up, yaw); D3DXVec3TransformCoord(&look, &look, &yawMatrix); D3DXVec3TransformCoord(&right, &right, &yawMatrix); D3DXMATRIX pitchMatrix; D3DXMatrixRotationAxis(&pitchMatrix, &right, pitch); D3DXVec3TransformCoord(&look, &look, &pitchMatrix); D3DXVec3TransformCoord(&up, &up, &pitchMatrix); D3DXMATRIX rollMatrix; D3DXMatrixRotationAxis(&rollMatrix, &look, roll); D3DXVec3TransformCoord(&right, &right, &rollMatrix); D3DXVec3TransformCoord(&up, &up, &rollMatrix); rotMatrix = yawMatrix*pitchMatrix*rollMatrix;
And you rotate by adjusting the yaw, pitch, and roll float values. The problem is that this code only seems to rotate around the default axis. For instance, if I make my little ship pitch down (lower the nose to fly downwards) and then wish to "roll" left or right, I want to rotate the ship around the look axis of the ship itself, but with this method it will only rotate around (0, 0, 1).
Basically, what methods can I use to maintain a look, right, and up axis that stay aligned with the object in question and never revert to default so that I can rotate around them at will?
EDIT: Actually, to be more precise, this method will rotate properly around the look axis I want, but only because it does roll last after the look axis is already fully finished by the yaw and pitch rotations. Pitch rotates around a half formed right axis, and yaw rotates around the default (0, 1, 0) up axis.
Edited by Zerocyde, 17 May 2012 - 12:17 PM.