• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

2.2 SpacerNET, Окно объектов. Частицы PFX и их редактор, гайд по PFX системе

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.736
Благодарности
2.640
Баллы
450
Окно объектов. Частицы PFX и их редактор
В Окне объектов есть вкладка Particles (Эффекты). В ней вы можете просматривать существующие эффекты (огонь, дым и прочее).
  • Левый список - все доступные эффекты.​
  • Правый список - только те, что удовлетворяют условию поиска​

1717498788575.png


  1. Выбирая объект в списке вы будете видеть его на экране​
  2. Более того, вы можете редактировать выбранный объект и сразу видеть изменения.​
  3. Вы можете сразу добавить PFX как новый воб, нажав кнопку создать (одну из, в зависимости от списка)​
  4. Чтобы добавить эффект как воб нужно в поле visual для воба поставить имя эффекта + .PFX​

Пример созданного воба-pfx:

1717499219614.png




Редактор частиц
Редактор частиц позволяет сразу менять эффект, видя его изменения.
Внимание! Редактор частиц никаким образом не меняет эффекты в файлах игры (ParticleFX.dat), т.е. после перезапуска спейсера все изменения будут утрачены!

Для того, чтобы сохранить изменения, вы сохраняете свой изменённый эффект в файл (текстовый), а потом уже вставляете измененный эффект (или как новые) в скрипты (PFX ), компилируете их в файл ParticleFX.dat, и данный эффект будет изменен (или добавлен новый) при следующем запуске Спейсера.


1717499082374.png


Возможно, в будущем добавлю описание полей для редактора частиц.
 
Последнее редактирование:

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.736
Благодарности
2.640
Баллы
450
===== Описание полей частиц (PFX) =====

Частицы

ПолеТип поляДопустимые значенияЧто делает?Пример
ppsValuefloat1-10000Количество частиц. Чем их больше, тем гуще эффект. Не рекомендуется ставить выше 300. Большая нагрузка.75.0
ppsScaleKeys_sstring1 или 1.0 2.0 3.0 или любая строка из чисел через пробелЗадает изменение кол-ва частиц по времени, т.е. если ppsValue будет 75, то это число будет домножаться на числа в строке, т.е. на 1 2 3 4.0 5.0 (как в примере)1 2 3 4.0 5.0 1.0 3.0
ppsIsLoopingboolTRUE / FALSEПроигрывается ли эффект бесконечно, или исчезает после завершенияTRUE (бесконечный)
ppsIsSmoothboolTRUE / FALSEСглаживает ppsScaleKeys_s, т.е. эффект будет менять ключи более плавноTRUE
ppsFPSfloat1...120 (примерно 120)Скорость анимации ppsScaleKeys_s, т.е. как быстро эффект будет идти по ключам.
Фактически - это полное время эффекта на экране. Чем меньше число = тем быстрее эффект проиграется и исчезнет
Если ppsFPS = 0 то все частицы появятся на 1 кадре сразу, но тогда частица будет рисоваться бесконечно
10
ppsCreateEm_sstringИмя другого эффектаВызывает дополнительный эффект PFX с задержкой по имени, без .pfx в имениFIRE_SMOKE
ppsCreateEmDelayfloat0-10000Задержка ppsCreateEm_s в миллисекундах300

Поверхность появления частиц/Направление движения

