Блеск заключается в добавлении еще нескольких атрибутов для дальнейшего использования (они несут в себе информацию о направлении и величине скорости), а также , как обычно, в контроле над ошибками.
Добавьте к конусу еще четыре атрибута: vx, vy, vz и velocity. Допишите в expression еще несколько строк:
locatorl .translateX=pCone1 .oldX;
locatorl .translateY=pCone1 .oldY;
locatorl. translateZ=pCone1 .oldZ;
pConel .vx=pCone1 .translateX-pConel .oldX;
pConel .vy= pConel .translateX-pConel .oldY;
pConel ,vz=pCone1 .translateX-pConel .oldZ;
pConel .velocity = mag( <<pCone1.vx, pConel .vy, pConel ,vz>> );
pConel ,oldX=pConel .translateX;
pConel .oldY=pConel .translateY;
pConel .oldZ=pCone1 .translateZ; Очевидно, что атрибуты vx, vy, vz содержат теперь координаты вектора скорости, а атрибут velocity определяется как длина вектора скорости, то есть как величина скорости. Эти атрибуты вы можете использовать в дальнейшем.
Например, конус может удлиняться, двигаясь с большой скоростью - в соответствии с общей теорией относительности…
Для этого достаточно дописать еще одну строчку в expression:
locatorl .translateX=pCone1 .oldX;
locatorl .translateY=pCone1 .oldY;
locatorl. translateZ=pCone1 .oldZ;
pConel .vx=pCone1 .translateX-pConel .oldX;
pConel .vy=pCone1. translateY-pConel .oldY;
pConel .vz=pCone1 .translateZ-pConel .oldZ;
pConel .velocity=mag(<<pCone1 .vx, pConel .vy, pConel .vz>>);
pConel .sealeY = 1 + pCone1.velocity*2.5;
pConel .oldX=pCone1 .translateX; pConel .oldY=pCone1 .translateY; pConel ,oldZ=pCone1 .translateZ; В дальнейшем вы можете использовать информацию о скорости и более интеллектуальным образом. Например, при движении с большой скоростью объект может изменять свой цвет или прозрачность. Вы также можете деформировать объект и задавать степень деформации в зависимости от скорости объекта. Такие интеллектуальные связи удобнее всего устанавливать с помощью операции Set Driven Key, о которой речь пойдет ниже.
Примечание. Чтобы добиться автоматического удлинения при разгоне и сплющивания при торможении, необходимо иметь информацию об ускорении объекта. Ускорение вы всегда можете вычислить как разницу между скоростью в текущем и предыдущем кадрах, пользуясь только что описанными выше принципами (см. сцену keyframeAcceleration.ma).
Поговорим теперь об ошибках. Когда конус останавливается, положение локатора совпадает с позицией конуса, и в этом случае конус пытается смотреть на локатор, находящийся у него в центре. Это приводит к тому, что конус просто разворачивается вдоль мировой оси X, так как констрейн не может вычислить необходимые вращения.
Чтобы избежать такой ситуации, надо, очевидно, проверить, не равна ли нулю скорость объекта, и если равна, то не надо ли производить обновления позиции локатора, оставляя его в последнем положении.
pConel .vx=pCone1 .translateX-pConel .oldX; pConel .vy=pCone1 .translateY-pConel .oldY; pConel .vz=pCone1 .translateZ-pConel .oldZ; pConel .velocity=mag(<<pCone1 .vx, pConel .vy, pConel .vz>>);
if(pCone1 .velocity!=0) {