2015/07/25

遅いのでAABBを導入してちょっとだけ早くする

こんにちは.@rootxです.

簡単なレイトレができましたが,単純なシーンの割に遅いです.
先ほどの偽コーネルボックス(640x480)のレイキャストで約1.0秒もかかっています.
これは由々しき事態です!

というわけで,本筋としてはBVHなどの高速な衝突検出(O(log(n))を使うべきですが,
とりあえずAABBを導入します.

AABBとは,Axis Aligned Bounding Boxの略で,要するに当たり判定用のBOXです.
ポイントはXYZ軸に沿っていることですね.そのため,斜め方向を向いている細長い物体だと,大きくなりすぎる問題もあります.
物体の向きに関係なく,任意方向の境界BOXであるOBB(Oriented Bounding Box)というものもありますが,OBB算出が面倒なのとシーンが複雑になった時の構築時間が増えてしまうので,今回は後々の拡張も考慮してAABBを採用します.


AABBの実装は簡単で,プリミティブの最小最大座標をx,y,zそれぞれ求めて上げればOKです.
現在,プリミティブとして用意しているのは,三角形と球なのでちょいちょいと求めてあげます.

メッシュ(モデル)毎にもAABB持たせてあげましょう.
メッシュを構成する全プリミティブのAABBをガッチャンコします.
MergeAABBみたいな関数を用意すると便利ですね.


次はAABBとレイとの衝突判定を実装します.

とりあえずこれを参考にします.

ゲームプログラミングのためのリアルタイム衝突判定



サンプルコードがここ(http://www.borndigital.co.jp/book/164.html) からダウンロードできるので買わなくてもいいけれど,一冊持っていると良いと思います.
ちなみに,この本は学生の時にお世話になりました.
その当時は日本語版がなくて,英語を読むのに苦労した覚えがあります……;



でわでわ.

0 件のコメント:

コメントを投稿