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)
{ curve -p ($x) ($y) ($z) -r “myCurve”; }
else
{ curve -p ($x) ($y) ($z) -n “myCurve"; }
}
else
{
curve -p ($x) ($y) ($z) -a “myCurve”;
}
Обратите внимание на появившийся блок else, определяющий команду создания кривой, в случае когда она не существует (например, если вы в приступе ярости ее случайно удалили).
Примечание. Эстетствующие писатели иода заметят, что можно сделать эту конструкцию более лаконичной и элегантной, меняя лишь значение флага для команды curve. Для этого, правда понадобится одна новая переменная и код станет труднее для чтения.
if{frame==1) // if (frame)
{
string $flag;
if(objExists(“myCurve”)==1) { $flag=”-r'’; } else{$flag=”-n"; J
curve -p ($x) ($y) ($z) $flag “myCurve”;
}
Примечание для хакеров. Можно еще больше укоротить код с помощью Sflag = (obj Exists (“myCurve”)) ? “-г” : “-n”; Получившийся expression представляет собой универсальный построитель процедурных кривых. Меняя лишь формулы вычисления координат точки, добавляемой к кривой, вы можете строить произвольные фигуры прямо во время анимации.
Напомню, что написанный expression является несколько «нетрадиционным». Как правило, законопослушные expressions изменяют значения атрибутов существующих объектов, производя необходимые математические вычисления и устанавливая связи между атрибутами различных объектов например, вычисляя количество оборотов колеса (rotate) при движении его по горизонтальной поверхности (translate). Про «традиционные» expressions довольно много написано в главе, посвященной анимации, в разделе «Процедурная анимация».
Наш expression не работает с атрибутами; вместо этого он меняет количество контрольных точек объекта прямо во время анимации. Чтобы как-то соблюсти приличия, добавим в наш построитель строки, читающие и использующие значения атрибутов, так, как это принято делать в обычных expressions.
Интерактивность построения кривых
Добавим немного интерактивности.
Создайте локатор.
Назовите его 1ос.
Добавьте к нему динамический атрибут с именем amp:
Modify=>Add Attribute (Attribute Name=amp; Min=0; Max=5; Default=3).
Добавьте одну строку в начале expression, int $NumPoints=500;
float $Amp=3.0, $Freq=2.0, $Density=10.0, $xSpeed=5.0; $Amp=loc.amp;
float $t=time;
float $x=$t/$xSpeed;
float $y=$Amp * sin($t*$Freq);
float $z=$Amp * cos($t*$Freq);
if(frame==1)
f
if(objExists(“myCurve”)==1)
{ curve -p ($x) ($y) ($z) -r “myCurve”; } else
{ curve -p ($x) ($y) ($z) -n “myCurve”; }
)
{
curve -p ($x) ($y) ($z) -a “myCurve”;
}
Теперь амплитуда спирали будет равна значению атрибута loc.amp в каждом кадре. Выберите локатор, откройте Attribute Editor, зайдите в раздел Extra Attributes. Запустите анимацию и шевелите слайдер у атрибута amp прямо во время проигрывания.
Таким образом, вы вручную интерактивно влияете на радиус спирали. Вы также можете ставить ключи на атрибут loc.amp или анимировать его любым известным вам способом.