_581x100.png CGsyomei_583x102.gif 訪問者 無料カウンター ページビュー 無料カウンター

2011年12月05日

(TP Basic) Memory Operatorの基本

 


今回は今後頻出するであろうMemory Operatorの使い方について説明しておきます。以前"(TP Basic)Debugの基本"のエントリーで少し出てきましたが、今回はDebug用ではなく本来の用途の説明になります。cebasのwikiには"Storing data is one of the most important tasks when doing complex particle system setups. The Memory node is especially made for this kind of task.

One of the biggest features the memory operator offers is the DynamicSet wide parameter access, any value may be accessed in any DynamicSet at any time. Also storing values per particle is also possible"とあります。「データの保存は複雑なパーティクルシステムのセットアップをする時に最も重要なタスクの一つです。Memoryオペレーターが提供する最大の機能の一つは広いダイナミクスセットのパラメーターのアクセスでどのダイナミクスセットにいつでもどんな値でもアクセスできます。またパーティクルごとの値の保存も可能です。」とのことです。まあこれもなんのことかさっぱり分からないと思います。では実際にこれがどういうことなのか作例で見ていきましょう。

 まずシーンの説明です。ムービーを見て分かるように、これは以前自分がアップした"TP ground impact system v002"と同じようなシチュエーションです。ただしTPのセッティングはかなり簡略化されていて砂煙の代わりにTeapotが出てきます。
最初は普通に着弾した時にteapotが出る場合です。地面の形状に向きが沿っていなくて味気ないのが分かります。そこで地形の傾きに沿ってteapotを向けたい場合にどうするかということを考えないといけないわけです。

 今回はPositionBornを使ってteapotを発生させていますが、PositionBornオペレーター自身にはパーティクルが発生した地点の地面オブジェクトのノーマル情報を得ることはできません。その代わりをMemoryオペレーターがしてくれるというわけです。

 ではダイナミクスの中身を見ていきましょう。最初は弾のパーティクルを発生させる為のダイナミクスです。ここで注目しておきたいのはDistanceコンディションノードです。これに二つのノードがくっついているのが分かります。このシーンではBulletEmitterというヘルパーオブジェクトからTargetヘルパーオブジェクトに向かって弾が飛んでいってます。このようにDistanceノードは2点のノードの位置を調べて方向(Direction)としてアウトプットする役目があります。ちなみにどちらが始点でどちらが終点かは決まっていて、Position2インプットが始点、Position1インプットが終点となります。これはTPの基本中の基本なので絶対覚えておきましょう。また勿論Distanceという名前を持っているので2点間の距離を測ることもできます。Distanceアウトプットから2点間の距離の値が出されます。

BornBullet.jpg

 次にborn_teapotダイナミクスです。UDeflectorはシーン中のオブジェクトをコリジョンオブジェクトとして認識する為のものです。Dynamics Operator nodeの中から追加できます。NodeヘルパーでシーンのオブジェクトをピックしてUDeflectorに登録しますBulletパーティクルグループをUDeflectorのパーティクルグループにコネクトすることでUDeflectorがBulletグループを認識するようになります。

 次にcollisionアウトプットがどういう役割をしているかというと、bulletパーティクルが地面に当たると、コリジョンの検出を示すBoolian値のonもしくは1の情報をアウトプットしているんですね。collisionアウトプットはまずはParticle DieオペレーターのOnインプットに繋がっています。Particle Dieは文字通りパーティクルを消去するオペレーターで、地面に当たるとcollisionがOnつまりParticle DieもOnになるので地面に当たったBulletパーティクルは消滅します。

 それと同時に、collisionアウトプットはPositionBornのOnインプットにも繋がっています。これによってBulletパーティクルは消えつつTeapotパーティクルを発生させていることになります。PositionBornでは発生の方法をPistolShotにして、Onの情報が来る時に限って一度発生させるという風に指定します。TeapotパーティクルのポジションはBulletパーティクルと同じ位置で構わないのでBulletパーティクルのPositionアウトプットをPositionBornのPoisitionインプットに繋いで位置を同期させます。生まれてくるteapotパーティクルにはGeom InstanceでTeapotオブジェクトのシェイプを与えてあげます。後ろのFloatやPoint3やPostionは何かというと、Teapotが出たときに何故かちょっと浮いてしまっているためにZ軸に対して-5ユニットほどteapotパーティクルの位置をずらすためのものです。今回は詳細は省きます。

 次に肝心のMemoryオペレーターです。PositionBornのBorn ParticleアウトプットからMemory_Teapotオペレーターのparticleインプットに繋ぐことで、Teapotパーティクルにデータを保存することを決定します。Memoryオペレーターに今回は地面オブジェクトのノーマル情報を保存したいので、ロールアウトメニューの中でnormal情報を選択しリネームしてインプットに登録します。(詳しいオペレーション方法は過去記事参照。)追加されたNormal_colliインプットとUDefrectorのNormalアウトプットを繋ぎます。これで、Bulletパーティクルが着弾したタイミングとその位置で発生したTeapotパーティクルは、UDeflectorで登録された地面オブジェクトのnormal情報を保存することができました。

 BronTeapot.jpg

 次のalignダイナミクスでTeapotパーティクルに対してAlignmentオペレーターで地面のnormal方向を向くように回転をコントロールします。新しくMemoryオペレーターを追加し、Teapotグループとコネクトしたら先ほど作成したNormal_colliをアウトプットに登録します。これをAlignmentオペレーターのDirectionインプットに繋ぎnormal情報を渡します。Alignmentオペレーターの中では回転の方法をUse Definedに指定してあげることでMemoryオペレーターのnormal情報を使うことができます。これでTeapotのパーティクルシェイプはきちんと地形の起伏に応じて向きを変えていることが分かります。