ПолеТип поляДопустимые значенияЧто делает?Пример
shpType_senumPOINT, LINE, BOX, CIRCLE, SPHERE, MESHУстанавливает поверхность, на которой будут появляться частицыSPHERE
shpFor_senumWORLD / OBJECTФактически задает возможность поворота эффекта в пространстве относительно главного воба, к которому прикреплен эффект, если выбрано OBJECT. А если выбрано WORLD, то при поворота воба эффект не будет поворачиваться вместе с вобом.OBJECT
shpOffsetVec_sstring0 0 0 или 0 25 0Смещение центра появления эффекта (3-х мерный вектор) относительно главного воба, к которому прикреплен объект (то есть локальные координаты)0 50 0 (на 50 единиц выше)
shpDistribType_s
enum
RAND, UNI, WALKРаспределение частиц по поверхности, видимо будут ли они появляться в случайных местах или более равномерно (UNI)RAND
shpDistribWalkSpeedfloat1, 2.5, 10 или любое положительное числоЕсли активен shpDistribType_s WALK то это число умножается на время кадра
REAL delta = emitter->shpDistribWalkSpeed * localFrameTimeF;
emitterVars.uniformValue += delta;
if (emitterVars.uniformValue>1) emitterVars.uniformValue -= zFloor(emitterVars.uniformValue);
emitterVars.uniformDelta = delta / zREAL(numTotal);
uniformValue = emitterVars.uniformValue;
uniformDelta = emitterVars.uniformDelta;
10
shpIsVolumeboolTRUE / FALSEЧастицы появляются лишь на поверхности или внутри тоже. Например, если стоит CIRCLE, будут ли частицы появляются внутри круга (TRUE), или же они будут появляться только на внешнем радиусе (FALSE)TRUE
shpDim_sstring1...3000Размер поверхности где будут появляться частицы. Для типа BOX задается 3-мя числами50 или 50 500 120 (для типа BOX)
shpMesh_sstringVISUAL_NAMEИмя модели, если частицы должны появляться на 3д модели (только если включен режим shpType_s MESH)SKULL.3DS
shpMeshRender_benumNONE, DEFAULT, ADD, MULT, BLENDРежим смешивания для 3д модели (только если включен режим shpType_s MESH)ADD
shpScaleKeys_sstring1 или 1.0 2.0 3.0 или любая строка из чисел через пробелЗадает изменение размера поверхности, т.е. если shpDim_s будет 75, то это число будет домножаться на числа в строке, т.е. на 1 2 3 4.0 5.0 (как в примере)1 2 3 2.0 1.1 1.0
shpScaleIsLoopingboolTRUE / FALSEБесконечен ли эффект анимации изменения размера поверхностиFALSE
shpScaleIsSmoothboolTRUE / FALSEСглаживание эффекта анимации изменения размера поверхностиTRUE
shpScaleFPSfloat1...120 (примерно 120)Скорость эффекта анимации изменения размера поверхности5
dirMode_senumNONE, DIR, TARGET, MESHРежим полета частиц,
  • DIR - значит они летят по заданному направлению в полях них (dirAngleHead, dirAngleElev),
  • TARGET - частицы летят в цель, фактически в центр эффекта.
  • MESH - по нормалям меша (перпендикулярно поверности модели)
Режим TARGET
1742038453090.png
(летят в центр)
Режим DIR
1742038488244.png
(ледят куда-то по направлению, в зав. от заданных углов)
TARGET
dirFor_senumOBJECT, WORLD, FRAMEСистема координат для направленияOBJECT
dirModeTargetFor_senumOBJECT, WORLDЦель для направления, мир или объектOBJECT
dirModeTargetPos_sstring0 0 0Цель полета частиц по коодинатам (3-х мерный вектор)0 0 0
dirAngleHeadfloatДробное число от 0 до 360Направление горизонтального движения в градусах180
dirAngleHeadVarfloatЧисло от 0 до 360?Отклонение частиц от dirAngleHead в градусах, т.е. например если dirAngleHead = 0, и dirAngleHeadVar 5, то частицы будут лететь вперед и отклоняться на 5 градусов10
dirAngleElevfloatДробное число от 0 до 360Направление вертикального движения в градусах35
dirAngleElevVarfloatЧисло от 0 до 360?Отклонение частиц от dirAngleElev в градусах, т.е. например если dirAngleElev= 0, и dirAngleElevVar5, то частицы будут лететь вверх и отклоняться на 5 градусов5
velAvgfloatЧисло от 0 до 10 (примерно). Может быть < 0Модуль скорости полета частиц. Обычно это 0.1-0.5. Чем выше, тем быстрее летит.
Скорость может быть < 0, например чтобы частицы летели не к центру, а от него
0.5
velVarfloatЧисло от 0 до 100Разнообразие скорости velAvg, т.е. на сколько скорость конкретной частицы может отличаться от velAvg0.01
lspPartAvgfloatЧисло от 0 до 10000Время жизни конкретной частицы в миллисекундах, обычно это 500-1000750
lspPartVarfloatЧисло о 0 до 100Разнообразие времени жизни lspPartAvg, т.е. на сколько время конкретной частицы может отличаться от lspPartAvg50
flyGravity_sstringВектор (0 0 0)Как влияет гравитация на полет частиц. К примеру, если поставить 0 -0.001 0 то гравитация будет сильно влиять на полет частиц. Они будут стремиться к полу. Если поменять знак на "+" то наоборот, стремиться улетать от поверхности0 -0.00001 0
flyCollDet_benumNONE, SLOWER_REFLECT, FASTER_REFLECT, FREEZE, REMOVEЧто делать когда частица сталкивается с поверхностью рельефа?
NONE - ничего, SLOWER_REFLECT - отразиться от поверхности и уменьшить скорость полета, FASTER_REFLECT - отразиться от поверхности и увеличить скорость полета, FREEZE - замереть на мгновение, REMOVE - мгновенно исчезнуть"
NONE

