作例コードの解析
理論はこのくらいにして実際のコードを見てみます。今回は Script Test オペレータを作成します。Script Test は、テスト結果を particleTestStatus というパラメータに設定し、PF はそれを元にパーティクルの振り分けを行います。
----Script Test 001----
on ChannelsUsed pCont do (
pCont.useTime = true
pCont.usePosition = true
)
on Init pCont do (
)
on Proceed pCont do (
count = pCont.NumParticles()
for i in 1 to count do (
pCont.particleIndex = i
p = pCont.particlePosition
d = $LightSrc.pos - p
r = ray p d
ret = intersectRayEx $geomSrc r
if ret == undefined then (
pCont.particleTestStatus = false
) else (
pCont.particleTestStatus = true
)
pCont.particleTestTime = pCont.particleTime
)
)
on Release pCont do (
)
----
ここでは、 ChannelUsed は飛ばして、いきなり本丸の Processed を見てみましょう。この中も、先ほどの Birth とほとんど同じです。全てのパーティクルに対し処理をするために pCont の particleIndex を加算しながら処理をしています。このシーンでは、説明を簡単にするために、計算に使用する光源を "LightSrc" 、交差判定に使用するジオメトリを "geomSrc" という名前で固定しています。
p = pCont.particlePosition
d = $LightSrc.pos - p
r = ray p d
まずは計算に使用する Ray を作成します。 p でパーティクルの位置、 d が方向になります;
ret = intersectRayEx $geomSrc r
intersectRayEx を使用して、ジオメトリとの交点を求めます。
if ret == undefined then (
pCont.particleTestStatus = false
) else (
pCont.particleTestStatus = true
)
intersectRayEx の結果が undefined であれば Ray とジオメトリが交差しない(=陰にならない)ので、テスト結果を false 、そうでなければ true にします。
pCont.particleTestTime = pCont.particleTime
このテストを行なった時間を記録します。これで、ひと通りの機能を作ることができました。どうでしょう? 必要な機能をひとつひとつ細かく分解していけば意外とシンプルなパーツの組み合わせでできていると思いませんでしたか?
サンプルムービーでは、さらに Cube の大きさをダイナミックに変えるという工夫もしています。基本はこれまで解説したものと同じなので、どうやったらできるのか考えてみてください。
これらをひと通り実装した結果、以下のような PF が出来上がりました。
Particle Flow 完成例
ところで、実はこのシステムにはバグがあります。ジオメトリとパーティクルの間に光源があっても、パーティクルが陰になっていると誤認識してしまうのです。この不具合も intersectRayEx の結果を巧く使えば解決できるので、興味のある方は挑戦してみてください(正解が分かった方は、メールをぜひ)。
今回は以上になります。盛り沢山な内容で消化するのは大変かもしれませんが、実際に皆さんで試してみて頂き、焦らずにひとつひとつ復習することで必ず習得できますよ。連載の第1回目では、「スクリプトとは?」というところから話が始まっていたのに、 Particle Flow のスクリプトオペレータでパーティクルを操作するところまで到達しましたよ。
今回は PF を使ったちょっと特殊なスクリプトの使い道を解説しました。次回からは、また別の視点からスクリプトの使い方を見ていきたいと思います。
TEXT_痴山紘史(JCGS)
映像制作のためのパイプライン構築をはじめ、技術提供を行なっていくエンジニア集団、「JCGS(日本CGサービス)」の代表取締役......というのは表の顔で、実態は飲み会とCG関連の技術が好きなただのCGオタク。
個人サイト「PHILO式」