Если мы найдем длину катета В, задача будет решена, так как это и есть искомое расстояние по вертикали от локатора до поршня, и нам останется написать expression, задающий связь между valLoc.translateY и porshen.translateY.
Длина гипотенузы С нам известна, это - 7.
Длина катета А тоже, это valLoc.translateZ.
Как следует из теоремы Пифагора В-'->-'2 = С2 - А2.
Создаем expression:
porshen.ty = valLoc.ty - sqrt(7*7 - valLoc.tz*valLoc.tz); Здесь sqrt - это функция, вычисляющая квадратный корень. Теперь вся конструкция исправно работает в анимации. Осталось, как обычно, навести блеск и поработать над возможными ошибками. Блеск заключается в том, что если вместо семерки вписать в expression значение атрибута scaleY для штанги
porshen.translateY = valLoc.ty - sqrt(shtanga.scaleY*shtanga.scaleY-valLoc.translateZ*valLoc. translateZ); вы сможете после этого изменять длину штанги, и весь механизм будет перестраиваться под новые размеры, продолжая корректно отрабатывать анимацию.
Работа над ошибками заключается в следующем. Если сделать длину штанги достаточно короткой, возникнет ситуация, когда она станет меньше, чем радиус вала, и поэтому в какой-то момент выражение:
shtanga.scaleY*shtanga. scale Y-valLoc.translateZ*valLoc. translateZ станет меньше нуля. Попытка вычислить квадратный корень из отрицательного выражения вызовет у MAYA приступ бешенства в виде серии сообщений об ошибках. Чтобы избежать такой ситуации, следует, очевидно, сделать проверку величины указанного выражения и в случае отрицательного значения (то есть когда штанга «отрывается от поршня») сделать высоту поршня (porshen.translateY) равным высоте локатора (valLoc.translateY).
Отредактируйте expression следующим образом:
$diff=(shtanga. scale Y*shtanga. scale Y-valLoc.translateZ*vall_oc.translateZ); if (Sdiff >0)
porshen. translateY=valLoc. translate Y-sqrt($diff); else
porshen. translateY=va ILoc. translateY; Примечание. Попытка просто взять абсолютную величину подкоренного выражения с помощью функции abs приведет к менее удачной конструкции. Можете проверить сами.
Взрослые мальчики могут переписать expression в более компактном и «красивом» виде {правда, менее понятном):
$diff=(shtanga.scale Y‘shtanga. scale Y-valLoc.translateZ*valLoc.translateZ); if($diff<0) $diff=0;
porshen.translateY=vall_oc. translate Y-sqrt($diff); Сохраните сцену (krivoshipFinal.ma).
Подумайте о связях между объектами, загляните в Hypergraph, проследите направление связей от вала к поршню.
Операция Set Driven Key. Формула произвольной гибкости Представьте себе, что нужно сделать так, чтобы цвет и прозрачность объекта изменялись в зависимости от его размера. Примером может служить надуваемый воздушный шарик или же брюхо комарихи, набухающее и краснеющее по мере его заполнения.
Первое, что приходит на ум, это написать expression с формулой зависимости цвета от размера. Однако сразу возникает несколько проблем.
Во-первых, каналов цвета три и писать формулу придется для каждого в отдельности.
Во-вторых, значение цвета для каждого канала меняется от нуля до единицы. Конечно можно подобрать коэффициент зависимости между размером и цветом, чтобы цвет менялся примерно в нужном диапазоне. Однако как быть с границами диапазона? Хотелось бы иметь ограничение типа «цвет пропорционален размеру, но не может быть больше чем 0.9». С помощью expression это можно реализовать с помощью выражения типа: