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

Глава 9

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

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

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

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

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

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

Работать с наборами морфируемой анимации;

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

Использование наборов морфируемой анимации

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

262

Глава 9

Ключевой

Ключевой

Ключевой

кадр

кадр

кадр

Рис. 9.1. Морфирующая анимация использует набор исходных и целевых морфируемых мешей, разделенных во времени (при помощи ключей анимации), образующих непрерывную морфируемую анимацию

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

Создание шаблонов .X для морфируемой анимации

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

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

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

2

Следующие два шаблона должны подойти для хранения данных морфируемой анимациив.X:

templateMorphAnimationKey

{

<2746B58A-B375-4cc3-8D23-7D094D3C7C67> DWORD Time; // Время ключа

STRING MeshName; // Используемый меш (имя экземпляра)

}

templateMorphAnimationSet

{

<0892DE81-915A-4f34-B503-F7C397CB9E06> DWORD NumKeys; // # ключей в анимации array MorphAnimationKey Keys[NumKeys];

}

Конечно же, каждому шаблону необходимо соответствующее объявление GUID в исходном коде, так что добавьте следующий код в начало основного исходного файла (или куда сочтете нужным):

// {2746B58A-B375-4cc3-8D23-7D094D3C7C67} DEFINE_GUID(MorphAnimationKey,

0х2746b58а, 0хЬ375, 0х4сс3, 0x8d, 0x23, 0x7d, 0x9, 0x4d, 0х3с, 0х7с, 0x67);

{0892DE81-915A-4f34-B503-F7C397CB9E06} DEFINE_GUID(MorphAnimationSet,

0x892de81, 0x915a, 0x4f34, 0xb5, 0x3, 0xf7, 0хс3, 0x97, 0xcb, 0x9e, 0x6);

Комментарии в каждом из двух шаблонов говорят сами за себя, но давайте рассмотрим их подробнее. В MorphAnimationKey определены две переменные - Time, содержащая значение времени в анимации (время ключа, обычно задаваемое в миллисекундах), и MeshName, типа STRING, которая содержит имя меша, используемого приморфинге.

Замечание. Вы заметите, что шаблон MorphAnimationKey определяет имя меша как тип STRING, а не ссылку на шаблон. Это означает, что вам необходимо сопоставить имя меша с ключом анимации после загрузки ключей морфирующей анимации.

Что же касается шаблона MorphAnimationSet, он содержит всего две переменные. Первая их них, NumKeys, является количеством объектов MorphAnimationKeys, содержащихся в анимации. Вторая переменная, Keys, является массивом, содержащим данные каждого объекта MorphAnimationKey, используемого в анимации.

264

Глава 9

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

Mesh MyMesh1 {

// Здесь располагаются данные меша

}

Mesh MyMesh2 {

// Здесь располагаются данные меша

}

Mesh MyMesh3 {

// Здесь располагаются данные меша

}

Для упрощения я не стал приводить данные заданных мешей, а просто показал вам как создавать объекты Mesh для дальнейшего использования. Эти три объекта Mesh называются MyMesh1, MyMesh2, MyMesh3. Для данных анимации я хочу определить две анимации, названные MyAnimation1 и MyAnimation2.

MorphAnimationSet MyAnimation1

{

2;

0; "MyMesh1";, 500; "MyMesh2";,

}

MorphAnimationSet MyAnimation2

{

4;

0; "MyMesh1";, 500; "MyMesh2";, 1000; "MyMesh3";, 1500; "MyMesh2";; }8,8

Первая анимация, MyAnimation1, содержит два ключа. Первый ключ расположен в нулевом моменте времени и использует MyMesh1 в качестве исходного меша. Второй ключ, расположенный во время 500, использует MyMesh2 в качестве целевого меша. Таким образом анимация длится 500 временных единиц.

Вторая анимация, MyAnimation2, содержит четыре ключа. Эти ключи, расположенные в 500 единицах измерения времени друг от друга, используют все три меша. Если вы хотите обновить анимацию в момент времени 700, вам необходимо исполь-

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