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, а вторым катетом (В) будет расстояние от поршня до прямого угла.