В абсолютно пустой сцене создайте новый 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), позволяющий не добавлять, а заменять точки на существующей кривой. Поэтому в первом кадре вместо команды удаления должна выполняться команда замены точек кривой. Выглядеть это будет примерно так: