После того, как вы нашли все силы и обработали столкновения, осталось выполнить последний шаг перед обновлением иерархии фреймов и визуализацией меша кукольного персонажа. Вы должны решить соединения костей.

Вспомните, в разделе "Соединение твердых тел с помощью пружин" вы научились создавать пружины между костями и использовать их для вычисления вектора силы, который немедленно перемещает и вращает тело в корректное положение. Это как раз и выполняет функция 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);

}

Я знаю, что я излагаю все быстро, но я уже объяснял этот код ранее; я просто хотел повторить основные моменты. Следующая и последняя функция, которую я вам хочу показать, перестраивает иерархию фреймов, позволяя вам обновить скелетный меш.

Обработка столкновений || Оглавление || Перестроение иерархии