[ODE] movement force conversion

SJS ode at pulsecode.net
Sun Apr 10 13:37:36 MST 2005


> Now for some reasons I'm setting forces/torques manualy. With forces
> it works idealy all translations given from animation works, but when
> I try with rotations then comes troubles: everything works to fast and
> output rotation looks strange.
>
> I'm calculating torques like this:
>
> old_angle = get_euler_angles (old_transform);
> new_angle = get_euler_angles (new_trandform);
> new_ang_vel = (new_angle - old_angle) / delta_time;
>
> old_ang_vel = body->get_angle_vel ();
>
> torque = Inertia * (new_ang_vel - old_ang_vel) / delta_time;
>
> any help?
>
>  Piotr Obrzut

Using Euler angles like that won't get you the correct angular velocity (are
you just subtracting them in your code, as you are in your pseudo code in
your posting?)

You need to get a "delta quaternion"-- qdelta = (q0^-1 * q1), where 'q0' is
the original quaternion, and 'q1' is your desired quaternion.  Convert
qdelta to axis-angle, multiply the axis by (angle/timestep) to get the
angular velocity that you use above.
i.e.
qdelta = (q0^-1 * q1)
qdelta -> to axis angle (axis, angle)
new_ang_vel = axis * (angle / dt)

Also, if your quaternions are already normalized (which they probably are),
the inverse is just the conjugate (reverse the signs of the x, y, and z
components).  Conjugate ~q0 is cheaper than inverse q0^-1.

SJS



More information about the ODE mailing list