Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DirectX. Продвинутая Анимация (2004) [rus].pdf
Скачиваний:
335
Добавлен:
16.08.2013
Размер:
8.39 Mб
Скачать

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 огромные звери опустошают город, и сотни маленьких людей, состоящих из частиц, бегут, спасая свою жизнь. Определенно замечательное использование частиц!

Соседние файлы в предмете Программирование на C++