Сохраните сцену (bubbles.та). Рассмотрим принципы написания expression для частиц на примере этих же пузырей.
Particle Expressions - от порядка к хаосу и обратно Откройте сцену bubbles.та.
В Attribute Editor нажмите правую кнопку напротив атрибута radiusPP и выберите в меню Delete Array Mapper, чтобы удалить зависимость радиуса частиц от времени жизни.
Сейчас мы хотим задать всем частицам разный радиус прямо при рождении.
Снова нажмите правую кнопку напротив атрибута radiusPP и выберите Creation Expression. Появится Expression Editor, в котором следует ввести формулу для радиуса нарождающихся частиц.
Введите формулу: radiusPP=rand(0.01, 0.1); и нажмите кнопку Create.
Теперь все частицы рождаются с разным радиусом. А созданный expression выполняется для каждой частицы один раз во время её испускания. Введенная формула гласит: «присвоить атрибуту radiusPP случайное число в диапазоне от 0.01 до 0.1».
1рГ*1
Теперь надо что-то сделать с радиусом частиц.
Если снова нажать правую кнопку напротив radiusPP и выбрать Runtime Before Dynamics Expression, снова появится Expression Editor с приглашением ввести формулу которая будет выполняться не только при рождении частицы, а в каждом кадре, пока частица жива. Об этом говорит включенная опция Runtime before Dynamics.
Снова введите формулу:
radiusPP=rand(0.01, 0.1); Нажмите Create и почувствуйте разницу между Creation и Runtime Expressions. Теперь радиус каждой частицы меняется к каждом кадре случайным образом, а не только в момент испускания.
Исправьте скорее последнюю формулу на следующую:
radiusPP=radiusPP*1.01; и не забывайте нажимать каждый раз Edit после исправления.
Не закрывайте пока Expression Editor.
Частицы начнут благостно надуваться, так как их радиус, в соответствии с формулой, немного увеличивается в каждом кадре. Причем теперь это надувание не зависит от того, имеют ли частицы конечное время жизни или живут вечно. Увеличьте время жизни до шести секунд: lifespan=6.
Запретим чрезмерное раздувание. Ограничим максимальный радиус частиц.
Исправьте последнюю формулу:
if(radiusPP<0.15) radiusPP=radiusPP*1.01;
Попробуем проанализировать высоту поднятия пузырей и остановить их на каком-нибудь уровне. Дополните последнюю формулу в Expression Editor следующим образом:
if(radiusPP<0.15) radiusPP=radiusPP*1.01; vector $pos = position; vector $vel = velocity; if ($pos.y > 2) {
velocity = << $vel.x, 0, $vel.z >>; Это означает, что если частица забралась по вертикали выше, чем на 2, её скорость по вертикали обнуляется и она продолжает движение только в горизонтальной плоскости.
Правда у нас частицы летят строго вертикально, поэтому никакого горизонтального движения после остановки не наблюдается. Добавим его.
Измените последнюю строчку, добавив к горизонтальным составляющим скорости небольшие возмущения:
if(radiusPP<0.15) radiusPP=radiusPP*1.01; vector $pos = position; vector $vel = velocity; if (Spos.y > 2) {
velocity = << $vel.x+rand(-0.01,0.01), 0, $vel.z+rand(-0.01,0.01) >>;
}
Теперь частицы начнут слегка «плавать» по поверхности. Дальнейшие эксперименты можно продолжать довольно долго. Основное достоинство использования expression состоит в том, что логика и формулы управления частицами ограничены только вашей фантазией и знанием физики с математикой.