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;