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

Глава 5

Использование скелетной анимации, основанной на ключевых кадрах

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

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

Вэтой главе вы научитесь:

Работать с ключевыми кадрами анимации;

Загружать данные анимации их .X файлов;

Использовать наборы скелетной анимации;

Преобразовывать файлы .MS3D в .X.

150 Глава5

Использование наборов скелетных анимаций, основанных на ключевых кадрах

Если вы просматривали примеры 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,

Использование скелетной анимации, основанной на ключевыхкадрах

151

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. Ключи?! О чем это я говорю? Хорошо, мой друг, позвольте мне объяснить концепцию использования ключей при анимации.

Использование ключей при анимации

Ключ (сокращение от анимационный ключ) это временной маркер, который показывает изменение положения и/или ориентации кости. Анимация, использующая ключи, называется анимацией на основе ключевых кадров. Существуют весомые причины использования ключей, при этом одной из главных является экономия памяти.

Вы видите, что анимация является последовательностью движений (в данном случае движений костей) за установленный промежуток времени. Во время анимации изменяется иерархия костей для передачи движения анимации. Сохранение расположения и ориентации костей для каждой миллисекунды анимации является невозмож-

152

Глава 5

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

Ключевой

Ключевой

Ключевой

кадр

кадр

кадр

Рис. 5.1. Анимация костей во времени; ключевые отметки описывают каждое движение

Кости, которые на рис. 5.1 образуют руку, в начале анимации расположены на одной линии. Со временем кости изгибаются в воображаемом локте, затем фиксируются, а потом изгибаются на другой угол. Таким образом, в ориентации костей можно выделить три основных изменения: прямое положение (начальное положение), небольшой изгиб и большой изгиб в сочленении. Эти три изменения являются ключами в анимации.

Теперь, вместо того чтобы хранить ориентацию костей каждую миллисекунду, сохраним эти три ключа и точное время (в миллисекундах) достижения костями соответствующих ориентации. Для этого примера положим время начала анимации руки равное 0 миллисекунд, первый ключ (полу-изогнутая рука) в 500 миллисекунд, и последний ключ (полностью изогнутая рука) в 1200 миллисекунд.

Вот где удобно использовать ключевые кадры. Предположим, вы хотите вычислить ориентацию костей в заданное время... скажем в 648 миллисекунд. Это время как раз попадает между вторым и третьим ключами (148 миллисекунд после второго ключа). Далее положим, что для ориентирования каждой кости в анимации используется две матрицы.

D3DXMATRIX matKey1, matKey2;

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