Если мы найдем длину катета В, задача будет решена, так как это и есть искомое расстояние по вертикали от локатора до поршня, и нам останется написать 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 это можно реализовать с помощью выражения типа:


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