スタティックなパーティクル単位のアトリビュートについて、Maya では、0 で終わる名前を持つ、対応するアトリビュートを持っています。たとえば、位置、速度、加速度などのスタティックなアトリビュートには、対応する位置 0 (Position 0)、速度 0 (Velocity 0)、加速度 0 (Acceleration 0)があります。
名前の末尾が 0 であるアトリビュートには、そのアトリビュートの初期状態値が保存されます。パーティクル オブジェクトのアトリビュート値を初期状態値として保存すると、それらの値が初期状態アトリビュートに代入されます。
パーティクル オブジェクトのアトリビュート値を初期状態値として使用するために保存するには、ダイナミクス(Dynamics)メニュー セットから以下のいずれかのコマンドを実行します。
この場合、選択したパーティクル シェイプ(particle shape) ノードまたはリジッド ボディが持つパーティクル単位のアトリビュート値がすべて保存されます。
この場合、シーン内のすべてのダイナミック オブジェクト、つまりすべての particle shape ノードとリジッド ボディのパーティクル単位のアトリビュート値がすべて保存されます。
アトリビュート エディタ(Attribute Editor)のダイナミック アトリビュートの追加(Add Dynamic Attributes)セクションにあるボタンの 1 つをクリックして、パーティクル単位のアトリビュートを後から任意で追加すると、0 で終わる名前を持つ、対応する初期状態アトリビュートも追加されます。たとえば、アトリビュート エディタ(Attribute Editor)の不透明度(Opacity)ボタンをクリックし、パーティクル単位の不透明度アトリビュートを追加すると、opacityPP0 も追加されます。
初期状態アトリビュートはエクスプレッション エディタ(Expression Editor)には表示されませんが、たとえば print 文を使用してその値を読み取り、初期状態の回復に利用することができます。
アトリビュートの追加(Add Attribute)ウィンドウを使用してパーティクル単位(配列) (Per particle (array))のカスタム アトリビュートをパーティクル シェイプ(particle shape)ノードに追加する場合は、初期状態アトリビュートの追加(Add Initial State Attribute)オプションのオン/オフを指定する必要があります。このオプションをオンに設定すると、追加されたアトリビュートに対応する初期状態アトリビュートが作成されます。
このオプションをオフにすると、追加アトリビュートに対応する初期状態アトリビュートは作成されません。初期状態アトリビュートが存在しない場合は、パーティクル オブジェクトのアトリビュート値を初期状態値として使用するため保存できません。したがって、アニメーションを巻き戻したときのカスタム アトリビュートの初期値を指定するには、作成時のエクスプレッションを作成する必要があります。
アトリビュートの追加(Add Attribute)ウィンドウでは、パーティクル単位のアトリビュートが配列(Array)アトリビュートと呼ばれます。これら 2 つの用語は同じ意味です。詳細については、カスタム アトリビュートに代入するを参照してください。
カスタム アトリビュートを追加した場合の初期状態アトリビュートの追加(Add Initial State Attribute)オプションのオン /オフを確認するには、 Maya の listAttr コマンドを使用します (詳細については、『MEL コマンド リファレンス』を参照してください)。
エクスプレッション内で初期状態アトリビュートの値を読み取ることにより、たとえば、巻き戻し時の初期値を別の計算で使用することができます。新しいアトリビュート値を初期状態値として保存すると、初期状態アトリビュートの既存の値が上書きされます。
カスタム アトリビュートをパーティクル シェイプ(particle shape)に追加する場合は、0 で終わる名前を使用しないでください。Maya の命名規則によって名付けられる初期状態アトリビュート名と混同されます。
作成時のエクスプレッションによって初期値が設定されないアトリビュート、または初期状態アトリビュートに初期状態が保存されないアトリビュートについては、アニメーションの最初のフレームにおける既定値が自動的に割り当てられます。通常、データ型に応じて 0 または <<0,0,0>> が既定値になります。また、不透明度 PP や不透明度などのアトリビュートについては、既定値が 1 になります。
カスタム アトリビュート用の作成時のエクスプレッションを作成することが分かっている場合は、アトリビュートを追加するときに、初期状態アトリビュートの追加(Add Initial State Attribute)オプションをオフにしてください。そうでない場合は、カスタム アトリビュートを追加するときに、初期状態アトリビュートの追加(Add Initial State Attribute)オプションをオンに設定してください。
作成時のエクスプレッションによってアトリビュートに値が代入されると、存在時間が 0 であるパーティクルのアトリビュートについては、その初期状態値がすべて上オーバーライドされます。
パーティクル ツール(Particle tool)を使用して、チェッカ マーク模様の円錐を取り巻く赤いパーティクルをいくつか作成したと仮定します。パーティクルの名前は Squares です。大きなポイント サイズのポイント(Points)レンダー タイプとして表示され、そのためパーティクルは大型の不透明な正方形のように見えます。
不透明度 PP に値を代入し、各パーティクルにそれぞれ異なるランダムな不透明度を持たせる手順を以下に説明します。
パーティクル単位の不透明度 PP アトリビュートを使用するには
追加するアトリビュートをオブジェクト単位とするかパーティクル単位とするかを選択するためのウィンドウが表示されます。
これにより、Squares のパーティクル シェイプ(particle shape)ノードに不透明度 PP (Opacity PP)アトリビュートが追加されます。次に、不透明度 PP (Opacity PP)に値を設定し、各パーティクルにさまざまな不透明度を持たせます。
SquaresShape.opacityPP = rand(1); print("Hello\n");
不透明度 PP (Opacity PP)はパーティクル単位のアトリビュートであり、エクスプレッション エディタ(Expression Editor)でオブジェクトのパーティクル シェイプ(particle shape)ノードを選択しているため、エクスプレッションはオブジェクトのパーティクルごとに 1 回ずつ、上記 2 つの文を実行します。
このエクスプレッションは作成時のエクスプレッションなので、エクスプレッションのコンパイル後に実行されます。また、アニメーションの再生後に巻き戻した場合も実行されます。
個々のパーティクルについて、最初の文は不透明度 PP (Opacity PP)アトリビュートに対して、0 から 1 の範囲のランダムな浮動小数点値を代入します。rand 関数は実行されるたびに異なる乱数値を返すため、パーティクルはそれぞれ、0 から 1 の範囲内の異なる不透明度 PP (Opacity PP)を持つことになります。したがって、個々のパーティクルはその発生時に異なる不透明度を持ちます。rand 関数の詳細については、便利な関数を参照してください。2 行目のステートメントはスクリプト エディタ(Script Editor)内に各パーティクルごとに Hello と表示します。
アニメーションを再生する場合、作成時のエクスプレッションは実行されません。したがって、パーティクルは巻き戻し時に設定された不透明度をそのまま保ちます。
アニメーションを巻き戻す度に、各パーティクルにランダムな不透明度が新しく与えられます。作成時のエクスプレッションは、巻き戻しの度に、ランダム関数を実行します。
上記のエクスプレッションを、作成時のエクスプレッションではなく、ランタイム エクスプレッションとして使用する場合は、各パーティクルの不透明度はアニメーションの再生につれて、フレームごとに変化します。各フレームでランタイム エクスプレッションが実行され、各パーティクルの不透明度 PP (Opacity PP)に 0 ~ 1 の範囲のさまざまな乱数値を代入します。
前述の例の冒頭で説明したと同じような新しいパーティクル オブジェクトをパーティクル ツール(Particle tool)で作成し、Squares と名付けたと仮定します。Squares に含まれるすべてのパーティクルに単一の不透明度を与え、5 秒間のアニメーションの間に透明から不透明に変化させる手順を以下に説明します。
オブジェクト単位の不透明度アトリビュートを使用するには
追加するアトリビュートをオブジェクト単位とするかパーティクル単位とするかを選択するためのウィンドウが表示されます。
これにより、Squares のパーティクル シェイプ(particle shape) ノードに不透明度アトリビュートが追加されます。
SquaresShape.opacity = linstep(0,5,age);
各フレームが再生されるたびに、ランタイム エクスプレッションが実行されます。エクスプレッション内の文は、各パーティクルについて 1 度実行され、linstep 関数によって決まる 0 ~ 1 の範囲の同一の数値を不透明度アトリビュートに代入します(linstep 関数の詳細については、linstep を参照)。オブジェクトの作成から最初の 5 秒間に、数値は 0 から 1 へと漸増します。