0

Mayaでこの式でいくつかの問題が発生しました。基本的に、半径が1未満の場合は常に、計算があまりにも多くなりすぎます。

float $radius = `getAttr prefix66_calculations_shape.rad`;
float $prevZval = `getAttr -time (frame -1) prefix66_driver.translateZ`;
float $prevXval = `getAttr -time (frame -1) prefix66_driver.translateX`;
float $Zval = prefix66_driver.translateZ - $prevZval;
float $Xval = prefix66_driver.translateX - $prevXval;
float $distance = ($Zval * $Zval) + ($Xval * $Xval);
float $direction;
$distance = sqrt($distance);
if ($prevZval > prefix66_driver.translateZ) {
    $direction = 360;
}
else { 
    $direction = 360;
}
float $rotation = ($distance / (2 * 3.142 * $radius)) * $direction;
print $rotation;
pCube1.rotateX = pCube1.rotateX + $rotation;

たぶん私の操作の順序が間違っていますか?

4

2 に答える 2

1

コードの回転部分は問題ないように見えます。ただし、どちらの場合も同じものを返すif / elseブロックがあり、@ joojaaで説明されているようにgetAttr -time、変換値をキャッシュすると回避できます。実際、表現は避けgetAttrsetAttr完全に行う必要があります。

代わりに、必要な属性を直接参照すると、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;

距離で割ると、オフセットが正規化されます。おそらく、距離がゼロでないことを確認する必要があります。

于 2013-02-17T22:09:07.713 に答える
0

私はそれを理解したと信じています:)

Queering the old traslation average, with the new translation average will give me a true or false answer, which is what I needed to change direction.

Also added an if statement that if the ball is static and rotating, that the wheel doesn't turn automatically.

float $oldRotateAverage;
float $oldTransAverage;
float $direction;

nurbsCircle1.DeltaTranslateX = nurbsCircle1.translateX - nurbsCircle1.LastTranslateX;
nurbsCircle1.DeltaTranslateY = nurbsCircle1.translateY - nurbsCircle1.LastTranslateY;
nurbsCircle1.DeltaTranslateZ = nurbsCircle1.translateZ - nurbsCircle1.LastTranslateZ;
nurbsCircle1.LastTranslateX = nurbsCircle1.translateX;
nurbsCircle1.LastTranslateY = nurbsCircle1.translateY;
nurbsCircle1.LastTranslateZ = nurbsCircle1.translateZ;
nurbsCircle1.Distance = mag(<<nurbsCircle1.DeltaTranslateX,nurbsCircle1.DeltaTranslateY,nurbsCircle1.DeltaTranslateZ>>);

if ($oldTransAverage >= (nurbsCircle1.LastTranslateX + nurbsCircle1.LastTranslateY + nurbsCircle1.LastTranslateZ)){
    $direction = -360.00;
} else {
    $direction = 360.00;
};

if (Sh54_anim.auto == 1 )
{
    Sh54_point_grp.rotateZ -= nurbsCircle1.Distance * $direction / 2 / 3.14 / 2;    
};

if ((nurbsCircle1.rotateX + nurbsCircle1.rotateY + nurbsCircle1.rotateZ) != $oldRotateAverage && nurbsCircle1.Distance == $oldTransAverage){
    Sh54_anim.auto = 0;
} else {
    Sh54_anim.auto = 1;
};

Sh54_point_grp.back_up = Sh54_point_grp.translateX;
$oldRotateAverage = nurbsCircle1.rotateX + nurbsCircle1.rotateY + nurbsCircle1.rotateZ;
$oldTransAverage = nurbsCircle1.translateX + nurbsCircle1.translateY + nurbsCircle1.translateZ;
于 2013-02-19T08:33:41.467 に答える