[ODE] How to use the rotation matrix returned by dGeomGetRotation

Duncan Frostick duncanf at f2s.com
Sun Oct 10 18:50:58 MST 2004


Cheers for the reply Jon,

I gave that a go but the problem with it is that it leaves the end of 
the matrix untouched. I'd rather not type it all out to illustrate so 
here's a debugger screenie of what the matrix looks like after that code 
has executed (the position of the geom was 0,0,0 anyway, the code 
inserted 0,0,0 into indices 0, 1 and 2 which deleted a 1.875 in index 
1): http://www.duncanf.co.uk/~dunc/project/matrix.png

As a bit of a stab in the dark I tried constructing a matrix like this. 
Here's a link the the definition of the D3DXMATRIX struct so you don't 
have to search for it: 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/reference/d3dx/structures/d3dxmatrix.asp

D3DXMATRIX compositeTransform;

dReal const * rot = dGeomGetRotation( meshGeomID );
dReal const * pos = dGeomGetPosition( meshGeomID );

compositeTransform._11 = rot[0];
compositeTransform._12 = rot[1];
compositeTransform._13 = rot[2];
compositeTransform._14 = pos[0];
compositeTransform._21 = rot[4];
compositeTransform._22 = rot[5];
compositeTransform._23 = rot[6];
compositeTransform._24 = pos[1];
compositeTransform._31 = rot[7];
compositeTransform._32 = rot[8];
compositeTransform._33 = rot[9];
compositeTransform._34 = pos[2];
compositeTransform._41 = 0;
compositeTransform._42 = 0;
compositeTransform._43 = 0;
compositeTransform._44 = 1;

But that fails miserably too, any chance you could describe the steps 
needed to construct the correct matrix in a bit more detail? Also, does 
it have anything to do with me using dGeomGetRotation as opposed to 
dBodyGetRotation? I can't give the geom a body with mass because I don't 
understand how to setup a dMass object properly yet (though that's 
another thing so don't worry about that!).

Cheers, Duncan


Jon Watte wrote:
> I think the ODE Wiki FAQ is wrong on matrix conversion. 
> You do not need to invert or transpose matrices for use 
> with ODE. If you feed ODE left-handed coordinates and 
> matrices and forces, it will happily hand you back the 
> same; the only difference to be aware of is winding order 
> in trimesh triangle list data.
> 
> The rotation matrices returned by ODE consist of three 
> rows of 4 elements, where the 4th element of each row is 
> un-used. This is assuming row-major ordering, and putting 
> vertices as row vectors on the left of the matrix. This 
> is, in turn, equivalent to putting column vertices on the 
> right of a column-major matrix, so you can view it that 
> way too :-)
> 
> It's been a while since I did ODE/DirectX integration (I'm 
> back to good-old OpenGL), but IIRC: To get a matrix ready 
> for D3D OR OpenGL (same code!), all you have to do is:
> 
>   float matrix[16];
>   dReal const * R = dBodyGetRotation( myBody );
>   memcpy( matrix, R, sizeof(float)*12 );
>   dReal const * P = dBodyGetPosition( myBody );
>   memcpy( matrix, P, sizeof(float)*3 );
>   matrix[15] = 1;
>   m_p3dd_d3dDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)matrix);
> 
> This assumes you're feeding ODE left-handed data just like 
> you'd feed DirectX.


More information about the ODE mailing list