冗長なエクスプレッションの実行を回避する

エクスプレッションの文に冗長な計算が含まれている場合は、エクスプレッション エディタの常時評価(Always Evaluate)オプションをオフにすると、アニメーションの再生スピードを改善することができます。この機能がどんな場合に役立つかを理解するには、エクスプレッション実行の詳しい仕組みをあらかじめ理解しておく必要があります。

一般的には、アニメーション時間が変化するたびにエクスプレッションが実行されます。また、エクスプレッションによって読み取られるアトリビュートの値が変わった場合、さらに下記のいずれかの状況が発生した場合にも、エクスプレッションが実行されます。

この場合、Maya の定義済み変数である時間(time)とフレーム(frame)も、エクスプレッションによって読み取られるアトリビュートとみなされます。

たとえば、NURBS 球を X 軸に沿ったときの 2 倍の速度で Y 軸に沿って移動するため、次のエクスプレッションを作成したと仮定します。

nurbsSphere1.translateY = 2 * nurbsSphere1.translateX;

ワークスペース内で移動ツール(Move Tool)を使用して X 軸方向に球をドラッグすると、移動 X (translateX)アトリビュートの値が変化するたびにエクスプレッションが実行されます。

X 軸方向に球をドラッグすると、エクスプレッション内の移動 X (translateX)アトリビュートの値が変化します。また、球の動きに伴ってワークスペースの表示が更新されると、エクスプレッション内の移動 Y (translateY)アトリビュートの値が変化します。このため、エクスプレッションが実行されます。

エクスプレッション エディタの常時評価(Always Evaluate)オプションをオフにすると、print 関数文、変数への代入、またはアトリビュート値の読み取りを伴わない代入だけからなるエクスプレッションは実行されません。

global float $BallHeight = 5;
print($BallHeight+"\n");
nurbsSphere1.tx = rand(1);
print(nurbsSphere1.tx+"\n");

1 番目の文は、$BallHeight 変数を宣言して値を代入しています($BallHeight はアトリビュートではありません)。2 番目の文は、$BallHeight 変数の値を出力するだけで、アトリビュートに値を代入していません。

次の文は、アトリビュートに値を代入しますが、その値は乱数関数 rand によって生成されています。rand 関数はアトリビュート値を読み取りません。rand 関数の詳細については、rand を参照してください。

最後の文は、アトリビュートの値を読み取って出力するだけで、アトリビュートに値を代入していません。

エクスプレッション エディタの常時(Always)評価オプションをオフに設定している場合は、これらのどの文によってもエクスプレッションは実行されません。

常時(Always)評価オプションは、作成または編集の対象となっているエクスプレッションだけに影響を与えます。したがって、個々のエクスプレッションについてすべて評価のオン / オフを選択することができます。

多くのアニメーションでは、常時(Always)評価オプションがオンに設定されているか否かに関わらず、エクスプレッションが実行されます。懸念がある場合は、このオプションをオンに設定してください。