Для любой прикладываемой силы (решайте сами, какие использовать) вы должны учитывать силу тяжести и амортизации. В классе cRagdoll я определил функцию, которая находит векторы силы и момента одной кости, после чего применяет к ней силы тяжести и амортизации.
void cRagdoll::SetForces(DWORD BoneNum, D3DXVECTOR3 *vecGravity, float LinearDamping,
float AngularDamping)
{
// Получить указатель на кость cRagdollBone *Bone = &m_Bones[BoneNum] ;
// Получить указатель на текущее состояние cRagdollBoneState *BCState = &Bone->m_State;
// Установить гравитацию и очистить момент Bone->m_vecForce = ((*vecGravity) * Bone->m_Mass); Bone->m_vecTorque = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
/ / Наложить амортизацию на силу и момент Bone->m_vecForce += (BCState->m_vecLinearVelocity * \
LinearDamping); Bone->m_vecTorque += (BCState->m_vecAngularVelocity * \ AngularDamping) ;
}
Вы читали о силах тяжести и амортизации ранее в этой главе, поэтому мне не надо объяснять их опять. Вы заметите, что я масштабирую вектор силы тяжести на массу кости. Помните, что это необходимо для того, чтобы гравитация притягивала все объекты с одинаковой силой, когда вы потом масштабируете силы в соответствии с массой.
После того как вы установили силы, вы можете находить (интегрировать) движение заданной кости.
⇐Вычисление ограничивающего параллелепипеда кости || Оглавление || Объединение костей⇒