A Simple Third-Person Camera Using The Polar Coordinate System
Note: Before reading this article you should understand first-person movement, the kind seen in games like Quake. If you are unfamiliar with what I am talking about, click here to learn from NeHe tutorial #10 on loading and moving through a 3-D world. You only need to know the moving through the 3-D world part.
The third-person camera is used in video games such as Super Mario 64 or Max Payne. When I was trying to figure out how to calculate the cameraís position, I remembered back to earlier this year in pre-calculus, when my math teacher described an alternative coordinate system known as the polar coordinate system. It works by specifying the distance from the origin or pole, or r, and the angle between the polar axis and the ray that contains the described point, q. Here is an example of a polar graph. The graph is in radians. In the case that you forgot p radians = 180 degrees. The rays coming out of the pole in the middle are different angles. The circles represent the different distances from the pole.
Now think about a third-person camera.
Polar graphs happen to perfectly represent where your camera should be. Now that you have realized this, there are four things that you will need to determine:
Variable number one you decide. It really should just be any number greater than zero. However I am certainly not stopping you from experimentation.
These next two formulas will calculate variable two, the cameraís position. To convert from polar to rectangular coordinates (x, y) you use the incredibly convenient formulas:
I could probably explain why this works, but for our purposes it is really not important. If you wish to know look here. These converted to rectangular coordinates, but we are using 3-D coordinates, so we switch y with z.
Hereís some code that calculates the cameraís position:
float camerax = cameradist * cos((yrot + 270.0f) * M_PI / 180) + xpos; float cameraz = cameradist * sin((yrot - 270.0f) * M_PI / 180) + zpos;
There are a few things to note about that code.
Mathematically when you add 270 degrees to an angle using the cosine function, you are using sine. And when you subtract 270 degrees from an angle using the sine function, you are using cosine. If you donít understand this shortcut, either look at the code below or donít worry about it because itís unimportant.
(Shortcut)float camerax = cameradist * sin((yrot) * M_PI / 180) + xpos; float cameraz = cameradist * cos((yrot) * M_PI / 180) + zpos;
Variable three, in our case, is easy. We are always going to be looking at the subjectís rear, so the cameraís yaw rotation will be equal to the subjectís yaw rotation.
Variable four was already explained because of how important it was. Now on to drawing using this camera whose position and rotation you just figured out. This section is OpenGL specific.
Assume that you declared DrawObject() and DrawScenery(). Also assume you defined cameradist, and calculated yaw, camerax, and cameraz.
// First I like to draw the subject. Basically you are just drawing the subject directly in front of you glTranslatef(0.0f, 0.0f, -cameradist); DrawObject(); //You reset the view and now any scenery or world that you want to draw is drawn. glLoadIdentity(); glRotatef(360.0f - yaw, 0.0f, 1.0f, 0.0f); glTranslatef(-camerax, 0.0f, -cameraz); DrawScenery();
I think that you now have an idea of how to use polar coordinates. If you have any specific questions please post them to the thread linked at the bottom of this page. For more information on the polar coordinate system check out the resources below. Good luck!