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 или анимировать его любым известным вам способом.


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