[ODE] Rotation about Z-axis clockwise ?
thomas.miconi@free.fr
thomas.miconi at free.fr
Wed Aug 27 07:04:02 2003
Quoting Antonio Tejada Lacaci <wildfred@teleline.es>:
> On Tue, 26 Aug 2003 17:31:33 +0200, thomas.miconi@free.fr wrote:
> >According to the Rule Thumb, this seems to correspond to an indirect
> rotation
> >about the z-axis (i.e. clockwise rotation if the z-axis points to you).
>
> If you are in a "right-handed coordinate system", i.e. a system which
> holds the right-hand rule, rotating when the axis points towards you
> (out of the computer screen) is counterclockwise, not clockwise.
(0.707107, -0.707107, 0.000000) (0.707107, 0.707107, 0.000000) (0.000000,
0.000000, 1.000000)
I agree wholeheartedly. This is exactly what I wrote (direct -> counterclock,
indirect -> clock). And it seems to me that ODE does exactly the contrary !
This seems highly improbable however, because somebody would probably have
seen it already. So I just can't find the problem.
Below is a minimum piece of code that shows the problem with quaternions. One
can just copy/paste it and compile with "gcc -Wall -I../../include
./Program.cpp ../../lib/libode.a -lm" (possibly changing the directories, of
course).
A much simpler way to see it is simply to call dRFromAxisAndAngle(mymatrix,
0, 0, 1, pi/4), and to have a look at the resulting matrix: It looks like it's
been rotated *clockwise* (i.e. indirect direction - it gives the same coords
as indicated below).
Please, what am I doing wrong ?
Amicalement,
Thomas
======
#include <ode/ode.h>
#include <drawstuff/drawstuff.h>
#include <stdlib.h>
#define MyPi 3.14159265
int main (int argc, char **argv)
{
dWorldID world;
dBodyID limb1;
dReal * tmpmat;
dQuaternion q;
world = dWorldCreate();
limb1 = dBodyCreate (world);
tmpmat = (double *) dBodyGetRotation (limb1);
printf(" (%f, %f, %f) (%f, %f, %f) (%f, %f, %f) \n",
tmpmat[0], tmpmat[1], tmpmat[2],
tmpmat[4], tmpmat[5], tmpmat[6],
tmpmat[8], tmpmat[9], tmpmat[10]);
// This prints the standard expected coords (100)(010)(001)
// Now, rotating Pi/4 around the Z axis...
// Expecting normal, direct, counterclockwise rotation
dQFromAxisAndAngle(q, 0, 0, 1, MyPi / 4.0);
dBodySetQuaternion (limb1, q);
tmpmat = (double *) dBodyGetRotation (limb1);
printf("\n (%f, %f, %f) (%f, %f, %f) (%f, %f, %f) \n",
tmpmat[0], tmpmat[1], tmpmat[2],
tmpmat[4], tmpmat[5], tmpmat[6],
tmpmat[8], tmpmat[9], tmpmat[10]);
// Resulting coords:
// (0.707107, -0.707107, 0.000000)
// (0.707107, 0.707107, 0.000000)
// (0.000000, 0.000000, 1.000000)
// This looks like an indirect rotation !
dWorldDestroy (world);
return 0;
}