- •Введение
- •Глава 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
- •Предметный указатель
86 |
Глава 3 |
В рассматриваемом файле .X первый объект данных имеет имя "Scene_Root". Объект "Scene_Root " принадлежит шаблону класса "Frame". Вы уже видели определение шаблона "Frame". Вернувшись к определению того шаблона, вы можете увидеть, что он не хранит никаких данных, но имеет два необязательных встроенных объекта данных - "FrameTransformMatrix " и " Mesh".
По счастливому стечению обстоятельств оба объекта "FrameTransformMatrix " и "Mesh" встроенны в "Scene_Root". Однако в .X файле отсутствует определение шаблонов для "FrameTransformMatrix " и "Mesh". Как вы сможете узнать, какие данные содержат эти объекты? Оказывается, что не обязательно все определения шаблонов должны содержаться в .X файле, вы можете определить эти шаблоны в вашей программе!
Вы научитесь определять шаблоны внутри вашей программы далее в этой главе. А теперь вернемся к примеру. Объект данных шаблонного класса "FrameTransformMatrix " встроен в объект "Scene_Root". Он содержит вещественные числа, которые представляют собой матрицу преобразования. Далее следует объект шаблонного класса "Mesh", который содержит информацию о меше.
Достаточно об этом примере, я уверен, что вы поняли суть. Как вы можете видеть, шаблоны полностью определяются пользователем, что означает, что вы можете создавать любые типы шаблонов, содержащие любые данные. Хотите хранить звук в .X файлах? А как насчет хранения в них кардиограммы? Используя .X файлы вы можете хранить звук, кардиограммы, любые типы данных, какие вы только захотите!
Определение шаблонов
Т. к. дизайн .X файлов является открытым, вы должны предопределять каждый используемый с DirectX шаблон, чтобы понять, как получить доступ к данным шаблона. Обычно шаблоны определяются внутри .X файла, хотя вы можете определять их и в вашей программе (как я замечал ранее).
Вы определяете шаблон (содержащийся в .X файле), назначая ему уникальное имя, следующее после слова "template", как я сделал в далее. (Обратите внимание на открывающуюся скобку, обозначающую начало определения шаблона.)
template ContactEntry {
Хорошо, вы начали объявление шаблона, который будете использовать для хранения контактной информации человека. Назовем класс шаблона "ContactEntry", как вы видите из кода. Даже если вы присвоили вашему шаблону уникальное имя класса, вам необходимо сделать еще один шаг - присвоить уникальное идентификационное число - GUID.
Использование формата файла .X |
87 |
Когда вы будете читать .X файлы в ваших программах, у вас будет доступ только к GUID каждого шаблона, но не к их именам. Имена классов важны только для ваших объектов данных .X файлов; вам необходимо, чтобы ваша программа различала эти объекты данных, используя их шаблонный GUID.
Для определения GUID для вашего шаблона запустите программу "guidgen.exe", поставляемую вместе с компилятором "Microsoft Visual C/C++" (находящуюся в инсталяционной директории \Common\Tools вашего MSVC). После нахождения и запуска программы "guidgen.exe" перед вами появится небольшое диалоговое окно, показанное на рис. 3.1.
Рис. 3.1. Диалоговое окно "Create GUID" ("Создать GUID") программы "guidgen.exe" позволяет вамсоздаватьуникальныеидентификационныечиславразличныхформатах
Как вы можете видеть на рис. 3.1, диалоговое окно "Create GUID" позволяет вам выбрать формат создаваемого GUID. В данном случае вы должны использовать формат №2 DEFINE_GUID(...). Выберите данную опцию и нажмите кнопку "Cору" ("Копировать").
Теперь абсолютно уникальное идентификационное число находится в буфере обмена, ожидая пока вы вставите его в ваш код. Вернитесь к создаваемому
.X файлу и вставьте содержимое буфера обмена в ваше объявление шаблона.
template ContactEntry {
// {4C9D055B-C64D-4bfe-A7D9-981F507E4 5FF} DEFINE_GUID («name»,
0x4c9d055b, 0xc64d, 0x4bfe, 0xa7, 0xd9, 0x98, \ 0x1f, 0x50, 0x7e, 0x45, 0xff);
88
Ой! Здесь немного больше текста, чем необходимо для шаблона, поэтому вырежем макрос DEFINE_GUID и вставим его в исходный код проекта. Да, все правильно - каждый определенный вами шаблон требует соответствующего определения GUID (например, используя макрос DEFINE_GUID) в вашем коде. Это означает, что вам необходимо подключить заголовочный файл "initguid.h" в ваш код и использовать DEFINE_GUID, как я сделал тут.
#include "initguid.h"
// В начале файла исходного кода добавьте DEFINE_GUIDs DEFINE_GUID(ContactEntry, \
0x4c9d055b, 0xc64d, 0x4bfe, 0xa7, 0xd9, 0x98, \ 0x1f, 0x50, 0x7e, 0x45, 0xff);
Заметьте, что в макросе DEFINE_GUID я заменил " « n a m e » " на фактическое название класса шаблона, который я определяю. В данном случае я использую "ContactEntry " в качестве названия макроса. После этого макрос "ContactName" будет содержать указатель на GUID моего шаблона (который должен совпадать с GUID шаблона, используемого в .X файле).
Возвращаясь к шаблону "ContactEntry ", вам также необходимо удалить тег комментария из вставленного текста и изменить кавычки GUID на угловые, как я сделал тут:
template ContactEntry { <4C9D055B-C64D-4bfe-A7D9-981F507E45FF>
Теперь вы готовы продолжить и определить данные шаблоны. Шаблоны очень похожи на классы и структуры С; они содержат переменные и указатели на другие шаблоны, наряду с ограничениями доступа. Типы используемых данных практически полностью совпадают с используемыми в С. В таблице 3.1 показаны типы данных, которые вы можете использовать для определения шаблонов, и их аналоги в C/C++.
Таблица 3.1. Типы данных шаблонов .X
Тип данных |
Описание |
|
|
WORD |
16-битное число (short) |
|
|
DWORD |
32-битное число (32-битное int или long) |
|
|
FLOAT |
вещественное число IEEE (float) |
|
|
DOUBLE |
64-битное вещественное число (double) |
CHAR |
8-битное знаковое число (signed char) |
Использованиеформатафайла.X
Таблица3 . 1 .Типы д а н н ы х шаблонов .X (Продолжение)
Типданных |
|
Описание |
|
|
|
UCHAR |
8-битное беззнаковое число |
(unsigned char) |
|
|
|
BYTE |
8-битное беззнаковое число |
(unsigned char) |
|
|
|
STRING |
строка, оканчивающаяся нулем (char[ ]) |
|
|
|
|
Array |
Массив определенного типа данных ([ ]) |
|
|
|
|
Совсем как в объявлении переменной C/C++ , вы указываете ключевое слово типа данных и имя экземпляра, заканчивая точкой с запятой (означает окончание объявления переменной)
DWORD Value;
В таблице 3.1 вы могли заметить ключевое слово "array", которое определяет массив элементов типа данных. Для определения массива вы задаете ключевое слово "array", тип данных, имя экземпляра и размер массива (заключенный в квадратные скобки). Например, для объявления массива из 20 элементов типа "STRING" вы можете использовать
array STRING Text[20];
Замечание. Замечательным свойством массивов является возможность использования другого типа данных для определения размера массива, как я сделал тут:
DWORD ArraySize;
array STRING Names[ArraySize];
Теперь вернемся к шаблону "ContactEntry" и определим имя человека, телефон и возраст. Эти три переменные - две строки (имя и номер телефона) и одно численное значение (возраст) - могут быть определены в шаблоне "ContactEntry" как показано здесь.
template ContactEntry { <4C9D055B-C64D-4bfe-A7D9-981F507E45FF> STRING Name; // имя
STRING PhoneNumber; // телефон DWORD Age; // возраст
}
Замечательно! Чтобы закончить объявление шаблона, добавьте закрывающуюся скобку, и он готов к использованию.