« プロジェクト管理ツール | メイン | modelsUnderRay高速化2 »

modelsUnderRay高速化

数少ないSW3D制作者にとっては役立つTIPSです。
modelsUnderRay()は遅いとよく言われますが、というか遅いですが
特定のオブジェクトだけを判定対象にすればかなり速くなります。

具体的には、対象外にしたいモデルをグループに入れて、ray-castingする時だけそのグループを削除します。例えばignoreRaysGroupにモデルを入れて、下記のコードを実行するとignoreRaysGroup内のモデルは計算の対象から外れます。

SW3DMember.group("ignoreRaysGroup").removeFromWorld ()
M = SW3DMember.modelsUnderRay (vector (1,2,3), vector (1,0,0))
SW3DMember.group("ignoreRaysGroup").addToWorld ()

対象外グループを作る方法として、3Dソフト上でモデルのユーザー定義プロパティにignoreRays=trueフラグを設定しておくと便利です。
下記のコードで対象外モデルを選別してグループにまとめることができます。

G = SW3DMember.newGroup ("ignoreRaysGroup")
repeat with i=1 to SW3DMember.model.count
if SW3DMember.model[i].userData[1][#ignoreRays] = "true" then
G.addChild (SW3DMember.model[i])
end if
end repeat

modelsUnderRayに限らずmodelUnderLocやmodelsUnderLocについても同様です。
対象外にするポリゴン数に比例して、かなり効果がありますよ。

トラックバック

このエントリーのトラックバックURL:
http://www.kyucon.com/cgi-bin/blog/kyucon-tb.cgi/190

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)