[ODE] Mapping to OpenGL axis system

Ruud van Gaal ruud at marketgraph.nl
Tue Nov 20 13:13:01 MST 2001


Hi Russel and the group,

I'm trying to create an ODE version of my racesim, and due to my lack of 
insight on matrices, I run into some trouble with coordinate systems. My sim 
uses the OpenGL axis system, meaning a right handed Y=up, X=left, Z=out the 
screen. For the cars, this ends up as the Z axis point from the seat of the 
driver towards the front bumper, X left out the door, Y up.
Now I don't know exactly what ODE uses, but it seems like left-handed, with Z 
going up?

After modifying my rigid body class to create an ODE dBody, for painting in 
OpenGL I had to map ODE's axis system to my (OpenGL) axis system. As it turned 
out, inverting the quaternion from ODE worked using myQuat.w=odeQuat.w, 
myQuat.x=-odeQuat.x, myQuat.y=-odeQuat.y and myQuat.z=-odeQuat.z. So I had to 
negate the xyz members. Then I derived my own 3x3 matrix as before ODE, and 
with this matrix the car started painting in the expected orientation again.

However, when applying forces and torques using dBodyAdd[Rel]Force(), I seem to 
have to do an extra mapping. Adding body forces seem ok with dBodyAddRelForce() 
and I can just pass force.x,force.y,force.z (although I'd rather pass a pointer 
to these 3 floats, but that's another story).
Adding torque values are weird though. When using dBodyAddRelTorque() with my 
(OpenGL-based) torque.x/y/z, things go bad quickly. Using world coordinates and 
passing them as body coordinates, I seem to get closer with 
dBodyAddTorque(bodyID,-torque.x,torque.y,-torque.z), but then steering left 
pushes the car around right and vice versa. Adding some negations here & there 
make it graphically correct, but the car is very sensitive to spinning and I 
feel my coordinate system hack just doesn't work.

Does anybody have a good idea about how get the OpenGL and ODE's axis system to 
work together like it should? It seems I must convert from right- to 
lefthanded, but as quaternion rotations are done presumably assuming a 
lefthanded system, my AddForce()/AddTorque() calls go wrong.

Thanks for any ideas, I've spent multiple hours in this already and getting a 
bit nuts and I see a maze of negations coming up, which is definitely NOT good 
(and pretty endless too).
I want to avoid switching all MY stuff to lefthanded, since that would make the 
conversion bigger than it's supposed to be.

Ruud van Gaal




More information about the ODE mailing list