CG, Maya

Mayaのお勉強

ずーっと使っていなくて、すっかり忘れてしまったので Maya の勉強をしてみました。

今日のテーマは “Maya内部でのパーティクルの扱われ方”。

1.パーティクルを作ってみよう
オンラインレッスンを参考に、パーティクルを作成します。 ボリューム軸フィールドまで作成したら Hypergraph で観察します。

2.ノードの繋りを確認してみよう
ここまでで作られたノードの繋りを確認します。


Hypergraph

nurbsCurve の形状を元に emitter でパーティクルを生成して particleShape1 に送っているのがわかります。ここで注目するのが particleShape1 と volumeAxisField1 ノードです。それ以外はとりあえず気にしないでおきます。

particleShape1 と volumeAxisField1 で繋がっているのは fieldData、ppfieldData と outputForce です。
それぞれの内容をマニュアルで確認してみます。

まずはparticleノードから。

fieldData: パーティクルデータをまとめて保持しているパラメータです。この中にあるパラメータは実体へのポインタを差しているようです。

ここで注目したいのが、パーティクル一つ一つがデータを保持しているわけではなく、あるパラメータの配列に各パーティクルの値が格納されていることです。

コードで書くとこんな感じ:

struct particle {
vector3 pos;
vector3 vel;
double mass;
time_t time;
};

こうではなく、

vector3 pos[numParticles];
vector3 vel[numParticles];
double mass[numParticles];
time_t time[numParticles];

となっているということです。

オブジェクト指向的には前者の方が気持ちいいですが、パーティクルのようなデータの場合、後者の方が計算する時の効率が良さそうです。

ppFieldData: 特殊なアトリビュートの配列らしいです。よくわかりませんが今回は関係ないのでパス。

次にField

outputForce: 入力されたパーティクルそれぞれに対応する外力を配列で返しています。

3.中のデータを確認してみよう
実際にノード間でやりとりされるデータを確認してみます。

それぞれの値を確認してみます。

vector $v[] = `getAttr particleShape1.fieldData.fieldDataPosition`;
print $v;
vector $v[] = `getAttr volumeAxisField1.outputForce[0]`;
print $v;

particleShape1.ppfieldData は genericArray という型らしく、情報の確認方法がわかりませんでした。ご存知の方がいらしたら教えてください。

この結果を見てわかる通り、particleShape から全てのパーティクルのパラメータが配列として渡され、volumeAxisFieldからはそれぞれのパーティクルに対応した Force の値が返されています。

4.結論
Maya 内部でのパーティクルの処理は以下のようになっているようです

データの格納場所:

particle ノード
各パーティクルの実体を保持
Fieldノード
各パーティクルに与える Force の値を保持

ノード間でデータをやりとりするときは、ポインタを渡すだけで済ませていると推測できます。

データ処理:

  1. particle ノードから、保持している全パーティクルデータを Field ノードに渡す
  2. Field ノードは受け取ったパーティクルデータを元に、各パーティクルの Force を計算して particle ノードに返す
  3. 1,2 の処理を、particleノードに繋っている全 Field ノードに対して行う
  4. 集まったデータを元に particle ノード内でパーティクルの情報を更新する

これ以上細かい挙動が知りたかったら SDK を調べる必要がありそうですが、力尽きたので今日はここまで。

ふー。疲れた。MELの書き方とかすっかり忘れてて、いろんなところでつまづいてしまいました。この文章もいろいろ試しながら書いたので、嘘を書いてしまってる可能性大です。間違いを見つけたら教えてください(汗

Mayaのお勉強”への2件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です