После того как вы узнали, как рисовать частицы, вы можете использовать эти знания для создания, управления и уничтожения множества экземпляров частиц в трехмерном мире. Первое, что необходимо сделать, это создать класс частиц, который бы содержал всю необходимую информацию о частице.

Не беря во внимание данные вершин, которые хранятся отдельно от данных частиц, скорее всего вы будете хранить положение, цвет и тип частицы. Вы также можете хранить направление, скорость ее движения и время жизни частицы, после которого движок удалит ее.

Для этой книги я решил использовать следующую информацию о частице:

• 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(2 5 5,2 55,2 5 5,2 55) ; Particle.m_vecVelocity = D3DXVECTOR3(0.0f, 0.0f, 0.0f);

Вот и все, что необходимо для создания частицы! Конечно, частица просто стоит на месте и ничего не делает, так что давайте заставим ее летать, придав ей скорость.

Улучшения визуализации частиц при помощи вершинных шейдеров || Оглавление || Передвижение частиц при помощи скорости