2012年8月14日火曜日

パーティクルインスタンサー オブジェクトの法線を拾う

「パーティクルがサーフェイスに沿う」表現はGOALで実現できますが、そのパーティクルをインスタンスで任意のオブジェクトにして、「表面を這う」なんていう表現は・・・


needParent UV を ON の状態でパーティクルエミッタ(emit from surface)を作成。
パーティクルとサーフェイスでgoalを設定。

perParticleAttributeにparentU parentVを追加し、パーティクルエクスプレッションに下記の通り書き込みます。

goalU = parentU
goalV = parentV

これで、パーティクルはサーフェイス上での個々が発生した場所に留まります。

ここでパーティクルにオブジェクトをインスタンスしてみます。
インスタンスの回転は0の状態ですが、それぞれがサーフェイスのノーマルに従って回転した状態で配置されるようにしてみます。

パーティクルのアトリビュートエディターの「Goal Weights and Objects」セクッションにて、「Create Goal World Normal 0 PP」ボタンを押すと法線情報を持ったアトリビュートが出来ます。
注 このボタンはgoalの設定をしていないと表示されません。
instancer の Aim Direction を出来たアトリビュートに設定。
 
とりあえずノーマルに沿って配置されたはず!

ですが、サーフェイスのノーマルとオリジナルオブジェクトの+X軸が揃った状態になっているので、思ってたのと違う!となる場合が多いでしょう。
そんな時は、追加でUserVectorPPなどのperParticleAttributeを作り、オフセット処理をしましょう。ついでにランダムな感じを足したい時はノイズなども同時に計算しちゃいましょう。
注 その計算はruntime after dynamicsでしないと、おかしくなる時があるそうです

インスタンスされるオブジェクトの+X方向がサーデイスのノーマル方向に向きます。