ランタイム エクスプレッションを記述する

ランタイム エクスプレッションは、ダイナミクスの計算前、または後に、アニメーションの再生に伴って変化するアトリビュートを制御します。ランタイム エクスプレッション内で値が割り当てられるアトリビュートは、エクスプレッションが実行されるたびに更新されます。この更新は選択されたとおり、ダイナミクスの評価前、または後で行われます。通常、このような更新はフレームごとに 1 回ずつ発生します。

ランタイム エクスプレッションによって値が設定されないアトリビュートについては、作成時のエクスプレッションによって設定される値がアニメーションの後続のフレームで使用されます。

パーティクル グリッドを作成し、その速度(Velocity)アトリビュートに関して次のランタイム エクスプレッションを作成したと仮定します。

particleShape1.velocity = <<0,1,0>>;

アニメーションを再生すると、各パーティクル グリッドが 1 グリッド / 秒の速度で Y 軸を上方向に移動します。

本書では、パーティクルの動きを見やすくするために、ポイントではなく小さい影付きの球として各パーティクルを表現しています。

パーティクルを球として表示するには

  1. パーティクル シェイプ(particle shape) ノードを選択します。
  2. アトリビュート エディタ(Attribute Editor)レンダー アトリビュート(Render Attributes)セクションで、パーティクル レンダー タイプ(Particle Render Type)球(Spheres)を選択します。
  3. 次にアトリビュートを追加(Add Attributes For)の横の現在のレンダー タイプ(Current Render Type)ボタンをクリックします。

    ボタンの下に半径(Radius)スライダが表示されます。

  4. 半径(Radius)を調整して、球のサイズを設定します。
  5. パネル メニューから、シェーディング > すべてをスムーズ シェード(Shading > Smooth Shade All)をオンに設定します。

既定のフレーム速度(24 フレーム/秒)では、パーティクルはフレームごとにグリッドの 1/24 ずつ移動します。既定のオーバー サンプル レベル(1)では、ランタイム エクスプレッションがフレームごとに 1 回実行されます。オブジェクトの各パーティクルについて、ランタイム エクスプレッションは 1 回計算されます。

フレームごとに速度アトリビュートが一定の <<0,1,0>> に設定されるため、このエクスプレッションは冗長ということになります。したがって、このエクスプレッションは作成時のエクスプレッションにする方が適切です。ただし、この例ではどちらのエクスプレッションを使用しても効果は同じです。

パーティクルのグリッドを作成したとします。このとき、アニメーションの開始フレーム番号は 0 です。速度アトリビュートについて、次のランタイム エクスプレッションを作成します。

particleShape1.velocity = <<0,time,0>>;

アニメーションを再生すると、時間の経過に伴って増加する time 変数の値が速度アトリビュートの Y 要素に代入され、Y 軸方向の移動速度が増加します。このため、グリッド内のすべてのパーティクルは、時間の経過とともに増加する速度で上昇します (増加する速度は加速度と呼ばれます)。

ランタイム エクスプレッションでは、フレームごとにアトリビュート値を設定する必要があるため、文を使用する必要があります。

これに対し、作成時のエクスプレッション内で文を使用すると、アトリビュートが一定の値に設定されます(この例では作成時のエクスプレッションが実行される時点での time の値は 0 なので、速度が <<0,0,0>> に設定されます)。

上の例では、すべてのパーティクルの速度アトリビュートを同じ値に設定しましたが、各パーティクルのアトリビュートを異なる値に設定することもできます。

121 個のパーティクルからなるグリッドを作成したと仮定します。

このグリッドの加速度(acceleration)アトリビュートに関して、次のランタイム エクスプレッションを作成します。

particleShape1.acceleration = sphrand(2);

このランタイム エクスプレッションは、121 個のパーティクルについて、フレームごとに 1 回実行されます。

