В абсолютно пустой сцене создайте новый expression. Вставьте в него упомянутый выше скрипт для построения кривых в цикле (файл scripts.txt) и отредактируйте его, убрав команду и скобки цикла (он теперь не нужен), удалив строку refresh и команду удаления первой точки. Код этого expression должен выглядеть так:

int $NumPoints=500;

float $Amp=3.0, $Freq=2.0, $Density=10.0, $xSpeed=5.0;

float $t=time;

float $x=$t/$xSpeed;

float $y=$Amp * sin($t*$Freq);

float $z=$Amp * cos($t*$Freq);

if(frame==1)

{

if(objExists("myCurve”)==1) { delete “myCurve”; } curve -p ($x) ($y) ($z) -n "myCurve”;

}

else

{

curve -p ($x) ($y) ($z) -a “myCurve”;

}

Помните о том, expression выполняется в каждом кадре, поэтому никакой цикл нам больше не нужен!

Вместо этого в каждом кадре вычисляются значения переменных $t, $х, $у, $z на основе значения системной переменной time, содержащей текущее время анимации в секундах. Эти переменные затем используются для добавления в каждом кадре новой вершины к существующей кривой myCurve.

Тут следует провести аналогию с испусканием частиц, которые, как правило, исчезают при возвращении в первый кадр. Точно так же, наша кривая должна исчезать или «обнуляться» при перемотке назад в первый кадр.

Поэтому при помощи конструкции

if(frame==1)

{

if(objExists(“myCurve”)==1) { delete “myCurve”; } curve -p ($x) ($y) ($z) -n “myCurve”;

}

делается проверка, является ли кадр первым, и если да, то в нем производится удаление кривой myCurve, если она уже существует, и она создается заново.

Блок

{

curve -р ($х) ($у) ($z) -a “myCurve”;

}

говорит: в противном случае (то есть, если кадр не первый) во всех остальных кадрах надо просто добавлять точку с координатами $х, $у, $z к уже созданной в первом кадре кривой.

Надо заметить, что начальный кадр диапазона анимации должен быть строго первым (равным единице), чтобы expression успешно выполнял удаление в первом кадре. Если номер начального кадра анимации равен 1.04 или 10, то expression не будет работать корректно.

Если expression заработал, можно сохранить сцену (curveBuilder.ma). Лучше всего сохранять ее не в первом кадре, так как в начальный момент кривая myCurve состоит всего из одной точки и в процессе сохранения теряет часть информации (установлено опытным путем). После открытия сцены expression не может добавить точки к такой вырожденной кривой. Поэтому сохраняйте сцену в кадре, где уже присутствует несколько сегментов кривой.

В принципе, универсальный испускатель процедурных кривых практически готов. Остаются некоторые шероховатости.

Например, некоторые любознательные умы создали окружность (Create=>NURBS Primitives=>Circle) и, выбрав ее вместе с пророщенной кривой, выполнили операцию Surfaces=> Extrude, получив при этом трубку, которая, благодаря Construction History, растет вместе с кривой.

Однако, вернувшись в первый кадр, создатели трубок обнаружат, что Construction History пропала и поверхность больше не обновляется. И это совершенно предсказуемо: ведь в первом кадре происходит удаление кривой myCurve. Если бы можно было, не удаляя кривой, как-нибудь ее «обнулять», это бы решило проблему сохранения Construction History. Хакерствующие умы, покопавшись в описании к команде curve, наверняка уже обнаружили флаг -г (-replace), позволяющий не добавлять, а заменять точки на существующей кривой. Поэтому в первом кадре вместо команды удаления должна выполняться команда замены точек кривой. Выглядеть это будет примерно так:


⇐ вернуться назад | | далее ⇒