Если вы просматривали примеры DirectX SDK, вы, наверное, встречали небольшую демонстрационную программу SkinnedMesh, которая иллюстрирует использование хранимой в .X файле заранее вычисленной анимации, основанной на ключевых кадрах, для анимирования персонажа. Проблемой является то, что исходный код примера так замысловат и труден для понимания, что у вас голова пойдет кругом. Пример анимирования скелетного меша остается загадкой из-за практически полного отсутствия документации об использовании данных анимации .X файлов.
В главе 4 вы узнали, как работать с мешами, основанными на скелете, так называемыми скелетными мешами, которые связаны с соответствующей иерархией костей (скелетной структурой). Вершины скелетного меша присоединяются к костям и двигаются вместе с ними. Обычно анимирование достигается постепенным наложением набора преобразований на иерархию костей, в результате которых вершины повторяют их движения.
Последовательность таких анимационных преобразований называется ключевым кадром. Ключевые кадры используются для определения необходимого преобразования и времени его использования в анимационной последовательности. Где же взять эти преобразования, необходимые для движения костей? Хотя в вашем распоряжении и имеется множество форматов файлов, но чтобы придерживаться пути DirectX, сосредоточимся на использовании .X файлов.
Если вы посмотрите на .X файл демонстрационной программы SkinnedMesh (Tiny.x) из DirectX SDK, вы заметите, что наряду с обычными шаблонами Frame и Mesh используется шаблон AnimationSet и определенное количество встроенных объектов Animation и AnimationKey. Из этих объектов вы и получаете преобразования, используемые для анимирования иерархии костей скелетного меша. Посмотрите на некоторые из этих объектов анимации, расположенных в .X файле, чтобы понять о чем я говорю.
AnimationSet Walk { Animation { {Bip01}
AnimationKey { 4; 3;
0; 16; 1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000;;, 1000; 16; 1.00000, 0.00000, 0.00000, 0.00000,
0.00000, 1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000;;, 2000; 16; 1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000;;;
}
}
Animation {
{Bip01_LeftArm} AnimationKey {
0;
1;
0; 4; 1.00000, 0.000000, 0.00000, 0.000000;;;
}
AnimationKey {
1; 1;
0; 4; 1.000000, 1.00000, 1.000000;;;
}
AnimationKey { 2;
1;
0; 3; 0.000000, 0.00000, 0.000000;;;
}
}
}
Вы смотрите на простую анимацию двух костей. Каждая анимация определяется в объекте данных AnimationSet; в предыдущем примере у анимации было имя Walk. Два объекта Animation содержат разнообразные ключи анимации, для каждой кости встроенные в объект AnimationSet. Ключи?! О чем это я говорю? Хорошо, мой друг, позвольте мне объяснить концепцию использования ключей при анимации.
⇐Визуализация скелетных мешей || Оглавление || Использование ключей при анимации⇒