sphrand (2)関数はベクトルを提供します。このベクトルの、ランダムに選択されたコンポーネントは、原点を中心にした、半径 2 の架空の球内に存在します。パーティクルはそれぞれ、異なるベクトル値を受け取ります。sphrand 関数の詳細については、sphrand を参照してください。

各パーティクルの加速度アトリビュートには、フレームごとに異なるベクトルが代入されるため、シーンを再生すると、個々のパーティクルの移動方向と加速度が継続的に変化します。各パーティクルの加速度は、相互に独立してランダムに変化します。

重要: パーティクルの加速度を一定値にするには、作成時のエクスプレッションではなくランタイム エクスプレッションを使用して、パーティクルの加速度アトリビュートに定数を代入します。

加速度の動作は Maya によってシミュレートされます。加速度は各フレームの開始前に <<0,0,0>> に初期化されます。また、オーバー サンプル レベルが 1 より大きいときには、各タイムステップの前に同じく <<0,0,0>> への初期化が行われます。

たとえば、オーバー サンプル レベルが 2 であれば、フレームごとに 2 つのタイムステップがあり、オーバー サンプル レベルが 3 であれば、フレームごとに 3 つのタイムステップがあり、以下同様です。

アニメーションの開始フレームを 0 に設定し、パーティクル ツール(Particle Tool)を使用して 1 個のパーティクルを原点に配置したと仮定します。

パーティクルの位置を制御するため、次のランタイム エクスプレッションを作成します。

particleShape1.position = <<3,time,0>>;

アニメーションを再生すると、このランタイム エクスプレッションによってパーティクルの位置アトリビュートが制御されます。再生される最初のフレームでは、パーティクルが <<3, time, 0>> の位置に移動します。既定のフレーム速度(24 フレーム/秒)では、time の値は 0.0417 なので、パーティクルの位置は <<3, 0.0417, 0>> になります。

2 番目以降のフレームでは、time の増加する値に同期してパーティクルが上昇します。

アニメーションを停止して巻き戻すと、パーティクルは原点(パーティクル ツール(Particle Tool)でパーティクルを作成した時点の初期位置)に戻ります。パーティクルを作成すると、その初期位置が Maya の内部的な初期状態アトリビュート(名前は position0)に保存されます。詳細については、初期状態アトリビュートについてを参照してください。

位置アトリビュートには、その値を制御する作成時のエクスプレッションが存在しないため、初期状態アトリビュート(position0)の値である <<0,0,0>> に設定されます。

巻き戻し後にパーティクルがこの原点に戻らないようにするには、ランタイム エクスプレッションと同じ内容の作成時のエクスプレッションを作成します。

particleShape1.position = <<3,time,0>>;

アニメーションを巻き戻すと、パーティクルは <<3,time,0>> の位置に移動します。フレーム 0 の time は 0 であるため、パーティクルは <<3,0,0>> の位置に移動します。2 番目以降のフレームでは、time の増加する値に同期してパーティクルが上昇します。

この例では作成時のエクスプレッションを使用して位置アトリビュートを初期化する方法を示しましたが、オブジェクトのアトリビュート値を初期状態値として使用できるよう保存しても、ほぼ同じ結果が得られます。

オブジェクトのアトリビュート値を初期状態値として保存するには

  1. パーティクル シェイプ(particle shape) ノードを選択します。
  2. アニメーションをフレーム 1 に進めます。

    この場合パーティクルの現在位置は <<3, 0.0417, 0>> です。

  3. ダイナミクス(Dynamics)メニュー セットからソルバ > 初期状態 > 選択項目に設定(Solvers > Initial State > Set for Selected)を選択します。

    アニメーションを巻き戻すと、オブジェクトは位置アトリビュートの初期状態値に移動します。パーティクルの位置が <<3, 0.0417, 0>> であったときに選択項目に設定(Set for Selected)を選択したため、位置アトリビュートの初期状態値は <<3, 0.0417, 0>> です。