ずーっと使っていなくて、すっかり忘れてしまったので Maya の勉強をしてみました。
今日のテーマは “Maya内部でのパーティクルの扱われ方”。
1.パーティクルを作ってみよう
オンラインレッスンを参考に、パーティクルを作成します。 ボリューム軸フィールドまで作成したら Hypergraph で観察します。
2.ノードの繋りを確認してみよう
ここまでで作られたノードの繋りを確認します。
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 の値を保持
ノード間でデータをやりとりするときは、ポインタを渡すだけで済ませていると推測できます。
データ処理:
- particle ノードから、保持している全パーティクルデータを Field ノードに渡す
- Field ノードは受け取ったパーティクルデータを元に、各パーティクルの Force を計算して particle ノードに返す
- 1,2 の処理を、particleノードに繋っている全 Field ノードに対して行う
- 集まったデータを元に particle ノード内でパーティクルの情報を更新する
これ以上細かい挙動が知りたかったら SDK を調べる必要がありそうですが、力尽きたので今日はここまで。
ふー。疲れた。MELの書き方とかすっかり忘れてて、いろんなところでつまづいてしまいました。この文章もいろいろ試しながら書いたので、嘘を書いてしまってる可能性大です。間違いを見つけたら教えてください(汗
ちょっといろいろあって時間とれないのでこいつ
http://koichitamura.blogspot.com/2008/05/texppattrmapper.html
のソースだけ置いておきます。
http://www.asahi-net.or.jp/~iy7k-tmr/texPPattrMapperNode.tar.gz
fieldData, ppFieldDataの使い方とかper perticle field attributeの作り方とかわかると思います。ではでは。
おぉぉぉ!!ありがとうございます!!
参考にさせて頂きます!!