- •Введение
- •Глава 1. Подготовка к изучению книги
- •Установка DirectX SDK
- •Выбор отладочных или рабочих версий библиотек
- •Настройка вашего компилятора
- •Установка директорий DirectX SDK
- •Привязывание к библиотекам DirectX
- •Установка используемого по умолчанию состояния символа
- •Использование вспомогательного кода книги
- •Использование вспомогательных объектов
- •Проверка вспомогательных функций
- •Двигаясь дальше по книге
- •Глава 2. Синхронизация анимации и движения
- •Использование движения, синхронизированного по времени
- •Считывание времени в Windows
- •Анимирование с использованием временных меток
- •Перемещение, синхронизированное со временем
- •Движение вдоль траекторий
- •Создание анализатора маршрутов .X файла
- •Создание внутриигровых кинематографических последовательностей
- •Посмотрите демонстрационные программы
- •TimedAnim
- •TimedMovement
- •Route
- •Cinematic
- •Глава 3. Использование формата файла .X
- •Работа с .X шаблонами и объектами данных
- •Определение шаблонов
- •Работа со стандартными шаблонами DirectX
- •Открытие .X файла
- •Перечисление объектов данных
- •Получение данных объекта
- •Создание класса .X анализатора
- •Загрузка мешей с использованием D3DX
- •Загрузка мешей, используя анализатор .X
- •Загрузка скелетных мешей
- •Загрузка анимации из .X
- •Загрузка специализированных данных из .X
- •Посмотрите демонстрационные программы
- •ParseFrame
- •Глава 4. Работа со скелетной анимацией
- •Начало скелетной анимации
- •Использование структур скелетов и иерархий костей
- •Использование скелетной структуры и скелетного меша
- •Загрузка иерархий из .X
- •Изменение положения костей
- •Обновление иерархии
- •Работа со скелетными мешами
- •Загрузка скелетных мешей из .X
- •Создание контейнера вторичного меша
- •Сопоставление костей фреймам
- •Обновление скелетного меша
- •Визуализация скелетных мешей
- •Глава 5. Использование скелетной анимации, основанной на ключевых кадрах
- •Использование наборов скелетных анимаций, основанных на ключевых кадрах
- •Использование ключей при анимации
- •Работа с четырьмя типами ключей
- •Считывание данных анимации из .X файлов
- •Прикрепление анимации к костям
- •Обновление анимации
- •Посмотрите демонстрационные программы
- •Глава 6. Комбинирование скелетных анимаций
- •Комбинирование скелетных анимаций
- •Соединение преобразований
- •Улучшение объектов скелетной анимации
- •Посмотрите демонстрационные программы
- •Глава 7. Создание кукольной анимации
- •Работа с физикой твердого тела
- •Создание твердого тела
- •Расположение и ориентирование твердых тел
- •Обработка движения твердых тел
- •Использование сил для создания движения
- •Соединение твердых тел с помощью пружин
- •Обеспечение обнаружения столкновений и ответной реакции
- •Создание систем кукольной анимации
- •Определение состояния твердого тела
- •Хранение костей
- •Создание класса управления куклой
- •Создание данных костей
- •Вычисление ограничивающего параллелепипеда кости
- •Установка сил
- •Объединение костей
- •Обработка столкновений
- •Восстановление соединений костей
- •Перестроение иерархии
- •Посмотрите демонстрационные программы
- •Глава 8. Работа с морфирующей анимацией
- •Морфинг в действии
- •Определение исходного и целевого меша
- •Морфинг мешей
- •Создание морфированного меша при помощи обработки
- •Визуализация морфированных мешей
- •Расчленение наборов
- •Создание морфирующего вершинного шейдера
- •Посмотрите демонстрационные программы
- •Глава 9. Использование морфирующей анимации, основанной на ключевых кадрах
- •Использование наборов морфируемой анимации
- •Создание шаблонов .X для морфируемой анимации
- •Загрузка данных морфируемой анимации
- •Визуализации морфированного меша
- •Получение данных морфируемого меша из альтернативных источников
- •Посмотрите демонстрационные программы
- •Глава 10. Комбинирование морфированных анимаций
- •Комбинирование морфированных анимаций
- •Использование базового меша в комбинированных морфированных анимациях
- •Вычисление разностей
- •Комбинирование разностей
- •Создание вершинных шейдеров комбинированного морфирования
- •Использование вершинного шейдера морфируемого комбинирования
- •Посмотрите демонстрационные программы
- •Глава 11. Морфируемая лицевая анимация
- •Основы лицевой анимации
- •Использование комбинированного морфирования
- •Использования фонем для речи
- •Создание лицевых мешей
- •Создание базового меша
- •Создание выражений лица
- •Создание мешей визем
- •Создание анимационных последовательностей
- •Создание последовательностей фонем
- •Использование анализатора файлов .X для последовательностей
- •Проигрывание лицевых последовательностей со звуком
- •Использование DirectShow для звука
- •Синхронизация анимации со звуком
- •Зацикливание воспроизведения звуков
- •Посмотрите демонстрационные программы
- •Глава 12. Использование частиц в анимации
- •Работа с частицами
- •Основы
- •Рисование частиц с помощью квадратных полигонов
- •Работа с точечными спрайтами
- •Улучшения визуализации частиц при помощи вершинных шейдеров
- •Оживление частиц
- •Передвижение частиц при помощи скорости
- •Использование интеллекта при обработке
- •Создание и уничтожение частиц
- •Управление частицами с помощью класса
- •Использование излучателей в проектах
- •Создание движков частиц в вершинных шейдерах
- •Посмотрите демонстрационные программы
- •Глава 13. Имитирование одежды и анимация мешей мягких тел
- •Имитация одежды в ваших проектах
- •Получение данных одежды из мешей
- •Приложение сил для создания движения
- •Воссоздание и визуализация меша одежды
- •Восстановление исходного меша
- •Добавление дополнительных пружин
- •Загрузка данных масс и пружин из .X файла
- •Создание анализатора .X данных одежды
- •Работа с обнаружением столкновений и реакцией на них
- •Определение объектов столкновений
- •Обнаружение и реакция на столкновения
- •Создание класса меша одежды
- •Использование мешей мягких тел
- •Восстановление мешей мягких тел
- •Посмотрите демонстрационные программы
- •Глава 14. Использование анимированных текстур
- •Использование анимации текстур в ваших проектах
- •Работа с преобразованиями текстур
- •Создание преобразования текстур
- •Установка матриц преобразования текстуры
- •Использование преобразования текстур в проектах
- •Использование файлов видео в качестве текстур
- •Импорт видео при помощи DirectShow
- •Создание специализированного фильтра
- •Работа со специализированным фильтром
- •Создание менеджера анимированных текстур
- •Окончание современной анимации
- •Веб-сайты
- •Рекомендуемые книги
- •DirectX 9.0 SDK
- •GoldWave Demo
- •Paint Shop Pro Trial Version
- •TrueSpace Demo
- •Microsoft Agent and LISET
- •Предметный указатель
Глава 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, вам необходимо исполь-