[ODE] how to count angular velocity...
Piotr Obrzut
piotr_obrzut at o2.pl
Wed Nov 22 16:00:53 MST 2006
hi,
> i forgot to add, that I'm setting my symulation to initial configuration
> from motion capture data. So I need to compute by my self angular
> velocity.
here is how I did the forces and torques for translating the animation
into physics system:
csMatrix3 mat = get_rot_matrix (pose[track_number].getRotation ());
CalVector calv = pose[track_number].getTranslation ();
csVector3 csv (calv[0], calv[1], calv[2]);
csReversibleTransform local_trans (mat, csv);
//old values
csVector3 old_lin_vel = bodies[i]->GetLinearVelocity ();
csVector3 old_ang_vel = bodies[i]->GetAngularVelocity ();
csReversibleTransform old_trans = bodies[i]->GetTransform ();
int p_id = bones[i]->getCoreBone ()->getParentId ();
//new values
csReversibleTransform new_trans = (p_id != -1)? local_trans * bodies[p_id]->GetTransform () :
(local_trans / root_bone) * root_from_movable;
csReversibleTransform t_rel = new_trans / old_trans;
csVector3 new_lin_vel = (new_trans.GetOrigin () - old_trans.GetOrigin ()) / delta_time;
csQuaternion q_n (t_rel.GetO2T ());
csVector3 delta_ang;
q_n.GetEulerAngles (delta_ang);
//change euler angles into radians
delta_ang[0] = (delta_ang[0] / 180) * PI;
delta_ang[1] = (delta_ang[1] / 180) * PI;
delta_ang[2] = (delta_ang[2] / 180) * PI;
csVector3 new_ang_vel = delta_ang / delta_time;
csVector3 new_force = (new_lin_vel - old_lin_vel) * bodies[i]->GetMass () / delta_time;
csVector3 new_torque = (bodies[i]->GetInertia () * (new_ang_vel - old_ang_vel) ) / delta_time;
new_torque *= anim_input[i];
new_force *= anim_input[i];
bodies[i]->AddForce (new_force);
bodies[i]->AddTorque (new_torque);
it was working good to have given bodies in right positions and
rotations in t+1 (though there was problem with making the motion
look exact between t and t+1...)
--
greetings,
Piotr Obrzut
More information about the ODE
mailing list