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

2011年08月02日

position bornでテクスチャのグレースケールを参照してパーティクルの発生場所やスピードをコントロールする方法

 以前「シンキングパーティクル学習 普段パーティクルフローでやっている方法をシンキングパーティクルで再現してみる。その1」というエントリーでグレースケールのテクスチャの輝度情報でパーティクルの発生位置と速度をコントロールする方法を紹介しましたが、今回はObj.To Particleで発生させたパーティクルのシェイプ等から同じようなことをしようとする場合どうすればいいのかを考えてみます。この場合はmatter waveのようなあらかじめ用意されたパラメーターが使えないのでノードの組み合わせでこれを再現する必要があります。



このセッティングの流れは以下の図の通りです。

pbeft_scene.jpg


 まずborn_emitterダイナミクス内のobj.TO Particleノードで発生元のエミッターとなるオブジェクトをピックアップします。グループはborn_emitterに。Trackをobject To particleにセットします。これでオブジェクトがアニメーションしている場合にTPのパーティクルのシェイプも同様にアニメートされます。そしてinstance shapeにチェック。これでエミッターオブジェクトのシェイプをTP内部でコントロールすることができます。↓

pbeft_objToParticle.jpg

 次にborn_from_surfaceダイナミクス内のPosition BornでchildグループのパーティクルをObj.To Particleで発生させたパーティクルのシェイプから発生させます。ここはぱっと見複雑ですが、流れを説明するとすればこうなります。

 →born_emitterグループのパーティクルに対して処理をするという情報がPosition BornのParticleインプットに入る。

→Surface PosのParticleインプットがポジションボーンで発生したパーティクルを受け取りchildグループに対して処理をすることが決定される。UVWインプットからborn_emitterのパーティクルシェイプのUVW情報を受け取りParticle Shapeインプットからborn_emitterのパーティクルのシェイプ形状の情報を受け取る。UVWアウトプットから先ほど受け取ったUVW情報を次のTexmapColorノードに渡す。

→UVW情報を受け取ったTexmapColorノードでパーティクルシェイプのUVW上のカラー情報をチェックする。Textureスロットに使用するテクスチャをアサインする。Colorアウトプットから各UVW上のRGB(0から1の値)が次のColorノードに送られる。

→ColorノードのColorインプットから受け取ったRGBのデータを次のノードに渡す。今回使用するテクスチャはグレースケールなのでRGBのデータのRのアウトプットのみを使用でOK。Rの値がThresholdノードとVelocityノードをコントロールする為のAdd&Multiplyノードに送られる。

→Thresholdでは受け取ったRの値が0.1から1の間、つまり完全な黒を除く部分に収まる値の時に限りoutからbool値の1をアウトプットしPositionノードをオンにする。Positionノードの位置はSurface Posノードがもつpositionの情報が反映される。

→VelocityのSpeedノードにColorのRのデータを送るが、この値は0から1の小さい値であるため、Add&MultiplyノードでFloatの値と掛け合わせて適したスピードに調整する。

こういうそこそこ複雑なノード構成は、慣れないうちは実際に文章に書き起こして思考を具体化させると理解が深まると思います。

pbeft_position_born.jpg

 次にset_shapeダイナミクスでマテリアル、シェイプ、スケールを設定してあげます。ここはシンプルです。

pbeft_set_shape.jpg

 そして最後のkill_pivot_particleダイナミクスなんですが、これはSurface Positonの性質上どうしてもエミッターオブジェクトのパーティクルのピボット付近にできてしまう余分なパーティクルを消す為の物です。PPassABノードを用いてGroupAにはborn_emitterグループを、GroupBにはchildグループを指定してあげてborn_emitterパーティクルとchildパーティクルの距離を調べます。Distanceを1.0と小さな値にしてお互いの距離が1.0以内にあるchildパーティクルがParticle Dieノードに送られて消去されます。

pbeft_kill_pivot_particle.jpg

kill_pivot_particleダイナミクスをオフにした場合はエミッターオブジェクトパーティクルのピボット付近にはこういう感じでchildパーティクルが密集しています。どうやらSurface Positionが一旦ピボット付近でパーティクルを発生させた後に各サーフェイス上にパーティクルを移動させるのでそうなるのではとのことですが、また詳しく分かり次第追記したいです。

pbeft_kill_pivot_particle_2.jpg


今回なぜmatter waveを使わずにこんなめんどくさいやり方をしているのかと言うと、この手法を取った方がいい場合があるからです。それに関しては追々具体例を挙げて説明していきたいと思います。


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

メールアドレス:

ホームページアドレス:

コメント:

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

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