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