こんにちは.@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 件のコメント:
コメントを投稿