locatorl ,translateX=pCone1 .oldX; locatorl .translateY=pCone1 .oldY;

locatorl ,translateZ=pCone1 .oldZ; pConel.scaleY = 1 + pConel. velocity*2.5;

}

pConel .oldX=pCone1 .translateX;

pConel .oldY=pCone1 .translateY;

pConel .oldZ=pCone1 .translateZ; Сохраните сцену (keyframeVelocity.ma).

Подумайте о том, как еще можно использовать информацию о скорости.

Коленвал. Преобразование типов движений с помощью expressions. Теорема Пифагора.

Разберем типичный пример совместного использования констрейнов и expressions. Expressions используются в данном случае для задания связи между объектами, не реализуемой с помощью констрейнов. А констрейны не только обеспечивают основные связи, но и служат источником информации об абсолютных координатах объектов, находящихся внутри иерархий. Пример и модель предоставлены Володей Забелиным.

Откройте файл-заготовку krivoship.ma.

В нем есть три элемента. Вращающийся вал с анимацией, штанга и поршень. Названия объектов достаточно красноречивы.

Обратите внимание, что длина штанги равняется примерно семи единицам. Наша задача состоит в том, чтобы перевести вращательное движение вала в поступательное вертикальное перемещение поршня.

Для начала закрепим один конец штанги на ручке вала. Проще всего это сделать с помощью локатора и Parent Constraint.

Создайте локатор, назовите его valLoc.

Надо приподнять его на уровень вала (translateY=7) и «припарентить» к объекту val с помощью Parent Constraint: Выберите val, затем valLoc, выполните Constrain=>Parent Constraint).

Теперь локатор вращается вместе с валом.

Внимание! Очень важно понимать одну существенную разницу между Parent Constraint и операцией Edit=>Parent. Внешне результат «припарентивания» совершенно одинаковый. Однако в случае применения констрейна в Channel Box для локатора будут высвечиваться абсолютные координаты объекта. В случае обычного «припарентивания» эти координаты будут локальными (то есть относительно вала как родительского объекта) и вообще не будут меняться, так как положение локатора относительно вала не изменяется в этом случае. Так как нам в дальнейшем понадобятся абсолютные координаты локатора для вычисления положения поршня, был использован Parent Constraint.

Теперь «прибьем» штангу к локатору.

Выберите локатор, затем штангу и выполните Constrain=>Point Constraint. Теперь штанга перемещается вместе с локатором, не вращаясь при этом.

Заставим штангу смотреть на поршень (то есть ему «в пивот»).

Выберите поршень, затем штангу и выполните Constrain=>Aim Constraint (с параметрами по умолчанию).

Штанга развернется в сторону поршня, однако не той локальной осью, которой нужно. Чтобы исправить положение, найдите в Channel Box атрибуты объекта shtanga_aimConstraint1 и задайте offsetZ=-90.

Теперь осталось согласовать вращение вала и перемещение поршня, чтобы между локатором и поршнем все время было одно и то же расстояние, равное длине штанги (в нашем случае ровно семи).

С помощью констрейнов сделать это ловко не удастся, и на помощь нам придет теорема Пифагора.

Рассмотрите прямоугольный треугольник, где гипотенузой (С) является штанга, одним катетом (А) будет расстояние от локатора до вертикальной оси Y, а вторым катетом (В) будет расстояние от поршня до прямого угла.


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