Управление динамикой посредством анимации

или
Делаем нечеловеческие эффекты человеческим способом :)))

Сразу вначале повествования хотел бы сказать, что не претендую на оригинальность (возможно, кое-кто из наших гуру по Майе уже поднимали эту тему). Мне хотелось бы рассказать здесь о том, как можно управлять динамикой, используя стандартную keyframe анимацию. Многие трехмерщики в работе, возможно, сталкивались с проблемой слабой управляемости динамических эффектов.
Я с этой проблемой столкнулся несколько лет назад, когда мне нужно было создавать большое количество разнообразных эффектов, в частности взрывов и анимации одежды. Итак, приступим.
Начнем с самого простого примера. Итак попробуем смоделировать простой наземный взрыв. Создадим группу из 50 частиц с радиусом 2, назовем ее "Explode" (здесь и далее я буду дублировать свои слова командами меловского скрипта):

particle -n Explode -jbp 0 0 0 -nj 50 -jr 2 -c 1 ;

В Attribute Editor'е (далее AE), поменяем тип частиц на cloud и устанавливаем параметр threshold в 0.75:

setAttr "ExplodeShape.threshold" 0.75;

Теперь к частицам добавим динамический аттрибут, этот аттрибут назвается radiusPP:

addAttr -ln radiusPP -dt doubleArray ExplodeShape;

либо AE>general>particle>radiusPP.

Далее, понятно, что для моделирования взрыва нужно придать частицам начальную скорость разлета. Для этого можно воспользоваться например radial field. Я, с вашего позволения, воспользуюсь своими разработками - я люблю для этого дела использовать скрипты. Итак, небольшая программка:

float $Ro;
float $Fi;
float $Teta;
int $ii;
int $ind;
for ($ind=0;$ind<50;$ind++)
{
$Ro = rand (2,7);
$Fi = `deg_to_rad(rand (0, 360))`;
$Teta = `deg_to_rad(rand (0, 90))`;
$rad = rand(1, 1.5);
float $PosX=$Ro*cos($Fi)*sin($Teta);
float $PosY=$Ro*cos($Teta);
float $PosZ=$Ro*sin($Fi)*sin($Teta);
particle -e -or $ind -at velocity -vv $PosX $PosY $PosZ ExplodeShape;
particle -e -at radiusPP -or $ind -fv $rad ExplodeShape; //Строчка делает разный размер для каждой частицы.
};

В этой программке я задаю направление вектора скорости частиц в сферических координатах. Итак, мы получили разлетающиеся частицы по оси Y. Хорошо. Они разлетаются равномерно и прямолинейно (по умолчанию ускорение частиц равно 0). Теперь я хочу, имея полученную картину, смоделировать вразумительный взрыв. Немного пояснений. УвеличитьЛюбая динамика в Майе работает с солвером (не буду углубляться в детали, но если говорить проще - то это нод, в который мы подсовываем глобальное время в сцене, а он нам генерит позиции объектов, имеющих динамику, в данном случае это частицы). Идея заключается в том, чтобы подсунуть вместо глобального времени анимацию, тогда нам будет довольно легко настроить фазы развития нашего взрыва. Ну приступим. Выделяем наши частицы, ищем аттрибут currentTime, далее отправляемся в нулевой кадр и делаем операцию breakConnections:

CBdeleteConnection "ExplodeShape.cti";

Частицы двигаться прекратили (разумеется, время не меняется и солвер все время считает позицию для нулевого кадра). Теперь все просто. Анимируем параметр currentTime и подгоняем под наше представление о фазах развития взрыва - к примеру значения frame 0 - currentTime 0, frame 4 - currentTime 27, frame 15 - currentTime 47, frame 30 - currentTime 51. Ну, допустим, со скоростью разлета мы определились. Теперь хотелось бы чтобы менялся еще и размер частиц в процессе разлета. Для этого напишем runtime expression:

ExplodeShape.radiusPP = mag(ExplodeShape.position)/3;

Увеличитьразмер частицы меняется в зависимости от позиции. Далее достаточно анимировать параметры particleCloud1 и получаем взрыв. Теперь предлагаю коротенько рассмотреть другие примеры применения этой технологии.
УвеличитьПример - создание эффекта замедленной съемки при использовании предметов с динамикой твердых тел. Итак делаем сценку из 16 кубиков и шара. Нажимаем play все проигрывается равномерно. . Теперь заходим в пункт F4>Solvers>rigidSolver.Подробности Видим наличие того же самого аттрибута currentTime. C ним мы работать уже умеем. Итак делаем кадры 0-0, 40-40, 200-50, 260-121. В результате наших "злодеяний" с 40 по 200 кадры динамика как бы "замедляется" . Аналогичные вещи можно проделать и с одеждой и без особых ухищрений получить эффект замедления. Итак, благодарю за внимание.

Примеры : DynamicTest.mb, ParticleDynamics.mb

1
2009-04-09
Очень полезно, просто спас меня этот угок!!! я через клипы пытался но не выходило.
RENDER.RU