Внешний вид частиц, цвет, альфа, ориентация

ПолеТип поляДопустимые значенияЧто делает?Пример
visName_sstringИмя текстуры из ресурсов игрыЗадает основную текстуру для частицLIGHTNING_BIG_A0.TGA
visOrientation_senumNONE, VELO, VOB, VELO3DЗадает ориентацию текстуры в пространстве.
VOB - ориентация в плоскости XZ (горизонтальная)
VELO - Частицы выровнены по направлению скорости, но в 2D-плоскости (XY)
VELO3D -
Частицы выровнены по направлению скорости в 3D-пространстве.
NONE -Частицы не зависят от скорости и, вероятно, всегда обращены к камере
Если выбрано VOB, то поле visTexIsQuadPoly автоматически будет TRUE
VELO
visTexIsQuadPolyboolTRUE / FALSEРисовать текстуру на QUAD (TRUE) (четырехугольник) или же на треугольнике (FALSE). QUAD имеет более выраженный размер и эффектTRUE
visTexAniFPSint0...100Скорость проигрывание анимации из разных текстур (если имеется подобная). Если текстура имеет в имени префикс _A0 _A1 _A2 то на разных кадрах будет ставиться разная текстура. Пример LIGHTNING_BIG_A0.TGA (там есть несколько версий текстуры с A1 A2 A3)10
visTexAniIsLoopingvisTexAniIsLoopingTRUE / FALSEЗацикливать ли анимацию из разных текстур (если они есть)TRUE
visTexColorStart_sstring255 255 255Стартовый цвет, который применяется к текстуре при появлении эфффекта. Формат RGB125 250 255
visTexColorEnd_svisTexColorEnd_s125 125 125Финальный цвет, который применяется к текстуре при конце действия эфффекта. Формат RGB125 250 255
visSizeStart_sstringот 0.01 до 300Задает размер текстуры при появлении частицы. Формат: два числа через пробел. Первое число - ширина, второе число - высота10 10
visSizeEndScalestring0.1 - 300Задает размер текстуры под конец жизни частицы, то есть ее размер будет менять за время отрисовки20
visAlphaFunc_senumMAT_DEFAULT, NONE, BLEND, ADD, SUB, MUL, MUL2, TEST, BLEND_TESTЗадает режим смешивания текстур и мира. В основном используется ADD и BLEND. ADD - суммирует цвета, делая эффект ярче. BLEND же используется для создания темных эффектовADD
visAlphaStartfloat0-255Задает непрозрачность для частиц в начале их жизни (255 - полностью видимы)200
visAlphaEndfloat0-255Задает непрозрачность для частиц в конце их жизни (255 - полностью видимы)200


Следы от частиц/Поправка на ветер
На скриншоте - trail текстура, то есть след за основной частицей (которая в центре). Такие частицы задаются полями, что указаны ниже.
1742038070286.png
ПолеТип поляДопустимые значенияЧто делает?Пример
trlFadeSpeedfloat0.01 - 10Скорость исчезновения следа за частицей.
Чем выше - тем быстрее исчезнет след.
Если стоит 0, то поля trlTexture_s и trlTexture_s не используются.
0.2

trlTexture_s
stringИмя текстурыЗадает имя текстуры, которая формирует след за основной частицейMFX_PYROKINESIS_TARGETTRAIL.TGA
trlWidthfloatШирина текстуры-следаЗадает ширину текстуры. Чем больше = тем шире след6
mrkFadeSpeedfloat0.15-50Задает скорость QuadMark текстуры. Работает если скорость velAvg частицы > 0.1. QuadMark - это текстура, которая рисуется при столкновении с поверхностью. Например, след от огня. Работает, только если включено определение коллизий flyCollDet_b не равно NONE3
mrkTexture_sstringИмя текстурыЗадает имя для текстуры QuadMarkMFX_Freeze_Ice.tga
mrkSizefloat0.1-100Размер текстуры10
flockModeenumNONE, WIND, WIND_PLANTSПозволяет частицам реагировать на ветер (только при игре с родным рендером dx7)WIND
flockStrengthfloat0.1 1% влияения ветра на частицы0.5
useEmittersForboolTRUE/FALSEuseEmittersFor = m_bSlowLocalFOR (поле в движке). Код приведен ниже, вне таблицы. Оптимизация для локальных систем координат (медленное обновление). Использовать необязательноВлияет на рассчет позиции частицы
timeStartEnd_sstring12 13Задает время рисования эффекта относительно игрового времени. То есть поставьв 12 13 эффект будет рисоваться между 12 и 13 дня, а вдругое время рисоваться не будет12 13
m_bIsAmbientPFXboolTRUE/FALSEЗадает поле значени для функции IsAmbientPFX() в движке. Если такая частица TRUE и в настройках игры выключен Ambient частицы - то она вообще не будет рисоватьсяFALSE

