Inconsistent angular motor API behavior in dAMotorEuler mode

Issue #37 resolved
Stefania Pedrazzi created an issue

It seems that the axis setup in dAMotorEuler mode doesn't take automatically into consideration if the joint bodies have been switched (dJOINT_REVERSE flag set) when computing the global axis: https://bitbucket.org/odedevs/ode/src/4aaba9085576c48d1a6747a9df4aab25c74a8387/ode/src/joints/amotor.cpp?at=default&fileviewer=file-view-default#amotor.cpp-59

Thus to get the correct behavior the rel value passed in the dJointSetAMotorAxis function has to be manually switched, whereas in dAMotorUser mode everything is handled automatically and internally.

normal case (dJOINT_REVERSE flag node set):

dJointSetAMotorAxis(0, 1, a0.x, a0.y, a0.z);
dJointSetAMotorAxis(2, 2, a2.x, a2.y, a2.z);

In dJOINT_REVERSE you have to use:

dJointSetAMotorAxis(0, 2, a0.x, a0.y, a0.z);
dJointSetAMotorAxis(2, 1, a2.x, a2.y, a2.z);

It seems that the computeGlobalAxis function should check if the bodies were switched and automatically adapt the computations. Otherwise if the user has to manually handle the case where the first body is NULL, then there is no advantage in allowing the user to create a joint with the first body NULL and using the dJOINT_REVERSE flag.

Comments (4)

  1. Log in to comment