- •Введение
- •Глава 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
- •Предметный указатель
188 |
Глава7 |
На самом деле есть несколько способов убедиться, что ограничивающие параллелепипеды соединяются в тех же точках, что и соответствующие им кости. Метод, который я покажу вам в этой главе, использует пружины для возвращения ограничивающего параллелепипеда при каждом его перемещении. На рис. 7.4 вы можете видеть несколько отсоединившихся ограничивающих параллелепипедов, летающих по сцене, которые расчленяют бедный персонаж на части. Между каждым параллелепипедом вы можете видеть пружину, которая используется для соединения частей тела вместе.
Рис. 7.4. Набор пружин позволяет вернуть отсоединившиеся параллелепипеды
После перемещения параллелепипедов и использования пружин для восстановления точек соединения вам необходимо скопировать ориентацию параллелепипеда в иерархию костей, обновить скелетный меш и визуализировать его. Видите, как просто!
Конечно, это просто в теории, но вот практическая реализация является трудной задачей. Все, что вы прочитали, на самом деле является большой физической проблемой - как отследить ориентацию, движение и взаимодействия параллелепипедов? Используя физику твердого тела, вот как!
Работа с физикой твердого тела
Как вы только что читали, тело вашего персонажа может быть разделено на параллелепипеды, которые представляют собой разнообразные кости, образующие скелетную структуру. Вам необходимо отслеживать изменения ориентации этих параллелепипедов при их перемещении во время анимации и копировать эти ориентации в их начальные кости.
Создание кукольной анимации |
189 |
Хорошо, хорошо, но как это связано с физикой твердого тела? Ну, часть "твердого тела" означает, что ваши меши полагаются твердыми объектами - параллелепипедами, представляющими кости, которые никогда не меняют форму и никогда не проникают в пространство других объектов. Поэтому ограничивающие параллелепипеды, представляющие кости, являются твердыми объектами.
Изучение физики твердого тела (часто называемой динамикой твердого тела) отслеживает движение твердых объектов, включая действие сил, таких как гравитации и трения. Взаимодействие также играет важную роль, потому что твердые объекты, представляющие части тела персонажа, должны отскакивать друг от друга и от окружающей территории.
Прежде чем вы возьмете учебник по физике позвольте сказать, что на самом деле физика твердого тела не так сложна, как кажется. Конечно, в ней есть множество формул и вычислений, от которых даже у учителя математики кошмары, но после того как вы разберетесь, не будет никаких причин для волнения.
На самом деле я буду излагать материал физики твердого тела шаг за шагом, чтобы вам было понятнее, начав с создания твердого объекта.
Создание твердого тела
Физика твердого тела - это система слежения за движением и взаимодействие твердых объектов. Для упрощения положим, что твердыми объектами являются трехмерные ограничивающие параллелепипеды, содержащие кости скелетной структуры. В пространстве параллелепипеды состоят из восьми точек (по одной в каждом углу).
Точки являются аналогами вершин, параллелепипед является аналогом меша. Используя простые преобразования (вращение и перемещение), вы можете расположить параллелепипед и его восемь угловых точек где угодно в трехмерном мире. Каждый параллелепипед с его угловыми точками имеет собственное место в системе твердых тел. Параллелепипед представляет точки как целое - что влияет на параллелепипед, то влияет и на точки. Таким образом, если вы переместите параллелепипед, точки переместятся вместе с ним, вам нет необходимости заботиться о точном расположении точек внутри него.
Что касается точек, они не просто помогают определять размер ограничивающего параллелепипеда, они также помогают определять столкновения. Видите ли, если хотя бы одна из этих точек лежит внутри пространства другого объекта, тогда можно сказать, что объекты сталкиваются, и вам необходимо обрабатывать их. Это сильно
190 |
Глава 7 |
облегчает нахождение столкновений; вместо того чтобы проверять каждую вершину меша, попадает ли она в объект, вы можете проверять точки ограничивающего параллелепипеда. Я вернусь к обнаружению столкновений немного позднее; а пока я хочу продолжить определение твердого тела.
Как я уже упоминал, каждый ограничивающий параллелепипед состоит из восьми точек. Для определения положения этих точек вам необходимо полностью окружить каждую кость (и ее вершины, и точки соединения костей) в скелетной структуре параллелепипедом. Я покажу, как это делать далее в этой главе, когда мы начнем использовать твердые тела в анимациях; а пока предположим, что имеем параллелепипед заданной ширины, глубины и высоты.
На рис. 7.5 центр параллелепипеда расположен в начале координат. Размеры параллелепипеда изменяются от -ширина/2, -высота/2, -глубина/2 до +ширина/2, +высота/2, +глубина/2. Используя эти значения (размеров), вы можете вычислить координаты ограничивающего параллелепипеда.
Для хранения этих восьми точек можно использовать два набора из восьми объектов D3DXVECTOR3. Первые восемь объектов будут содержать локальные координаты параллелепипеда, совсем как буфер вершин меша.
D3DXVECTOR3 vecLocalPoints[8];
Второй набор из восьми точек будет содержать глобальные координаты точек, движущихся в пространстве мира.
D3DXVECTOR3 vecWorldPoints[8] ;
Второй набор точек используется для хранения преобразованных координат, в то время как первый - для не преобразованных. Для перемещения твердого тела вам необходимо преобразовать координаты первого набора точек и сохранить результат во втором. Опять же, это очень похоже на работу с вершинами меша.
На данный момент вам необходимо хранить координаты восьми углов твердого тела в массиве векторов vecLocalPoints (используя размеры твердого тела).
//Width, Height, Depth=3 вещественных числа, содержащие размеры тела
//Заметьте, что все размеры заданы в метрах
//Сохранить размеры тела в вектор
D3DXVECTOR3 vecSize = D3DXVECTOR3(Width, Height, Depth);
//Сохранить половинные размеры в вектор D3DXVECTOR3 vecHalf = vecSize * 0.5f;
//Сохранить координаты углов
vecLocalPoints[0]=D3DXVECTOR3(-vecHalf.x, vecHalf.y,-vecHalf.z);
Создание кукольной анимации |
191 |
Угловые точки
Рис. 7.5. Параллелепипед (который представляет собой твердое тело) определяется расположением восьми точек относительно его центра. Положения этих точек определяются половиной значения ширины, высоты и глубины тела
vecLocalPoints[1]=D3DXVECTOR3(-vecHalf.х, vecHalf.у, vecHalf.z); vecLocalPoints[2]=D3DXVECTOR3(vecHalf.x,vecHalf'y,vecHalf.z); vecLocalPoints[3]=D3DXVECTOR3( vecHalf.x, vecHalf.y,-vecHalf.z); vecLocalPoints[4]=D3DXVECTOR3(-vecHalf.x,-vecHalf.y,-vecHalf.z); vecLocalPoints[5]=D3DXVECTOR3(-vecHalf.x,-vecHalf.y, vecHalf.z); vecLocalPoints[6]=D3DXVECTOR3( vecHalf.x,-vecHalf.y, vecHalf.z); vecLocalPoints[7]=D3DXVECTOR3( vecHalf.x,-vecHalf.y,-vecHalf.z);
Замечание. Из комментариев кодов вы могли заметить, что в качестве единиц измерения я использую метры (в противоположность использованию безразмерных величин, возможно применяемых вами). Этот факт не должен вас беспокоить, потому что все вычисления производятся независимо от единиц измерения.
Размеры параллелепипеда влияют не только на его объем, но и на массу. О да, твердое тело имеет массу, которая влияет на движение. К объектам с большей массой необходимо приложить большую силу, чтобы сдвинуть их, в то время как к объектам с меньшей массой — меньшую. Я объясню использование массы в вычислениях немного позже; а пока я хочу показать вам, как определять массу объекта.