- •Введение
- •Глава 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
- •Предметный указатель
356 |
Глава 12 |
Как вы видите, визуализация частиц с помощью вершинных шейдеров является лучшим способом. Когда вы разберетесь, как вершинный шейдер работает с данными частицы, посмотрите демонстрационную программу этой главы, иллюстрирующую использование большого числа частиц в ваших проектах.
После того как вы усвоите основы рисования частиц, можно двигаться дальше и посмотреть, как можно оживить их в ваших проектах.
Оживление частиц
После того как вы узнали, как рисовать частицы, вы можете использовать эти знания для создания, управления и уничтожения множества экземпляров частиц в трехмерном мире. Первое, что необходимо сделать, это создать класс частиц, который бы содержал всю необходимую информацию о частице.
Не беря во внимание данные вершин, которые хранятся отдельно от данных частиц, скорее всего вы будете хранить положение, цвет и тип частицы. Вы также можете хранить направление, скорость ее движения и время жизни частицы, после которого движок удалит ее.
Для этой книги я решил использовать следующую информацию о частице:
•Tуре. Частицы могут быть различных типов, и эта переменная определяет тип частицы. Например, я могу хранить частицы огня и дыма вместе, используя одинаковую структуру частиц.
•Position. Это набор трехмерных координат, определяющих положение частицы в мире.
•Velocity. Скорость и направление частицы хранятся в векторе. Компоненты х, у и z определяют насколько быстро движется частица в направлении образуемой ими оси.
•Life. Частица может существовать в трехмерном мире долго; эта часть данных позволяет вашему движку узнать, когда необходимо удалять частицу из списка активных визуализируемых частиц. Однако не обязательно удалять частицу, вы можете сделать, чтобы она существовала неограниченно долго.
•Size. За свой жизненный цикл частица может менять свой размер. Эти данные содержат значение, используемое в качестве размера частицы (в трехмерных единицах). Помните, частица имеет одинаковый размер по осям х и у, так что задание размера равного 10 сделает частицу, имеющую 20 единиц в ширину и 20 единиц в высоту (от -10 до 10 по каждой оси).
•Color. Для моделирования изменений частицы вы можете использовать модификатор цвета, чтобы изменять красную, зеленую и синюю компоненты цвета многоугольников при визуализации. Например, частица огня может менять цвет от белого до красного и желтого с течением времени.
Использование частиц в анимации
Вы можете объединить все эти данные в один простой класс, как показано тут:
class cParticle
{
public:
DWORD m_Type; // Тип частицы
D3DXVECTOR3 m_vecPos; // Положение частицы
D3DXVECTOR3 m_vecVelocity; // Скорость частицы
DWORD m_Life; // Время жизни частицы в мс float m_Size; // Размер частицы
DWORD m_Color; // Рассеянный цвет частицы
};
Каждой частице необходим собственный экземпляр класса cParticle. Вы можете объединить набор этих классов в массив для облегчения работы. Или, как я вам покажу позже, вы можете использовать связанный список частиц. Я расскажу вам, как иметь дело с более чем одной частицей далее в этой главе. А пока, для упрощения, будем рассматривать одну частицу.
Первым шагом является заполнение класса cParticle информацией о частице: ее тип, местоположение, цвет и т. д. Следующий кусочек кода устанавливает тип частицы в 1 и помещает ее в начало координат мира. Размер является номинальным (установлен в 5), а цвет устанавливается в ярко белый (исходный цвет карты текстуры). Скорость пока не имеет никакого значения, поэтому обнулим все ее компоненты.
// Создадим экземпляр частицы и заполним его данными cParticle Particle;
Particle.m_Type = 1;
Particle.m_vecPos = D3DXVECTOR3(0.0f, 0.0f, 0.0f); Particle.m_Size = 5.0f;
Particle.m_Color = D3DCOLOR_RGBA(255,255,255,255) ; Particle.m_vecVelocity = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
Вот и все, что необходимо для создания частицы! Конечно, частица просто стоит на месте и ничего не делает, так что давайте заставим ее летать, придав ей скорость.
Передвижение частиц при помощи скорости
После того как вы создали частицу в трехмерном мире, необходимо придать ей движение, применив метод обновления ее положения в мире. Каждая частица имеет особенный способ обновления своих координат. Для частицы огня необходимо, чтобы она медленно поднималась и меняла свой цвет с самого горячего на
358 |
Глава 12 |
холодный (например с красного на оранжевый). Частицы дыма обычно дрейфуют по ветру, так что необходимо найти близлежащий источник ветра и использовать его для управления этими частицами.
Большинство частиц являются очень простыми по природе, и они двигаются в заданном направлении, изменяемом внешними силами. Частица имеет скорость, определяющую насколько быстро или медленно она движется. Используемые внешние силы могут увеличивать или уменьшать скорость частицы со временем, таким образом, ускоряя или замедляя ее движение.
Для каждого обрабатываемого кадра вы можете посчитать силы, действующие на скорость частицы. Эти силы могут иметь любое происхождение, будь то ветер, гравитация, сопротивление или толчок. Однако не все силы необходимы в вашем движке, они просто увеличивают реалистичность. Ваш движок должен содержать хотя бы силу тяжести и толчка, чтобы частицы могли двигаться и останавливаться на земле.
Вы можете добавить функции, которые бы применяли силы к классу частиц. Или, если вы используете другой класс для управления частицами (похожий на тот, что вы увидите ниже), вы можете поместить функции туда. А пока я просто покажу вам, как вычислять вектор силы из множества источников, прикладываемых к скорости частицы (заметьте, что силы измеряются в миллисекунду).
// силы, прикладываемые к частице(ам)
D3DXVECTOR3 vecForce = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
//Добавить силу тяжести равную 0.02, каждую миллисекунду vecForce += D3DXVECTOR3(0.0f, -0.02f, 0.0f);
//Добавить силу ветра равную 0.01f, каждую миллисекунду vecForce += D3DXVECTOR3(0.01f, 0.0f, 0.0f);
После того как вы вычислили силу, прикладываемую к каждой частице, необходимо обновить скорость. Обновление скорости частицы является простым сложением векторов силы и скорости. Помните, что силы измеряются в миллисекундах, означая, что вы должны умножить вектор силы на количество прошедших миллисекунд с последнего движения частицы. Предположим, что величина прошедшего времени хранится в вещественной переменной TimeElapsed.
//TimeElapsed=время,в миллисекундах,прошедшее с последнего движения
//частицы.
Particle.m_vecVelocity += (m_vecForce * TimeElapsed);
В добавление к использованию вектора силы для изменения скорости частицы можно использовать альтернативные методы для обновления частицы, используя более интеллектуальные методы.
Использованиечастицванимации
Использование интеллекта при обработке
Пока что я рассмотрел простые движения частиц, использующие силы. А что насчет бегущих прохожих, о которых я говорил в начале этой главы? Эти испуганные люди, спасающие свои жизни от гигантского монстра, разрушившего городскую дамбу. Никто ведь не скажет, что нельзя использовать немного интеллекта при обработке частиц, не правда ли?
Вместо приложения набора сил к частицам вы могли бы интеллигентно двигать их, используя минимум времени и обработки. Предположим, ваш игровой город поделен сеткой. Каждая линия сетки представляет собой улицу, по которой могут ездить машины. Каждая машина имеет заданное направление движения; как только она попадает на пересечение линий сетки, она может выбрать новое случайное направление движения.
Разнообразные пересечения помечаются как опасные; если монстр атакует город, начиная с этого момента, машины будут пытаться уехать как можно дальше от этих опасных точек с удвоенной скоростью. В конце концов, все машины либо покинут город, либо будут раздавлены чудовищем, либо застрянут где-нибудь и будут оставлены. Таким образом, со временем все частицы могут быть удалены, освобождая время обработки для других вещей.
Частицы, использующие интеллект, точно знают с какой скоростью и в каком направлении перемещаться. Вместо того чтобы медленно изменять скорость в заданном направлении с течением времени, они меняют скорость мгновенно.
Этот тип интеллектуальной обработки замечательно подходит для ваших игровых проектов, и его очень легко реализовать, используя технологии, описанные в этой главе. В демонстрационной программе, содержащейся на компактдиске, вы увидите, как я использовал интеллектуальную обработку в своем движке частиц.
В демонстрационной программе присутствует группа частиц, которая представляет людей. Эти люди просто стоят и ничего не делают, пока над их головами не начинает пикировать вертолет, заставляя людей искать укрытие!
Чтобы узнать больше о методах использования интеллектуальной обработки частиц, посмотрите на игру War of the Monsters фирмы Ingoc для PlayStation 2. Помните сценарий о терроризируемых жителях, о котором я упоминал ранее? В War of the Monsters огромные звери опустошают город, и сотни маленьких людей, состоящих из частиц, бегут, спасая свою жизнь. Определенно замечательное использование частиц!