После разрешения модели твердого тела единственное, что вам остается сделать, - это перестроить преобразования фреймов. Т. к. кости твердого тела куклы заданы в мировых координатах, нет необходимости просматривать все кости в иерархии и комбинировать все преобразования с родительским. Обычно все, что необходимо вам сделать, -это скопировать ориентацию кости (из состояния объекта) в комбинированную матрицу преобразования фрейма.

Единственной проблемой является то, что кость ориентируется и перемещается относительно координат центра тела, а не относительно координат точки соединения, как определено вектором vecJointOffset Вам необходимо преобразовать вектор vecJointOffset, используя ориентацию кости, и добавить результирующий вектор к положению кости, что даст вам корректные координаты для расположения кости. Комментарии, приведенные в RebuildHierarchy, должны объяснить все сложные моменты.

void cRagdoll::RebuildHierarchy()

{

if(!m_pFrame) return;

if(!m_NumBones || !m_Bones) return;

// Наложить вращательные матрицы костей на фреймы for(DWORD i=0;i<m_NumBones;i++) {

// Преобразовать смещение соединения в соответствии с положением фрейма

D3DXVECTOR3 vecPos;

D3DXVec3TransformCoord(&vecPos,

&m_Bones[i].m_vecJointOffset, &m_Bones[i].m_State.m_matOrientation);

// Добавить положение кости

vecPos += m_Bones[i].m_State.m_vecPosition;

// Ориентировать и расположить фрейм m_Bones[i].m_Frame->matCombined = m_Bones[i].m_State.m_matOrientation; m_Bones[i].m_Frame->matCombined._41 = vecPos.x; m_Bones[i].m_Frame->matCombined._42 = vecPos.y; m_Bones[i].m_Frame->matCombined._43 = vecPos.z;

}

}

Вот мы и закончили! Все что остается, это найти применение классу кукольной анимации в ваших проектах. Для этого вам просто необходимо создать экземпляр объекта cRagdoll, вызвать функцию Create для создания данных и непрерывно вызывать Resolve и RebuildHierarchy. Демонстрационная программа этой главы показывает, как просто это делается, так что я настоятельно рекомендую посмотреть ее исходный код, прежде чем продолжать.

Посмотрите демонстрационные программы

Как вы можете видеть, системы кукольной анимации являются всего лишь замаскированными моделями твердых тел. Зачем платить тысячи долларов за систему кукольной анимации, если вы видели, как просто создать ее самому? Демонстрационная программа этой главы содержит как раз такую систему кукольной анимации, которую вы можете использовать в ваших проектах.

Эта программа, изображенная на рис. 7.12, берет персонаж и подбрасывает его в воздух. Звучит не очень впечатляюще, так что для большего реализма было добавлено несколько объектов столкновений (сфер), от которых бедный персонаж отскакивает как тряпичная кукла.

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

Программы на компакт-диске

Для главы 7 создан только один проект, но поверьте мне, он замечательный! Вы можете обнаружить его в директории главы 7 компакт диска этой книги:

• Ragdoll. Этот проект иллюстрирует кукольную анимацию, показывая вам что случается, если бросить персонаж через поле плавающих сфер. Он расположен в \BookCode\Chap07\Ragdoll.

Перестроение иерархии

Рис. 7.12. Деревянная кукла встречает ужасную смерть, пролетев по воздуху и отскочив от плавающих сфер

Часть IV

Морфирующая анимация

8. Работа с морфирующей анимацией

9. Использование морфирующей анимации, основанной на ключевых кадрах

10. Комбинирование морфированных анимаций

11. Морфирование лицевой анимации

Глава 8

Восстановление соединений костей || Оглавление || Работа с морфирующей анимацией