Код для поля useEmittersFor (m_bSlowLocalFOR )
Код:
if (!emitter->m_bSlowLocalFOR)
 p->positionWS = p->position; // useEmittersFor FALSE
        else                    
        {
           // useEmittersFor TRUE
            zMAT4 matObjToWorld        = connectedVob->trafoObjToWorld;
            if (emitter->shpFOR==zPFX_FOR_OBJECT)
            {
                const zVEC3& offset    = connectedVob->trafoObjToWorld.Rotate (emitter->shpOffsetVec);
                matObjToWorld.Translate (offset);
            }
            p->positionWS = matObjToWorld * p->position;
        }

Доступна быстрая генерация строк для ключей.

Полезно для полей ppsScaleKeys_s и shpScaleKeys_s.
Пример: вам нужно сформировать строку 0.0 0.2 0.4 0.6 0.8 1.0
Чтобы быстро это сделать введите ! 0.0 1.0 0.2 где 0.0 - нижняя граница, 1.0 - верхняя граница, 0.2 - шаг
Можно задавать и в обратном порядке: для получения строки 1.0 0.8 0.6 0.4 Введите ! 1.0 0.4 0.2
 
Последнее редактирование:

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.736
Благодарности
2.640
Баллы
450
Примеры готовых эффектов
Огонь из центра со следами, частицы движутся от центра:
1742041909555.png

Код:
instance MFX_FIRE_CENTER(C_PARTICLEFX)
{
    ppsValue = 50;
    ppsScaleKeys_s = "1";
    ppsIsLooping = 1;
    ppsIsSmooth = 1;
    ppsFPS = 2;
    shpType_s = "SPHERE";
    shpOffsetVec_s = "0 0 0";
    shpDim_s = "50";
    shpScaleKeys_s = "1";
    shpScaleIsLooping = 1;
    shpScaleIsSmooth = 1;
    shpScaleFPS = 2;
    dirMode_s = "TARGET";
    dirModeTargetPos_s = "0 0 0";
    dirAngleHeadVar = 180;
    dirAngleElevVar = 180;
    velAvg = -0.3;
    lspPartAvg = 1500;
    flyGravity_s = "0 0 0";
    visName_s = "FIREFLARE.TGA";
    visTexAniFPS = 18;
    visTexAniIsLooping = 1;
    visTexColorStart_s = "20 0 0";
    visTexColorEnd_s = "255 200 200";
    visSizeStart_s = "10 10";
    visSizeEndScale = 20;
    visAlphaFunc_s = "ADD";
    visAlphaStart = 255;
    visAlphaEnd = 50;
    trlFadeSpeed = 1;
    trlTexture_s = "MFX_PYROKINESIS_TARGETTRAIL.TGA";
    trlWidth = 1;

    
};
Круг с постоянным радиусом:
1742041973561.png

Код:
instance MFX_CIRCLE_CONST(C_PARTICLEFX)
{
   
    ppsValue = 150;
    ppsScaleKeys_s = "1";
    ppsIsLooping = 1;
    ppsIsSmooth = 1;
    ppsFPS = 2;
    shpType_s = "CIRCLE";
    shpFor_s = "OBJECT";
    shpOffsetVec_s = "0 0 0";
    shpDim_s = "500";
    shpScaleKeys_s = "1";
    shpScaleIsLooping = 1;
    shpScaleIsSmooth = 1;
    shpScaleFPS = 2;
    dirModeTargetPos_s = "0 0 0";
    dirAngleHead = 45;
    dirAngleHeadVar = 180;
    dirAngleElev = 45;
    dirAngleElevVar = 50;
    velAvg = 0.008;
    velVar = 0.03;
    lspPartAvg = 1500;
    flyGravity_s = "0 0.0001 0";
    visName_s = "MFX_FIRE_SMOKE.TGA";
    visTexIsQuadPoly = 1;
    visTexAniFPS = 18;
    visTexAniIsLooping = 1;
    visTexColorStart_s = "255 255 255";
    visTexColorEnd_s = "168 66 42";
    visSizeStart_s = "30 30";
    visSizeEndScale = 10;
    visAlphaFunc_s = "ADD";
    visAlphaStart = 255;
    visAlphaEnd = 50;
};

Расширяющийся круг :
1742042369195.png

