コードの回転部分は問題ないように見えます。ただし、どちらの場合も同じものを返すif / elseブロックがあり、@ joojaaで説明されているようにgetAttr -time
、変換値をキャッシュすると回避できます。実際、表現は避けgetAttr
てsetAttr
完全に行う必要があります。
代わりに、必要な属性を直接参照すると、Mayaが接続を作成します。これははるかに高速で、ノードの名前を変更するときなどにエラーが発生しにくくなります。
変換値をキャッシュし、位置の変化を計算するには、ノードに属性を追加して、それらを式で使用できます。
ローカルXを中心に回転し、controlというグループノードの親となるwheelという円柱があるとします。
ベクトル属性の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 );
ビュー内でノードをドラッグするのではなく、アニメーション化してこの種のことをテストするのが最善です。
ホイールを進行方向に照準を合わせたい場合は、移動+ 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;
距離で割ると、オフセットが正規化されます。おそらく、距離がゼロでないことを確認する必要があります。