После того, как вы нашли все силы и обработали столкновения, осталось выполнить последний шаг перед обновлением иерархии фреймов и визуализацией меша кукольного персонажа. Вы должны решить соединения костей.
Вспомните, в разделе "Соединение твердых тел с помощью пружин" вы научились создавать пружины между костями и использовать их для вычисления вектора силы, который немедленно перемещает и вращает тело в корректное положение. Это как раз и выполняет функция ProcessConnections - использует координаты преобразованной точки, представляющей смещение соединения (смещение от центра кости до точки ее присоединения к родителю) и координаты присоединения к родителю (хранящиеся в другой точке) для создания пружины.
void cRagdoll::ProcessConnections(DWORD BoneNum) {
// Получить указатель на кость и родительскую кость cRagdollBone *Bone = &m_Bones[BoneNum]; cRagdollBone *ParentBone = Bone->m_ParentBone;
// Если родительской кости нет, то не продолжать if(!ParentBone) return;
// Получить указатель на состояние кости cRagdollBoneState *BState = &Bone->m_State;
// Получить указатель на родительское состояние cRagdollBoneState *PState = &ParentBone->m_State;
// Получить положение соединения и вектор к центру D3DXVECTOR3 vecBonePos = BState->m_vecPoints[8]; D3DXVECTOR3 vecBtoC = BState->m_vecPosition - vecBonePos;
// Получить координаты присоединения к родителю D3DXVECTOR3 vecParentPos = BState->m_vecPoints[9];
// Вычислить вектор пружины из точки к родительской точке D3DXVECTOR3 vecSpring = vecBonePos - vecParentPos;
// Переместить точку в соответствии с родительской и // скорректировать угловую скорость и момент BState->m_vecPosition -= vecSpring;
BState->m_vecAngularMomentum -= CrossProduct(&vecBtoC, \ &vecSpring); BState->m_vecAngularVelocity = Transform( \
&BState->m_vecAngularMomentum, &BState->m_matInvWorldInertiaTensor);
}
Я знаю, что я излагаю все быстро, но я уже объяснял этот код ранее; я просто хотел повторить основные моменты. Следующая и последняя функция, которую я вам хочу показать, перестраивает иерархию фреймов, позволяя вам обновить скелетный меш.
⇐Обработка столкновений || Оглавление || Перестроение иерархии⇒