Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DirectX. Продвинутая Анимация (2004) [rus].pdf
Скачиваний:
335
Добавлен:
16.08.2013
Размер:
8.39 Mб
Скачать

Созданиекукольнойанимации

&BState->m_vecAngularMomentum, &BState->m_matInvWorldInertiaTensor);

}

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

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

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

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

вкомбинированную матрицу преобразования фрейма.

Единственной проблемой является то, что кость ориентируется и перемещается относительно координат центра тела, а не относительно координат точки соединения, как определено вектором 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;

Соседние файлы в предмете Программирование на C++