Код:
instance MFX_CIRCLE_MOVING(C_PARTICLEFX)
{
    ppsValue = 75;
    ppsScaleKeys_s = "1 1.2 2 3 3 4";
    ppsIsSmooth = 1;
    ppsFPS = 5;
    shpType_s = "CIRCLE";
    shpFor_s = "OBJECT";
    shpOffsetVec_s = "0 0 0";
    shpDim_s = "50";
    shpScaleKeys_s = "1 2 3 4 5 7 10 15";
    shpScaleIsLooping = 1;
    shpScaleIsSmooth = 1;
    shpScaleFPS = 12;
    dirModeTargetPos_s = "0 0 0";
    dirAngleHead = 45;
    dirAngleHeadVar = 180;
    dirAngleElev = 45;
    dirAngleElevVar = 50;
    velAvg = 0.001;
    velVar = 0.0001;
    lspPartAvg = 500;
    lspPartVar = 100;
    flyGravity_s = "0 0.0001 0";
    visName_s = "MFX_FIREBALL.TGA";
    visTexIsQuadPoly = 1;
    visTexAniFPS = 18;
    visTexAniIsLooping = 1;
    visTexColorStart_s = "255 255 255";
    visTexColorEnd_s = "168 66 42";
    visSizeStart_s = "10 10";
    visSizeEndScale = 7;
    visAlphaFunc_s = "ADD";
    visAlphaStart = 255;
    visAlphaEnd = 50;
};

Эффект падающего дождя:
1742042950972.png


Код:
instance MFX_FIRERAIN_RAIN(C_PARTICLEFX)
{
    ppsValue = 80;
    ppsScaleKeys_s = "1 1 1 1 1 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1";
    ppsFPS = 2;
    shpType_s = "CIRCLE";
    shpFor_s = "OBJECT";
    shpOffsetVec_s = "0 1000 0";
    shpIsVolume = 1;
    shpDim_s = "300";
    shpScaleKeys_s = "1";
    shpScaleIsLooping = 1;
    shpScaleFPS = 15;
    dirMode_s = "DIR";
    dirFor_s = "WORLD";
    dirAngleHead = 10;
    dirAngleHeadVar = 5;
    dirAngleElev = -90;
    dirAngleElevVar = 5;
    velAvg = 0.7;
    velVar = 0.3;
    lspPartAvg = 2000;
    lspPartVar = 300;
    flyGravity_s = "0 -0.0005 0";
    visName_s = "MFX_FIRERAIN_RAIN_BIG.TGA";
    visOrientation_s = "VELO3D";
    visTexIsQuadPoly = 1;
    visTexAniFPS = 10;
    visTexAniIsLooping = 1;
    visTexColorStart_s = "255 255 255";
    visTexColorEnd_s = "255 255 255";
    visSizeStart_s = "10 60";
    visSizeEndScale = 3;
    visAlphaFunc_s = "ADD";
    visAlphaStart = 255;
    visAlphaEnd = 255;
    trlFadeSpeed = 0.7;
    trlTexture_s = "MFX_FIRERAIN_RAINTRAIL.TGA";
    trlWidth = 8;
};

Эффект полёта душ вверх
1742043231637.png

Код:
instance MFX_SOULS_UP(C_PARTICLEFX)
{
  
    ppsValue = 150;
    ppsScaleKeys_s = "1 1 1 1 1 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1";
    ppsFPS = 2;
    shpType_s = "CIRCLE";
    shpFor_s = "OBJECT";
    shpOffsetVec_s = "0 0 0";
    shpIsVolume = 1;
    shpDim_s = "300";
    shpScaleKeys_s = "1";
    shpScaleIsLooping = 1;
    shpScaleFPS = 15;
    dirMode_s = "DIR";
    dirFor_s = "WORLD";
    dirAngleHead = 10;
    dirAngleHeadVar = 5;
    dirAngleElev = 90;
    dirAngleElevVar = 5;
    velAvg = 1;
    velVar = 0.1;
    lspPartAvg = 1500;
    lspPartVar = 300;
    flyGravity_s = "0.0001 -0.0005 0";
    visName_s = "DESTROYUNDEAD3.TGA";
    visTexIsQuadPoly = 1;
    visTexAniFPS = 10;
    visTexAniIsLooping = 1;
    visTexColorStart_s = "255 255 255";
    visTexColorEnd_s = "0 0 255";
    visSizeStart_s = "20 60";
    visSizeEndScale = 3;
    visAlphaFunc_s = "ADD";
    visAlphaStart = 255;
    visAlphaEnd = 15;
    trlWidth = 8;
};
 
Последнее редактирование:

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.736
Благодарности
2.640
Баллы
450
MEG@VOLT, исправил, спс.
 
Сверху Снизу