Теперь по поводу разницы в функциональности. Скрипт - это набор команд на языке MEL, который выполняется по вашему требованию, то есть когда вы сами его запустите. Хранится он, как правило, на диске в виде текстового файла и не является частью сцены (про ScriptNode -отдельный разговор ниже).
Expression - это тоже набор команд. Но во-первых, эти команды хранятся в виде ноды и являются частью сцены, то есть хранятся внутри нее. А во-вторых, эти команды выполняются не по вашему желанию, а, грубо говоря, при смене номера кадра при анимации. Каждый раз когда происходит переход к следующему кадру (или вы неловко ткнете мышкой в TimeLine), выполняются все незаблокированные expressions, присутствующие в сцене. Также выполнение expressions происходит с том случае, когда один из объектов, чьи атрибуты используются в expression, изменяет значение своих атрибутов.
Таким образом, если вы проиграли двести кадров анимации, все expressions выполнятся по двести раз. Поэтому expressions используются, как правило, не для интенсивных расчетов и вычислений, а для задания логических связей между объектами (точнее говоря, между атрибутами объектов).
И хотя в expressions можно использовать любые MEL-команды, следует соблюдать некоторые меры безопасности. Нельзя без особой причины создавать объекты с помощью expressions: они могут начать плодиться с жуткой скоростью, ведь выполнение expressions происходит в каждом кадре. Не следует также обращаться к файлам или функциям операционной системы, поскольку вы можете быстро израсходовать системные ресурсы. Начинайте применение expressions для автоматизации анимации и связывания движений (или других свойств) нескольких объектов между собой.
Теперь по поводу разницы в синтаксисе.
Во-первых, в expressions вы можете запросто прочитать значение текущего кадра (или времени в секундах) просто обратившись к системной переменной frame (или time). Например,
if ( frame >100 ) $t=time; В скриптах для работы со временем вам придется вызывать команду currentTime с некоторыми флагами:
if ( 'currentTime -q'>100 ) $t=('currentTime -q ') / 24.0; Во-вторых, в отличиеот скриптов, использующих для непосредственной работы с атрибутами объектов команды getAttr и setAttr, для expression существует форма «фамильярного» обращения к значениям атрибутов объектов как к переменным, минуя вызов любых команд. Например:
$х = pSphere.tx; pCube.ty = sin (pSphere.ty); В скрипте пришлось бы использовать конструкцию типа
$х = 'getAttr “pSphere.tx” ';
setAttr “pCube.ty” {sin('getAttr “pSphere.ty” ')); На вопрос, почему существуют такие различия в синтаксисе, я вам ответить не смогу, по крайней мере официально и литературно. Так уж устроена MAYA…
Нетрадиционные выражения. Выращивание объектов в анимации Вернемся однако к построению процедурных кривых. И напишем довольно нетипичный expression, который ничего не делает с атрибутами объектов, но выращивает кривую, наподобие испускания частиц.
Пытливые умы наверняка заметили, что при построении кривой с помощью цикла использовалась переменная $t, которая просто тихо и мирно увеличивалась в ходе выполнения цикла, сильно напоминая увеличение времени (или номера кадра) в ходе анимации. В чей-нибудь разгоряченный MEL-ом разум обязательно придет мысль использовать вместо цикла expression, а вместо переменной $t системное время как увеличивающийся параметр. Дадим жизнь этой пламенной мысли.