void RagdollApplyAnimationAsVelocity( ragdoll_t &ragdoll, const matrix3x4_t *pPrevBones, const matrix3x4_t *pCurrentBones, float dt ) { for ( int i = 0; i < ragdoll.listCount; i++ ) { Vector velocity; AngularImpulse angVel; int boneIndex = ragdoll.boneIndex[i]; CalcBoneDerivatives( velocity, angVel, pPrevBones[boneIndex], pCurrentBones[boneIndex], dt ); AngularImpulse localAngVelocity; // Angular velocity is always applied in local space in vphysics ragdoll.list[i].pObject->WorldToLocalVector( &localAngVelocity, angVel ); ragdoll.list[i].pObject->AddVelocity( &velocity, &localAngVelocity ); } }
void RagdollApplyAnimationAsVelocity( ragdoll_t &ragdoll, matrix3x4_t *pPrevBones, matrix3x4_t *pCurrentBones, float dt ) { for ( int i = 0; i < ragdoll.listCount; i++ ) { Vector velocity; AngularImpulse angVel; int boneIndex = ragdoll.boneIndex[i]; CalcBoneDerivatives( velocity, angVel, pPrevBones[boneIndex], pCurrentBones[boneIndex], dt ); Vector localVelocity; AngularImpulse localAngVelocity; // move these derivatives into the local bone space of the "current" bone VectorIRotate( velocity, pCurrentBones[boneIndex], localVelocity ); VectorIRotate( angVel, pCurrentBones[boneIndex], localAngVelocity ); // move those bone-local coords back to world space using the ragdoll transform ragdoll.list[i].pObject->LocalToWorldVector( velocity, localVelocity ); ragdoll.list[i].pObject->LocalToWorldVector( angVel, localAngVelocity ); ragdoll.list[i].pObject->AddVelocity( &velocity, &angVel ); } }