- •Введение
- •Глава 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
- •Предметный указатель
Глава 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;