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

2011年08月02日

ノードからの距離によってパーティクルのグループを切り替える方法

 久々のTPメモです。今回はノードからの距離によってパーティクルのグループを切り替える方法です。


 
 全体的な流れとしては、"born"ダイナミクスにて板ポリに発生させたパーティクルにbornというグループをアサインし、"distance"ダイナミクスでbornグループのパーティクルとリングのオブジェクトの距離をDistanceノードで調べ返ってきた距離の値をThresholdノードに送ります。リングオブジェクトの半径は500cmなので、距離が500以内つまりリングの内側にあればThresholdはbool値の1を、外側にあればbool値の0を返します。ここでThresholdの"out"アウトプットから1と0の分岐ができるのですが、1の場合は"Gourp_tea"のグループノードに送られ、そうでなければ"Group_Torus"のグループノードに送られます。"Group_Torus"へ行く情報はboolの0なのでこのままだと"Group_Torus"のグループノードのonインプットをアクティブにできないのでinvertノードで反転させて1が行くようにします。その後"instance"ダイナミクスでteaのグループにはtea potのオブジェクトをインスタンス、TorusのグループにはTorusのオブジェクトをインスタンスするということになります。

sbd_cap_scene.jpg

sbd_cap_born.jpg

sbd_cap_distance.jpg

sbd_cap_instance.jpg


ここでポイントとなるのが、グループの親子関係です。サンプルムービーにおいては、下の図のようにbornグループ以下にtea,Torusが入っています。この場合は毎フレームごとのサンプリングでまずbornグループに対して処理をし、その過程でそのフレームにおいて条件に当てはまっているものがteaグループなのかTorusグループなのかを判断していきます。その後は同じようにまず最初にbornグループに対して毎フレーム処理を続けていくので、リングの内側に一旦入って後に外に出たパーティクルに対してもteaかTorusかの処理をしていくことになります。なので一旦ティーポットに変わったパーティクルもリングの外に出ればトーラスに戻ります。

sbd_cap_group_parent.jpg

 では次の場合はどうでしょうか。以下の図のようにborn,tea,Torusのグループが親子関係無しに独立している場合です。

sbd_cap_group_separate.jpg

結果は以下のようになります。パーティクルがリングの内側に入っても何も反応しません。




 これがどういうことなのかというと、それぞれborn,tea,Torusグループが独立している場合は、最初のフレームでのテストで全てのパーティクルはteaかTorusかになってしまうんですね。なので次のダイナミクスの計算のサイクル以降bornのパーティクルがいないことになります。なので一度リングの外にあるtorusになったパーティクルはそれ以降そのまま。「bornとリングの距離を測って500以内ならteaに行く」流れは存在しなくなります。なのでこういう結果になるということです。

 今回は単純にオブジェクトを置き換えているだけの作例ですが、例えば海中の泡を作る時などにカメラから特定の範囲内はハイポリのオブジェクトを使い、ある程度の距離離れているものはローポリに自動的に置き換えるなどの仕組みを簡単に作ることができます。

posted by けゑ at 00:19| Comment(0) | TrackBack(0) | Thinking Particles
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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

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