Внимание!! Если вы встречаете примеры на создание Runtime Expression или сами начинаете экспериментировать, создавайте Runtime BEFORE Dynamic, выполняющийся до динамики. Оставьте создание Runtime after Dynamic до тех времен, когда вы точно будете знать, что хотите проделать над частицами некоторые действия после вычисления динамики.
Вычисление динамики означает складывание всех сил, производимых полями и расчет результирующих ускорений для частиц, на которые действуют поля. Расчет столкновений также вычисляется динамикой.
Чтобы почувствовать разницу между before Dynamics и after Dynamics, откройте файл smoke.та.
Для того, чтобы сделать дымок не таким тонким и слегка его надуть изнутри, выберите частицы и создайте для них следующий Runtime before Dynamic Expression:
acceleration = sphrand(1); Это придаст каждой частице небольшое ускорение в случайном направлении. А затем динамика добавит силу турбулентности и гравитации. Дымок станет более объемным, а приведенный expression является универсальным трюком для «раздувания» частиц.
Однако, если вы удалите этот expression и создадите Runtime after Dynamic Expression с такой же формулой, частицы просто не отреагируют на ваши суетливые действия с ускорением и будут двигаться, как раньше. Это связано с тем, что динамика сбрасывает ускорения частиц в ноль перед каждым новым кадром и для расчета новых ускорений берет силы полей и то состояние, что было перед ними (так положено по физике и математике).
Это ещё раз должно убедить вас использовать по умолчанию Runtime before Dynamic Expression.
Работа со скоростью и ускорением Ключевыми атрибутами для анимации частиц являются скорость (velocity) и ускорение (acceleration). Если остальные атрибуты (кроме массы) носят информативный характер или служат для изменения внешнего вида или времени жизни, то эти два атрибута воздействуют на траектории частиц непосредственно. Для эффективной работы с ними весьма желательно иметь представление, что такое вектор, и, что самое неприятное, уметь складывать и вычитать вектора.
Сделаем небольшой пример.
Создайте обычный источник частиц, задайте ему emitterType=Directional, rate=24, speed=5.
Если ваша машина просит апгрейда, задайте время жизни частиц равным десяти: lifespan=10.
Создайте локатор: Create=>Locator.
Назовите его 1ос, чтобы сэкономить время при написании expression и поощрить свою лень.
Сдвиньте его немного вверх.
Для частиц создайте такой Runtime Expression (здесь и далее, я буду подразумевать Runtime before Dynamic Expression):
vector $vloc = <<loc.tx,loc.ty,loc.tz>>; vector $vpos = position; vector $vres = $vloc - $vpos; acceleration = $vres+sphrand(1); Первая строка определяет вектор, торчащий из начала координат, в точку, где находится локатор. Этот вектор одинаков для всех частиц, так как от них не зависит.
Вторая строка определяет вектор, торчащий из начала координат, в точку, где находится конкретная частица. Этот вектор для каждой частицы свой.
Примечание. Три числа, определяющий вектор, задают направление и длину вектора. Но не точку его приложения. Вектор не привязан к конкретной точке, и для представления его рисуйте его мысленно торчащим из начала координат в точку с координатами, равными компонентам вектора.