Крайне полезным может быть и прочтение раздела документации «Useful Functions» в рубрике MEL and Expressions.

Кроме того, вам не избежать прочтения главы в этой книге, посвященной языку MEL. По крайней мере, если вы хотите знать основы синтаксиса и понять, наконец, зачем нужно ставить все эти дурацкие кавычки.

Далее, я приведу еще немного примеров для иллюстрации разных типов expressions, упомянутых выше. Я также буду предполагать, что Expression Editor уже освоен вами в совершенстве.

Циклические движения. Устаканивание с помощью expressions

Представьте себе крутящуюся на столе тарелку, точнее последнюю фазу ее движения, перед тем как она, дребезжа, затихнет на столе. Или раскачивающуюся, но не падающую бутылку, которая постепенно «устаканивается” и перестает вращаться. Попробуем изготовить формулу для описания таких вращений, ибо количество ключей, необходимых для задания такого движения, совершенно не вдохновляет на использование ключевой анимации. Но сначала немного общих принципов описания циклических движений с помощью expressions.

Циклические движения описываются обычно с помощью функций sin() и cos(), задающих перемещения по двум любым координатам. Например, создайте полигональный куб и сделайте для него простой expression:

pCubel .tx = sin(time);

pCubel.ty = cos(time); После этого куб начнет перемещаться в плоскости XY по окружности единичного радиуса. Чтобы увеличить радиус, следует просто домножить каждую функцию на свой коэффициент. В теории колебаний он называется амплитудой.

pCubel. translateX = 5.0*sin(time); pCubel.translateY = 3.0*cos(time); Если амплитуды колебаний по каждой координате разные, получится эллипс, а не окружность. Кроме амплитуды, существует еще частота колебаний, определяемая коэффициентом, на который умножается время.

pCubel.translateX = 5.0*sin(time*5.0); pCubel.translateY = 3.0*cos(time*5.0); Если частота колебаний по каждой координате разная, окружность превратится в различные «циклоиды» и вместо периодической траектории вы получите довольно экзотические колебания. Для того, чтобы колебания постепенно затухали, необходимо, очевидно, чтобы амплитуда плавно уменьшалась со временем.

«Классический» способ состоит в использовании экспоненциальной функции с отрицательным аргументом

pCubel .translateX = 5.0*exp(-0.1*time)*sin(time*5); pCubel .translateY = 3.0*exp(-0.rtime)*cos(time‘5); Более интуитивно понятный способ заключается в делении амплитуды на величину, пропорциональную времени, чтобы добиться линейного убывания амплитуды с временем.

pCubel .translateX = 5.0/(time*0.1+1)*sin(time*5); pCubel.translateY = 3.0/(time*0.1+1)*cos(time*5); Добавление единицы необходимо здесь для того, чтобы точно определять амплитуду в нулевой момент времени, а заодно для того, чтобы избежать деления на ноль.

Заметьте, что координата Z остается совершенно свободной. Вы можете задать спиралевидное движение, заставив ее равномерно увеличиваться. Это можно сделать с помощью двух ключей или же дописать в expression еще одну строку

pCubel .translateX = 5.0/(time*0.1 + 1 )*sin(time*5); pCubel .translateY = 3.0/(time*0.1+1 )*cos(time*5); pCubel. translateZ = time*0.5;


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