pCylinderl .translateY=0.7/(time*3+1); Однако тогда вам придется дополнительно останавливать вконец обезумевшую тарелку.

Наведем некоторый блеск и подготовим тарелку к дальнейшей анимации. «Блеск» заключается в том, что надо отследить возможное возникновение математических ошибок (типа деления на ноль) и «вывести наружу» некоторые коэффициенты для дополнительной ручной анимации частоты вращения.

Во-первых, функция арксинус не может принимать в качестве аргумента значения больше единицы (ведь синус в мирное время больше единицы не бывает).

Поэтому надо проверить значение translateY и принять меры.

if (pCylinderl ,translateY<1) $amp = asind(pCylinder1.translateY); else $amp=90.0;

Sspeed = 5.0/(pCylinder1 .translateY+0.01);

pCylinderl .rotateX=$amp*sin(time*$speed );

pCylinderl .rotateZ=$amp*cos(time*$speed ); Во-вторых, если значение translateY равно нулю, это означает, что тарелка полностью «легла» на землю. По существующей формуле частота колебаний (Sspeed) будет равна 500. Однако, к счастью, значение амплитуды $атр, вычисляемой через арксинус, будет в этом случае равно нулю.

В-третьих, вы можете также сделать проверку и задать, что будет происходить, когда тарелка уйдет под землю, то есть translateY станет меньше нуля. Однако я предлагаю избавить себя от этой головной боли и задать в Attribute Editor нижний предел перемещений по оси Y равным нулю.

В-четвертых, число 5.0 следует вывести наружу в виде атрибута объекта, для того, чтобы можно было вручную задавать замедление или ускорение вращения.

Выберите цилиндр, добавьте к нему атрибут speed:

Modify=>Add Atrribute (Attribute Name=speed; Minimum=-100; Maximum=100; Default=5).

Исправьте expression следующим образом:

if(pCylinderl .translateY<1) Samp = asind(pCylinder1 .translateY);

else $amp=90.0;

Sspeed = pCylinderl .speed/(pCylinderl.translateY+0.01); pCylinderl .rotateX=$amp*sin(time*$speed ); pCylinderl .rotateZ=$amp*cos(time*$speed ); Теперь вы можете ставить ключи на атрибут speed, управляя скоростью вращения. В-пятых, дальнейшие улучшения практически безграничны. Вы можете добавить также горизонтальные смещения центра цилиндра - для пущей реалистичности:

if (pCylinderl. translateY<1) $amp = asind(pCylinder1 .translateY);

else $amp=90.0;

Sspeed = pCylinderl. speed/(pCylinderl. translateY+0.01); pCylinderl .rotateX=$amp*sin(time*$speed ); pCylinderl .rotateZ=$amp*cos(time*$speed );

pCylinderl .translateZ=$amp/100.0*sin(time*$speed ); pCylinderl ,translateX=-$amp/100.0*cos(time*$speed ); Коэффициент 100.0 также можно вывести наружу в виде атрибута объекта.

Наиболее пытливые умы могут придумать формулу вращения вокруг оси Y, чтобы обеспечить «непроскальзывание» (хотя реальная тарелка как раз активно проскальзывает). Не забудьте только поменять порядок вращений в Attribute Editor на Rotate Order=”yxz”.

Сохраните сцену (plate.та).

Если вы хотите еще немного поиграть с тарелкой, поставьте ключи на атрибут translateY:

Frame 1: translateY=0.8;

Frame 50: translateY=0.2;

Frame 100: translateY=0.5;

Frame 200: translateY=0;


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