Системы частиц

Xtreme3D v3

Урок 17
Системы частиц

Уровень: средний
Версия Xtreme3D: 3.0.x
Автор урока: Gecko

Частицы (particles) - это маленькие, простые по форме движущиеся объекты, множеством которых моделируются различные сложные динамические субстанции, например, огонь, дым, фейерверк и т.д. В качестве частиц в игровых движках обычно используются биллборды - направленные в сторону камеры прямоугольники с текстурой. В Xtreme3D есть две разные системы частиц - FireFX и ThorFX. FireFX - система частиц, моделирующая огонь (хотя с ее помощью можно воссоздавать и различные другие эффекты). ThorFX предназначена для моделирования молний и разного рода электрических разрядов.

В играх обычно используется много однотипных систем частиц. К примеру, в подземелье на стенах могут висеть факелы, и на каждом будет гореть огонь, сделанный при помощи частиц. В данном случае проще будет не создавать отдельную систему для каждого факела, а просто нарисовать одну и ту же систему несколько раз в разных позициях. Специально для такой ситуации предусмотрен менеджер FireFX. Менеджер - это что-то вроде "сервера", на котором выполняются все вычисления, связанные с эффектом. А отдельные системы FireFX - это "клиенты", использующие настройки указанного для них менеджера. Вы просто создаете менеджер, настраиваете его как вам угодно, а затем добавляете любое количество систем в любых нужных вам местах сцены. Изменения, внесенные в настройки менеджера, автоматически коснутся всех подчиненных ему систем.

Сначала создаем менеджер FireFX:

firefx = FireFXManagerCreate();
FireFXSetParticleSize(firefx, 0.3);
FireFXSetRadius(firefx, 0.1);
FireFXSetBurst(firefx, 2.0);
FireFXSetDensity(firefx, 1);
FireFXSetLife(firefx, 1);
FireFXSetColor(firefx, c_yellow, 1.0, c_red, 0.0);

Теперь добавляем эффект огня любым объектам в любом количестве:

fireobj1 = DummycubeCreate(global.scene1);
ObjectSetPosition(fireobj1, -2, 0, 0);
FireFXCreate(firefx, fireobj1);

fireobj2 = DummycubeCreate(global.scene1);
ObjectSetPosition(fireobj2, 2, 0, 0);
FireFXCreate(firefx, fireobj2);