View Full Version : Chase Camera Code

29-07-2005, 01:54 PM
Hi Everyone

I have a little question (as always :wink: ).

I'm trying to implement a chase camera (a very basic one). I figured out the best way was to translate back a bit from the origin and render my model, that was the easy part.

The hard part is figuring out how to rotate the world in such a way that it looks right. I'm using ODE so I get the Position and Rotation of my "object" using

ShipPos := dBodyGetPosition(Ship.Body);
ShipRot := dBodyGetRotation(Ship.Body);

Where ShipPos is a vector 3 and ShipRot is a 4x4 matrix.

My problem is I want to positon my camera using gluLookAt, so I need to calcuate the View and Up vectors from the information I get from ODE.

At this point my brain went to a walk. :wink: . Anyone have any suggestion on where to start?



29-07-2005, 02:26 PM
View is the third row and up is second row, or if ODE matrices are mathematically correct, then that would be columns instead of rows.

29-07-2005, 03:38 PM
I'll give that a go

Thanks :D

29-07-2005, 04:55 PM
That worked a treat. :D

BTW the ODE matrix seems to be in columns not rows.

29-07-2005, 08:10 PM
That worked a treat. :D
Ah... another proud PGD member... HELPED! :D

29-07-2005, 09:27 PM
ODE using righthanded matrices?!? weird.. :?

30-07-2005, 07:51 AM
OK, after a bit more testing it kinda worked, but not fully (rolling works OK, but pitching up or down just looked weird).

So my comment about the matirx being in columns might not be right, I'll do a bit more testing a let you all know. :D

30-07-2005, 08:26 AM
Since here camera is of the same orientation as the object this only works if camera is always directly behind the object (cameraPos = ObjectPos ?_" something * objectView)
Edit: maybe you?_Tre not giving gluLookAt what it wants: Center = CamraPos + ObjectView. Can't seem to come up with a proper way to compute Up with any camera position at the moment, I'll try to do this later

30-07-2005, 02:54 PM
Hi guys

I thought I'd post some more code.

There is what I'm doing.

Firstly I render the world after setting the camera to the position of the object and using the values from the ShipRot matrix to set the view and up vectors

Then I render the actual object from behind.

ShipPos := dBodyGetPosition(Ship.Body); // get position of ODE body
ShipRot := dBodyGetRotation(Ship.Body); // get rotation of ODE body
// set the camera
UserCam.PositionCamera(ShipPos[0], ShipPos[1], ShipPos[2],
// call gluLookAt
// render world
// set teh camerato be behind the object
// call gluLookAt
// render player object

This works for rolling left and right, but not for pitching up or down.

30-07-2005, 03:12 PM
if PositionCamera uses data directlly for gluLookAt, then like I said it sould be
UserCam.PositionCamera(ShipPos[0], ShipPos[1], ShipPos[2],
ShipPos[0] + ShipRot[8], ShipPos[1] + ShipRot[9], ShipPos[2] +ShipRot[10],

And for any camera position
CamView = ObjectPos - CamPos;
CamRight = CrossProduct((0,1,0), CamView);
CamTop = CrossProduct(CamRight, CamView);

30-07-2005, 07:30 PM
That worked :D

Thanks for the input everyone :D

While we're here anyone know a good simple intro into Matrix math. :?:

30-07-2005, 07:58 PM
http://www.sjbaker.org/steve/omniv/matrices_can_be_your_friends.html a pretty good article to get you started

31-07-2005, 04:02 PM

this site is very good! i've got most of my math procedures from here

31-07-2005, 04:12 PM
After a bit more playing it turns out the ODE matries are not liin rows, but in columns.

elements 2,6 and 10 are for view, 1,5,9 are up vectors.

If you are wondering what I'm working on here is a sneek preview.



31-07-2005, 07:31 PM
Very 8) . Look forward to seeing more.