Очень часто для эффективного использования expressions приходится добавлять к объектам дополнительные атрибуты и сохранять в них вспомогательную или промежуточную информацию, например, о состоянии объекта в предыдущем кадре или расстоянии от него до определенной точки. Помните о том, что expressions выполняются в каждом кадре и такая информация помогает задавать дополнительные свойства атрибута - например, скорость. (Пример использования скорости объекта для его ориентации будет приведен ниже.)

Узнать значение нужного атрибута в любом кадре можно с помощью функции getAttr с флагом -time. Например:

pCube2.tx = 'getAttr -time (frame -10) pCubel.tx';

pCube3.tx = getAttr -time (frame -20) pCubel.tx';

pCube4.tx = 'getAttr-time (frame -30) pCubel.tx'; Однако использовать функции getAttr и setAttr в expressions крайне нежелательно. (Об этом еще скажу позже.) Для создания «отстающей» или «догоняющей» анимации лучше всего подойдет использование клипов (см. раздел, касающийся нелинейной анимации). Для объектов, анимированных с помощью динамики, такой трюк, однако, не пройдет, так как AAAYA не «знает» (точнее, не «запоминает»), где будет или где был объект некоторое время назад (в этом случае может помочь кэширование).

Expression нередко используются совместно с констрейнами для «сборки» анимированных конструкций. Дело в том, что некоторые свойства - например, ориентацию в сторону цели - удобно задавать с помощью констрейнов, а взаимодействие объектов можно определять через expressions. Помните только о том, что expression и констрейны не должны воздействовать на одни и те же каналы (если только вы намеренно не смешиваете два типа анимации).

Также следите за тем, чтобы не возникали циклические зависимости - например, первый объект «прибит» ко второму с помощью Point Constraint и в то же время влияет на перемещения второго посредством expression типа:

object2.tx=-1.5*object1 .ty; Если вы на свой страх и риск создаете объекты прямо в expressions с помощью MEL-команд (или, совсем потеряв совесть, удаляете объекты), надо понимать, что при возвращении в первый кадр никто за вас не будет делать Undo: ведь это не динамика с ее начальным положением системы. в этом случае, вы можете сделать нужные действия в первом кадре с помощью конструкции if(frame==1), например:

if (frame==1) { delete "myObject*”; $counter=0; }

Примечание. Про разницу между «=» и «==» можно прочитать в главе про MEL.

Объекты, анимированные с помощью expressions, не имеют, очевидно, никаких анимационных кривых. Однако вы всегда можете превратить процедурную анимацию в анимацию по ключам с помощью операции Edit=>Keys=>Bake Simulations. Это может, например, понадобится для экспорта сцены в другие пакеты или движки, ничего не знающие про механизм expressions. Операция Bake Simulations предназначена не только для преобразования динамической симуляции в анимационные кривые, а может использоваться для перевода любого типа анимации в анимацию по ключам.

Примечание. Для написания эффективных expressions вам придется открыть старые школьные учебники и освежить давно утраченные сакральные знания по примитивной тригонометрии, простейшей алгебре и элементарной арифметике. В идеале термины «квадратный корень» или -длина вектора» не должны валить вас с ног. К сожалению, я не видел на русском языке книги «Высшая математика для чайников», а ведь она могла бы быть крайне полезна для не поступающих в вузы.


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