Align.jpg

thum.jpg

 とりあえずは一通りの流れが掴めたでしょうか?TP初心者から中級に行くにはMemoryオペレーターの理解は必須です。これを理解して応用できればさらにTPのポテンシャルを引き出すことができると思います。今後もMemoryオペレーターを使った作例をどんどん紹介していくことになると思うのでぜひこれを機に習得してみてください。

posted by けゑ at 06:28| Comment(7) | TrackBack(0) | Thinking Particles
この記事へのコメント
質問です。
memoryオペレーターへ行く前に詰まっております汗
コリジョン判定まではうまくいくようなのですが、ティーポットが出てくれません。。。
色々試行錯誤中なのですが、
「O bulletのParticle」と「O Position Born_main」のPositionを繋げていますが、
感覚的に「O UDeflector」のPositionとO Position Born_main」のPositionを繋げるのでは?
と思ったりするのですが、、、
初歩的な質問かと思いますがよろしくお願いします。


Posted by hoshileen at 2011年12月05日 14:55
ティーポットは無事でるようになりました!お騒がせしました。m(__)m
ただ「O bulletのParticle」と「O Position Born_mainのposition」を繋げるとうまく出てくれないです。。。
Posted by hoshileen at 2011年12月05日 15:34
>hoshileenさん こんにちは。Teapotが出なかった時は結局どのようなことが原因だったでしょうか?自分も前セッティングは間違ってないぽいのに出なかったことがあって、色々やってたら知らないうちにでるようになったことがありました。こういうときになぜ駄目なのかを知る為にもその状態を残しておくべきだったなあと思ってます。

それはさておき、UDeflectorのPositionをデバッグしたら問題なくPosition BornにPositionのデータが渡っていますね。あと自分のセッティングでも同じ値のデータがきちんと渡っているようです。なのでUDeflectorのPositionでPositionのデータを渡してあげるのも正解だと思います。自分もそこは調べてなかったので参考になりました。やっぱりいろんな人が多方面から調べるのは効率いいですね。
Posted by けゑ at 2011年12月07日 07:20
お世話になります。
Teapotが出ない件ですが、こちらでも謎でした。。。再度組み直すときちんとでるようになったんです。
すみません状況がまったくわからずで。

さてBorn_Teapotセット内で「O Bullet」のParticleとPosition BornのPositionを繋げる件ですが、
こちらではやはりTeapotが出ないですね。
位置情報も渡っていないようです。
で、試しに「O bullet」のParticleとPosition BornのParticleを繋げてみたところ、Teapotがでますね。
同じセット内だからってことでいいのでしょうか???
なんか課題ばかりが積み上がっていく感じになっちゃってますが、申し訳ないです。
ThinkingParticlesなだけにほんと考えさせられます。。。

Posted by hoshileen at 2011年12月07日 11:45
>hoshileenさん とりあえずなんで駄目だったのかは追々分かってくると思います。日々の知識の積み重ねで今まで謎だった部分が分かってくるのがTPなので^^;ほんと頭使うソフトですよね。
Posted by けゑ at 2011年12月15日 09:54
テーポットが浮いてしまう件ですが今コメント拝見したら、もう解決されてたかもでしたw

O UDeflector/Position >> O Position Born_main/Position

でパーティクルとオブジェクトとの交点(コリジョン)の座標は取れる様でした。

一応、ノード接続の画像も。
http://shuhei.tv/temp/TP_UDef01.jpg

確かに

O bullet/Particle >> O Position Born_main/Position

ですと、ティーポットが浮いてました。

少し気になったのが、米岡さんがコメントされてた

//UDeflectorのPositionをデバッグしたら問題なくPosition BornにPositionのデータが渡っていますね。あと自分のセッティングでも同じ値のデータがきちんと渡っているようです。

との事でしたので、そしたらテーポットが浮かない結果になるのかなと思ったのですが、また色々設定ありそうですね^^;

それにしても、TPのデバッガーというか、は表示も曖昧っぽいので使い辛いですね。
格納されているデータの詳細が全部表示されていない気もしますし、HudiniやXSIを使った事ないのですが、あちらより、TPのノードの仕様はやはりパーティクルを扱うのに偏って諸々配慮されてできている気がしておりました。

また感覚というか概念は慣れが必要ですね^^;

エフェクト飲み会、前回米岡さんが新宿で開催された時は参加させて頂いたのですが、今回は参加できそうもなく残念でした。

ドイツ遠征の様子、お伺いしたかったです。

VBの記事、楽しみにしておりますね。
Posted by 日置修平 at 2011年12月22日 11:01
>日置さん どうもー。爆裂遅レスですみません。TPのデバッガーは便利は便利ですがやっぱりある程度情報が簡素化されてるんでしょうね。自分もHoudiniとかと比較して見てみたい気がします。

また今後日本に戻る機会があればぜひTP談義などしましょう!
Posted by けゑ at 2012年05月20日 07:59
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/51381532

この記事へのトラックバック