void CPhysicsObject::CalculateVelocityOffset( const Vector &forceVector, const Vector &worldPosition, Vector ¢erVelocity, AngularImpulse ¢erAngularVelocity ) { IVP_U_Point pos; IVP_U_Float_Point force; ConvertForceImpulseToIVP( forceVector, force ); ConvertPositionToIVP( worldPosition, pos ); IVP_Core *core = m_pObject->get_core(); const IVP_U_Matrix *m_world_f_core = core->get_m_world_f_core_PSI(); IVP_U_Float_Point point_d_ws; point_d_ws.subtract(&pos, m_world_f_core->get_position()); IVP_U_Float_Point cross_point_dir; cross_point_dir.calc_cross_product( &point_d_ws, &force); m_world_f_core->inline_vimult3( &cross_point_dir, &cross_point_dir); cross_point_dir.set_pairwise_mult( &cross_point_dir, core->get_inv_rot_inertia()); ConvertAngularImpulseToHL( cross_point_dir, centerAngularVelocity ); force.set_multiple( &force, core->get_inv_mass() ); ConvertForceImpulseToHL( force, centerVelocity ); }
// Apply force impulse (momentum) to the object void CPhysicsObject::ApplyForceCenter( const Vector &forceVector ) { // Assert(IsMoveable()); if ( !IsMoveable() ) return; IVP_U_Float_Point tmp; ConvertForceImpulseToIVP( forceVector, tmp ); IVP_Core *core = m_pObject->get_core(); tmp.mult( core->get_inv_mass() ); tmp.k[0] = clamp( tmp.k[0], -MAX_SPEED, MAX_SPEED ); tmp.k[1] = clamp( tmp.k[1], -MAX_SPEED, MAX_SPEED ); tmp.k[2] = clamp( tmp.k[2], -MAX_SPEED, MAX_SPEED ); m_pObject->async_add_speed_object_ws( &tmp ); }