modelsUnderRay高速化

  • 投稿日:
  • by
  • カテゴリ:

数少ない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についても同様です。
対象外にするポリゴン数に比例して、かなり効果がありますよ。