Answered by:
Orbit camera around a model
Question

Hi,
I'm totally new to DirectX, and am sorry if the problem appears simple.
I have to orbit the camera around a 3D volume. But it has to be done about both the Xaxis as well as the Yaxis. The user can alternate between the two or stick to any one (there are two buttons, OrbitX and OrbitY).
How do I go about doing this?!? The camera eye has to be positioned at it's new place on the imaginary sphere surrounding the model. Also it's Up vector has to be calculated, whereas the LookAt point remains the same. I heard that quaternions help in achieving smooth rotations, but how should it be used?
Any help on this will really be appreciated!
Thanks.
Tuesday, March 27, 2007 11:52 AM
Answers

I feel there might be a simpler way to do this; take the angles that represent the rotation around the Xaxis (pitch), followed by the angles that represent rotation around the Yaxis (yaw).
Take a look at my example; it uses the two angles (cam_pitch and cam_yaw) to show orientation around the model (Vector3 model_coords), and the matrix view for the view matrix.
Code SnippetMatrix pitch_rotation = Matrix.CreateRotationX(MathHelper.ToRadians(cam_pitch));
Matrix yaw_rotation = Matrix.CreateRotationY(MathHelper.ToRadians(cam_yaw));
Vector3 v = Vector3.Backward;
v = Vector3.Transform(v, pitch_rotation);
v = Vector3.Transform(v, yaw_rotation);
view = Matrix.CreateLookAt(model_coords + v, model_coords, Vector3.Up);
Obviously the camera angles are expressed in degrees, and as for the perpendicular Up Vector for the camera, that's really not necessary unless you don't want it upsidedown. If you do, just repeat the 3rd, 4th, and 5th lines, replacing v with up and Vector3.Backward to Vector3.Up.
Basically what happens is we express our location as 2 angles, and we take those angles and turn them into rotation matrices, which are used to transform an initial vector. If both angles are 0, then the camera will be in front of the model, looking behind at the model. The transformed vector is then translated by the model's coordinates so the camera will orbit around the model, not the origin. Finally, we create our lookat matrix using the new camera point and the model's coordinates. This is the same technique that games use for lockon features, as well as for looking around in the game.
Wednesday, April 18, 2007 2:11 AM
All replies

well, when i had to orbit my camera around a stationary object i envisioned a metal ring that the camera just slid around.
i knew how to create a simple 2d circle by calculating points around a center with a given radius....using degrees you can essentially get a pointposition value for 0359 degrees
then you just updated the camera's position X and Z for orbit around the Y axis and
update camera's position Y and Z for X axis orbitWednesday, March 28, 2007 3:12 PM 
Hi DD,
Thanks for your reply!
I can easily calculate the new coordinates for the camera eye, the look at point being the same.
Let's say, that I have computed the new position on the imaginary sphere (by jumping one longitude and latitude unit each). I have only one vector (the line of sight between the camera eye and look at point).
How will I get the look up vector which I want to be perpendicular to the line of sight at all times?
Monday, April 2, 2007 10:39 AM 
I feel there might be a simpler way to do this; take the angles that represent the rotation around the Xaxis (pitch), followed by the angles that represent rotation around the Yaxis (yaw).
Take a look at my example; it uses the two angles (cam_pitch and cam_yaw) to show orientation around the model (Vector3 model_coords), and the matrix view for the view matrix.
Code SnippetMatrix pitch_rotation = Matrix.CreateRotationX(MathHelper.ToRadians(cam_pitch));
Matrix yaw_rotation = Matrix.CreateRotationY(MathHelper.ToRadians(cam_yaw));
Vector3 v = Vector3.Backward;
v = Vector3.Transform(v, pitch_rotation);
v = Vector3.Transform(v, yaw_rotation);
view = Matrix.CreateLookAt(model_coords + v, model_coords, Vector3.Up);
Obviously the camera angles are expressed in degrees, and as for the perpendicular Up Vector for the camera, that's really not necessary unless you don't want it upsidedown. If you do, just repeat the 3rd, 4th, and 5th lines, replacing v with up and Vector3.Backward to Vector3.Up.
Basically what happens is we express our location as 2 angles, and we take those angles and turn them into rotation matrices, which are used to transform an initial vector. If both angles are 0, then the camera will be in front of the model, looking behind at the model. The transformed vector is then translated by the model's coordinates so the camera will orbit around the model, not the origin. Finally, we create our lookat matrix using the new camera point and the model's coordinates. This is the same technique that games use for lockon features, as well as for looking around in the game.
Wednesday, April 18, 2007 2:11 AM 
Sir,
Thank You for the suggestion.
It is working fine while using it with geometry structures.
But when volume texture is being used and the camera is rotated,
the rotation of camera is correct .
The effect which is acheived is correct for the angle in range of 90 to +90.
For the other angles it appears as though the volume rotates in the opposite direction .
Any idea why is it behaving like this.
Thursday, May 3, 2007 4:34 AM