• Create Account

## Rotation around maintained arbitrary axis.

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

3 replies to this topic

### #1Zerocyde  Members

116
Like
0Likes
Like

Posted 17 May 2012 - 12:15 PM

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.

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.

### #2mhagain  Members

12439
Like
0Likes
Like

Posted 17 May 2012 - 05:57 PM

The D3DXMatrixRotationYawPitchRoll function might be closer to your requirements here.

It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.

142
Like
0Likes
Like

Posted 17 May 2012 - 08:25 PM

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?

Why not just apply a cumulative rotation on every frame? (i.e., at the beginning of the game, the player has rotated 0 degrees about the Y axis. At some point, the player rotates 3 degrees on the Y axis. You need to save that state in some variable that persists throughout the game. Later, the player rotates another 2 degrees around the Y axis. Since you are keeping track of the rotation state, you can apply a rotation of the cumulative 5 degrees, rather than just 2 degrees).

### #4Zerocyde  Members

116
Like
0Likes
Like

Posted 17 May 2012 - 10:25 PM

I found a solution. This is what ended up working for me:

D3DXMATRIX yawMatrix, pitchMatrix, rollMatrix, combined;

// rotate around your 3 maintained axis
D3DXMatrixRotationAxis(&yawMatrix, &up, yaw);
D3DXMatrixRotationAxis(&pitchMatrix, &right, pitch);
D3DXMatrixRotationAxis(&rollMatrix, &look, roll);

// combined them into one rotation matrix
D3DXMatrixMultiply(&combined, &yawMatrix, &pitchMatrix);
D3DXMatrixMultiply(&combined, &rollMatrix, &combined);

// rotate 2 of the axis by the combined rotation matrix and build the third using cross product
D3DXVec3TransformCoord(&right, &right, &combined);
D3DXVec3TransformCoord(&up, &up, &combined);
D3DXVec3Cross(&look, &right, &up);

// normalize all 3 axis
D3DXVec3Normalize(&right, &right);
D3DXVec3Normalize(&up, &up);
D3DXVec3Normalize(&look, &look);

// build the final matrix like this
rotMatrix = D3DXMATRIX
(
right.x, right.y, right.z, 0.0f,
up.x, up.y, up.z, 0.0f,
look.x, look.y, look.z, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);


Edited by Zerocyde, 17 May 2012 - 10:28 PM.

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.