- •Введение
- •Глава 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
- •Предметный указатель
244 Глава 8
Морфинг в действии
Возвратимся в ранние 90-е. Революционная технология компьютерной графики, известная как морфинг, появилась на большой арене благодаря Майклу Джексону. Нет, я не говорю о его неудачной пластической операции, я говорю об использовании морфинга в одном из его видео-клипов. Да, Король Попа использовал технологии морфинга в видео-клипе на свою песню "Black or White" и создал феномен анимации, который существует и по сей день.
В случае если вы не видели этот клип, позвольте мне объяснить. Он включает отрывок, в котором человек танцует под мелодию, а камера направлена на его лицо. Каждые несколько секунд его лицо превращается в лицо какого-нибудь другого человека. И так продолжается, пока лица не превратятся более чем 10 раз. Результат использования морфинга в этом клипе просто потрясающ, и я до сих пор помню его отчетливо!
По мере того как проходили годы, морфинг наконец то добрался до игр. В то время как в старые времена под морфингом понимали цифровую обработку видео, включающую плавное изменение одной картинки на другую (как, например, в "Black or White"), современный же морфинг (или, по крайне мере, обсуждаемый нами) включает в себя плавное изменение трехмерного меша с течением времени.
Наверное, самым известным примером игры, использующей морфинг является id'шный Quake. В Quake все анимационные последовательности движения персонажей созданы из наборов морфируемых мешей. Один меш постепенно принимает форму второго меша, второй меш принимает форму третьего и т. д.
При использовании небольшого интервала времени и достаточного количества морфируемых мешей все последовательности анимаций будут плавными и очень легко обрабатываемыми. Quake может выполняться с приличной скоростью даже на самых медленных компьютерных системах. Причиной этого является простота работы с морфирующими анимациями, что вы и увидите в следующих главах.
Как вы уже могли предположить морфинг, иногда называемый твиннинг (tweening), как, например, в DirectX SDK) - это процесс изменения одной формы
вдругую с течением времени. Для нас этими формами являются меши. Процесс морфинга меша включает в себя постепенное изменение координат вершин меша, начиная с одной формы и переходя к другой.
Меш, содержащий ориентацию вершин в начале процесса морфинга, называется исходным мешем. Второй меш, ориентацию вершин которого принимает исходный
врезультате процесса морфинга, называется целевым мешем. Давайте рассмотрим эти меши более подробно, чтобы лучше понимать сам процесс морфинга.
Работа сморфирующейанимацией |
245 |
Определение исходного и целевого меша
Исходный и целевой меши, с которыми вы будете работать в этой книге, являются обычными объектами ID3DXMesh. Однако вы не можете просто использовать два меша для морфинга; существуют определенные правила. Во-первых, каждый меш должен иметь одинаковое количество вершин. В процессе морфинга вершины исходного меша просто перемещаются в положение вершин целевого меша. Отсюда следует второе правило: каждой вершине исходного меша должна соответствовать вершина (точнее индекс вершины) в целевом меше. В качестве примера посмотрите на меши, изображенные на рис. 8.1.
Начало |
Промежуточное |
Окончание |
морфирования |
время |
морфирования |
Рис. 8.1. Во время процесса морфинга вершины исходного меша плавно перемещаются в положение вершин целевого меша. Каждая вершина имеет одинаковый индекс как в исходном, так и в целевом меше
Порядок вершин является важным. Вершина, движущаяся из исходного меша, должна двигаться к вершине, имеющей тот же самый индекс в целевом меше. Если вы перенумеруете порядок, вершины будут двигаться в неправильных направлениях при морфинге, производя забавно выглядящие результаты, как показано на рис. 8.2.
Если вы создаете меши, содержащие одинаковое количество вершин и имеющие одинаковый их порядок, то все в нормально. Что касается получения фактических данных меша, я оставляю это вам. Вы можете использовать функцию D3DXLoadMeshFromX или любую функцию, которую вы разработали в главе 1, для загрузки мешей. После того как вы загрузили два меша и подготовили их к использованию, можно их морфировать!
246 |
|
Глава8 |
Исходный меш |
Промежуточный меш |
Целевой меш |
|
|
1 |
Время
Начало |
Промежуточное |
Окончание |
морфирования |
время |
морфирования |
Рис. 8.2. Морфинг прошел неудачно, порядок вершин в исходном и целевом мешах различен, из-за чего получается странный результат
Морфинг мешей
Теперь, когда вы имеете два меша, с которыми будете работать (исходный и целевой), вы можете начинать процесс морфирования. Помните, что морфирование - это процесс изменения одной формы на другую. Необходимо чтобы вершины исходного меша, находящиеся в начальном положении, постепенно двигались к положению вершин целевого меша.
Вы можете измерять интервал времени, используемый для отслеживания движения вершин из координат исходного меша в координаты целевого, при помощи скаляра (находящегося в диапазоне от 0 до 1). При значении скаляра, равного 0, вершины будут расположены в исходном меше, в то время как при значении скаляра 1 вершины будут располагаться в целевом меше. На рис. 8.3 показано, что любое значение скаляра от 0 до 1 расположит вершины между положением исходного и целевого меша.
Вычислять координаты расположения вершины между исходным и целевым мешами очень просто. Возьмите вершину исходного меша и умножьте ее координаты на обратное значение скаляра (1.0-scalar). Использование обратного значения скаляра означает, что координаты вершины будут определяться на 100 процентов координатами ее в исходном меше при значении скаляра, установленного в 0, и на 0 процентов при скаляре, установленном в 1.
Работа сморфирующейанимацией |
247 |
Рис. 8.3. Начиная с координат в исходном меше (и значении скаляра 0), вершина постепенно движется к положению в целевом меше по мере увеличения скаляра
Далее, используя вершину, имеющую тот же самый индекс целевого меша, что и ранее, умножьте ее координаты на значение скаляра. Сложив два получившихся значения, вы получите результирующие координаты вершины в сморфированной анимации.
Сначала концепция умножения координат вершины на скаляр и последующее сложение результатов может показаться странным. Если вы не уверены в математике, проделайте следующие вычисления, чтобы убедиться в правильности полученного результата. Используйте одномерное значение для представления координат вектора. Установите координату исходной точки в 10, а координату целевой точки в 20. Для упрощения, используйте значение скаляра равное 0.5, которое должно дать 15, в качестве результирующей координаты вершины при морфинге.
Умножив исходную координату (10) на 1-0.5 получим 5. Умножив целевую координату (20) на 0.5 получим 10. Сложив два результата (5 и 10) получим 15. Разве не замечательно - получить правильный результат!
Эту процедуру можно записать в виде следующего кода, полагая что координаты исходной вершины хранятся в vecSource, координаты целевой вершины хранятся в vecTarget, а'значение скаляра в Scalar.
//vecSource = D3DXVECTOR3 содержащий исходные координаты
//vecTarget = D3DXVECTOR3 содержащий целевые координаты
//Scalar = FLOAT содержащее значение скаляра
//Умножить исходные координаты на исходный скаляр D3DXVECTOR3 vecSourcePos = vecSource * (1.0f-Scalar);
//Умножить целевые координаты на скаляр
D3DXVECTOR3 vecTargetPos = vecTarget * Scalar;
// Сложить два получившихся вектора
D3DXVECTOR vecPos = vecSourcePos + vecTargetPos;