PV3D2.1: 交差判定高速化

2009年9月27日
視線とメッシュの交差判定を高速化してみました。
サンプルのポリゴン数は前回と同じにしてあります。
walkthrough2.jpg
矢印キー:移動
SHIFT+矢印キー:カメラ回転
右上MAPクリック:地形変形
FPSクリック:FPSの限界切り替え
前回FPS30くらいだったんだけど今回60~70くらいまであがった!
(前回のサンプルではfps24以上あげられないけど)

あと記事を若干加筆しました。コードは未だに検証中だけど・・・

やってる事

視線と三角形の交差判定が重かったので
今回AABBとの交差判定処理を混ぜています。
AABBというのはAxis Aligned Bounding Boxの略で, 辺がワールド空間のXYZ軸に並行な直方体の事だそうです。
ワールド空間における傾きの無いバウンディングボックスのようなものと考えればいいかも。

aabb.png
前回は視線ベクトルと全三角形とを重い処理でひたすら交差判定していたんですが
図のように交差判定をする前にあらかじめ視線と全三角形をAABB化しておきます。
そして視線のAABBと各三角形のAABBとが交差しているかを最初にチェックして、
AABB同士交差しているものだけ絞りこむことで重い交差判定の回数を減らしています。
AABB同士の交差判定はかなり高速なのと、交差判定対象のメッシュが動かない場合は
全三角形をAABB化するのは最初の1回だけで済みます。
実際はAABB同士の交差判定で絞り込んだ後、
視線ベクトルの直線と三角形のAABBとの交差判定をしてさらに三角形を絞り込みます。

ちなみに視線ベクトルが無限の長さを持ってる場合は視線がAABB化できないため
最初のAABB同士の交差判定はできないので
視線ベクトルの直線と三角形のAABBとの判定だけになります。

具体的な手順はこんな感じ
  1. 三角ポリゴンを包むAABBを求める(動かないなら最初の1回だけ)
  2. 視線ベクトルが長さを持っていたら視線のAABBと1を交差判定⇒判定なしで交差なし
  3. 1のAABBと視線ベクトル(直線)を交差判定⇒判定なしで交差なし
  4. 最後は今まで通り視線と三角ポリゴンを交差判定
AABBと直線の交差判定はこちらのサイトを参考にしています。
その18 直線とAABB - マルペケつくろーどっとコム

/**
 * (※追記)ASのコードはもうすこし検証してから載せ直すことにしました。
 */

処理落ちの原因

あと、前回のエントリーのサンプルで
自分の環境では時々カメラがある角度を向くと
処理が突然重くなって最悪10秒近くフリーズする事があって困ってたんですが、
どうやら地形に使っているBitmapMaterialのスムージングをtrueにしていたのが原因みたいです。
スムージングONにしただけであそこまでフリーズするとは思えないけど・・・
実際OFFにしたら問題なく動かせるようになりました。うーん・・・
テクスチャは縦横100px程度だから、大きなモデルでスムージングかけたのがいけないのかな。
スムージングの他に別の要因が絡んでたのかもしれないけど。

トラックバック(0)

トラックバックURL: http://www.morocoshi.net/mt/mt-tb.cgi/15

コメントする