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

2011年12月14日

(TP Basic) PPassABの基本



今回はTPの基本的で重要な機能のPPassABの説明をしたいと思います。場所はCreatロールアウト内のオペレーターから入ったInitiatorの中です。TPではnodeヘルパーを使ってシーン内のオブジェクトをピックアップしDistance ノードでパーティクルのDistanceやDirectionを調べたりできますが、PPassABはそのパーティクル同士版といった感じです。2つのパーティクルグループ同士をチェックする機能を持っていて、全てのパーティクルをチェックしたり一つのパーティクルグループから見て特定の範囲内にあるパーティクルのみをチェックできたりします。これだけだといまいち使い道が分からないと思うので早速実際の使用例を見てみましょう。 今回はもぐらが地面を掘り進んで行く時にできる地面の盛り上がりをPPassABを使って再現してみたいと思います。

まずBornPrtダイナミクスです。シーンにもぐらを模したスフィアオブジェクトを用意しアニメーションさせます。動きが決まればこれをObjTOParticleノードでTPに取り込みパーティクル化します。オブジェクトをPickボタンでピックしてあげたら、パーティクルグループはMolePrtにします。これでオブジェクトはTP内でパーティクルとして扱われるようになります。その後TrackをObject To Particleにすることでピックしたオブジェクトのインスタンスがパーティクルの動きに追従するようになります。Instance Shapeにチェックを入れるとTP内でオブジェクトがTPのインスタンスシェイプとして確認できます。下のHideボタンを押すと、元もとのオブジェクトがハイドされてTPのインスタンスオブジェクトのみがシーンに残ります。Unhideを押せば再び元のオブジェクトがシーンに出てきます。

PPassABBasic_ObjTo Particle.jpg



次に地面のオブジェクトにGroundPrtパーティクルグループのパーティクルを発生させます。無駄な場所にパーティクルを出すと効率が悪いので不必要な部分のポリゴンは削除します。

PPassABBasic_PositionBorn.jpg

 次にAssignShape&Matで、発生したパーティクルにCubeのシェイプを与え、Cammapノードでカメラマップ用のUVコーディネーションをアサインしてあげます。これでパーティクルに対してカメラマップが可能になり、地面の背景画像をそのまま貼ることができます。シーン内のカメラをピックしてあげます。

PPassABBasic_shape&mat.jpg

 ここでParticle Age コンディションノードをそれぞれのノードのonに繋ぎます。Particle Ageロールアウト内ではBornにチェックを入れます。これがどういうことかというと、各Std ShapeやShape Materialノードなどのノードに対して、パーティクルが生まれた時にのみ各ノードをアサインしてあげるということです。勿論一度アサインしたパーティクルはパーティクル発生時以降もずっと他のシェイプやマテリアルのアサインのイベントが起きない限りは同じシェイプやマテリアルを保持したままです。ではPaticle Ageコンディションノードを外した場合はどうなるのでしょうか。この場合は、毎フレームごとにシェイプやマテリアルがアサインされていることになるんですね。これはデバッグをしてみるとよく分かります。

PPassABBasic_ParticleAgeAri.jpg

PPassABBasic_ParticleAgeNasi.jpg

 勿論シェイプやマテリアルのアサインにもそれ相応の計算負荷がかかります。なので例えばゆらゆら揺れている泡みたいに毎フレームごとに形状が変わるオブジェクトなどを除いて、シェイプ等のアサインはパーティクルが発生した時のみに限定しておくのがTPを効率よくハンドリングする方法なのです。追々説明すると思いますが、パーティクルのキャッシュを取るときに何もしないでいると容量が無茶苦茶増えます。これは知らないと気が付かないですが、非常に大事な考え方なのでぜひ覚えておきましょう。ちょっと脱線しましたが、これで地面のパーティクルの準備が整いました。



次に地面の盛り上がりのセッティングをします。地面が盛り上がるようにするには、MolePrtパーティクルから遠い部分のGraoundPrtパーティクルは動かず、より近いところは上に移動させるだけで大丈夫です。このMolePrtパーティクルとGroundPrtパーティクルの位置関係の状態をチェックするのにPPassABを使います。まずGroupAにGroundPrtパーティクルグループを、GroupBにMolePrtパーティクルグループをセットします。この時お互いが全てのパーティクルをチェックしようとするので計算負荷が状況によってかなりかかります。そこでDistanceにチェックを入れて適当な距離を指定してあげると、その距離に収まっているパーティクルしかチェックしなくなるので計算がかなり早くなります。今回はDistanceを10にします。イメージ的には以下の図のような局面だと考えてみてください。

PPassABBasic_PPassABcheck.jpg


次にPPassABのPositionA,PositionBアウトプットを出しDistanceノードに繋ぎます。これはもうGroupAのPosition,GroupBのPositionという意味です。繋ぎ方はPosition2からPosition1へがDirectionの方向です。今回はDirectionは特に必要としませんが、ここは意識的にやっておきましょう。今回はMolePrtパーティクルからGroundPrtパーティクルへの距離を測りたいので、Position2にB Position,Position1にA Positionをコネクトします。

次に各パーティクルグループ間の距離をZ+方向への移動量へと変換してあげます。ここはもういつものValue To Timeの出番ですね。今回距離が10以内にあるパーティクルのみをチェックしているので、距離が0の時にTimeが0、10の時にTimeが30という風にしてあげます。次にFloatノードのカーブでtimeのvalueに応じた距離の移動を指定してあげます。距離が0の時つまりtimeが0の時には10ほど上に移動し、距離が10の時つまりtimeが30の時に移動距離が0になるようにカーブを調整します。これをPoint3ヘルパーノードのZの値にコネクトし(Addで)このZの移動量をPositionノードに繋げてAddをしてあげます。PositionノードはPPasABからA Particle(つまりGroundPrtグループ)にコネクトします。これで元々のGroundPrtパーティクルの位置からZ+方向にパーティクルが移動するようになりました。アニメーションを再生するとMoleパーティクルが近づいたらGroundPrtパーティクルが盛り上がっているのが分かります。

PPassABBasic_PPassAB.jpg



これがPPassABの基本的な考え方です。異なるグループのパーティクル同士を比較してコントロールしたい局面は頻出すると思うので、これを機にぜひ覚えていきましょう。
posted by けゑ at 05:05| Comment(2) | TrackBack(0) | Thinking Particles
この記事へのコメント
どもどもー。このパーティクルAgeの活用方法は初めて知りました。
今まで普通に繋げるだけで済ませていました。
こういった無駄を省くのが大事なんですね。
毎度ホント勉強になります。ありがとうございます。
Posted by いまづ at 2011年12月14日 23:26
>いまづさん どもー。Particle Ageの技結構使えますよねー。これ覚えていれば作業かなり早くなります。まだまだこれ系の小ネタ色々あるので今後も期待しててくださいw
Posted by けゑ at 2011年12月15日 10:00
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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

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