Вращательная часть вашего кода выглядит нормально. Однако у вас есть блок if/else, который возвращает одно и то же в обоих случаях, и, как упоминалось в @joojaa, вы можете избежать getAttr -time
, если кешируете значения перевода. На самом деле вам следует полностью избегать getAttr
и setAttr
.
Вместо этого обратитесь к атрибутам, которые хотите напрямую, и Майя создаст для вас соединения. Это намного быстрее и менее подвержено ошибкам при переименовании узлов и т. Д.
Чтобы кэшировать значения перевода и рассчитать изменение позиции, вы можете добавлять атрибуты к узлу и использовать их в выражении.
Допустим, у вас есть цилиндр под названием колесо, которое вращается вокруг своего локального X и основателями в группу узлов, которая называется управлением:
Добавить векторную атрибут: control.lastTranslate
Добавить векторную атрибут: control.deltaTranslate
Добавить float: control.distance
Вот выражение, которое сохранит изменение в переводе, а затем поверните колесо в зависимости от пройденного расстояния.
// When deltaTranslate is calculated, lastTranslate still has its previous value.
control.deltaTranslateX = control.translateX - control.lastTranslateX;
control.deltaTranslateY = control.translateY - control.lastTranslateY;
control.deltaTranslateZ = control.translateZ - control.lastTranslateZ;
control.lastTranslateX = control.translateX;
control.lastTranslateY = control.translateY;
control.lastTranslateZ = control.translateZ;
control.distance = mag(<<control.deltaTranslateX,control.deltaTranslateY,control.deltaTranslateZ>>);
// Get radius from history node (or somewhere) and move the wheel's hub off the floor.
wheel.translateY = polyCylinder1.radius;
// add rotation to the wheel
float $tau = 6.283185307179586;
wheel.rotateX = wheel.rotateX + (control.distance* -360.0)/(polyCylinder1.radius * $tau);
Лучше всего протестировать подобные вещи, анимируя, а не перетягивая узлы вокруг.
Если вы хотите, чтобы колесо направлялось в направлении движения, вы могли бы добавить локатор в translate + deltaTranslate и подключить ограничение цели.
например.
aimLocator.translateX = (control.deltaTranslateX/control.distance) + control.translateX;
aimLocator.translateY = (control.deltaTranslateY/control.distance) + control.translateY;
aimLocator.translateZ = (control.deltaTranslateZ/control.distance) + control.translateZ;
Деление по расстоянию нормализует смещение. Вероятно, вы должны проверить, что расстояние не равно нулю.
Чего вы пытаетесь достичь? Если это колесо автомобиля, вам нужно учесть угловое колесо вашего колеса в направлении движения. в любом случае do ** NOT ** use ** 'getAttr -time (frame -1) prefix66_driver.translateZ' ** кэшировать форму аннулирования последнего кадра. – joojaa
Я прочитал ваше последнее сообщение, я потратил около 3 часов на узел framecache, хотя он не обновлялся динамически, как в случае, если я должен был подключить перевод Z в поток, что когда-либо имело значение, когда оно было подключено , он не обновляется со временем. Я не понимаю, как использовать node.cacheTx = objname.tx; node.tx = узел.cacheTx; будут работать, не будут ли они равными точно таким же значениям? –
PS: Я пытаюсь автоматизировать скорость передвижения колеса, перемещаемого в локальном направлении, это работает почти без проблем, только проблема - это объекты меньшего размера с радиусом менее 1, кажется, неправильно оценивают. –