После того как вы узнали, как рисовать частицы, вы можете использовать эти знания для создания, управления и уничтожения множества экземпляров частиц в трехмерном мире. Первое, что необходимо сделать, это создать класс частиц, который бы содержал всю необходимую информацию о частице.
Не беря во внимание данные вершин, которые хранятся отдельно от данных частиц, скорее всего вы будете хранить положение, цвет и тип частицы. Вы также можете хранить направление, скорость ее движения и время жизни частицы, после которого движок удалит ее.
Для этой книги я решил использовать следующую информацию о частице:
• 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);
Вот и все, что необходимо для создания частицы! Конечно, частица просто стоит на месте и ничего не делает, так что давайте заставим ее летать, придав ей скорость.
⇐Улучшения визуализации частиц при помощи вершинных шейдеров || Оглавление || Передвижение частиц при помощи скорости⇒