Original Post
[color=#000000][font=verdana, geneva, lucida,]I've been racking my brain for days now and can't find the answer. I'm using C++ and DirectX but I figure that this is more of a math problem that can relate to all languages trying to work in 3D.[/font]
[color=#000000][font=verdana, geneva, lucida,]Basically, to rotate a flying vehicle (spaceship, airplane, whatever) I am using this system that I found for FPS camera control:[/font]
[color=#000000][font=verdana, geneva, lucida,]
[color=#000000][font=verdana, geneva, lucida,][background=rgb(251, 251, 251)]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).[/background][/font]
[color=#000000][font=verdana, geneva, lucida,]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?[/font]
[color=#000000][font=verdana, geneva, lucida,]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.[/font]
[color=#000000][font=verdana, geneva, lucida,]Basically, to rotate a flying vehicle (spaceship, airplane, whatever) I am using this system that I found for FPS camera control:[/font]
[color=#000000][font=verdana, geneva, lucida,]
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;
[/font][color=#000000][font=verdana, geneva, lucida,][background=rgb(251, 251, 251)]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).[/background][/font]
[color=#000000][font=verdana, geneva, lucida,]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?[/font]
[color=#000000][font=verdana, geneva, lucida,]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.[/font]