sunday-labの日本語訳版です。英語版のXOOPS Cube関連記事を翻訳作業中...

2008年5月6日火曜日

An Overview of Collision Detection in OGRE 3D

OGRE 3D は、衝突検出(Collision Detection)に関して複数の方法を提供してくれる。我々、日本の開発者は、衝突検出を「ヒット」と呼ぶことがある。衝突検出を説明する前に、我々の認識を共有化するために、その要素を列挙する:
  • 衝突検出のために、プリミティブ形状が多く定義されていれば便利である。 OGRE はレイ境界球軸平行境界ボックス(AABB)を定義している。
  • そのほか、トライアングルや平面の概念も扱うことが可能だ。
  • 楕円、円柱などの形状は提供されない。
  • プリミティブなバウンディングボリューム同士のヒットだけでなく、メッシュに含まれるトライアングルとのヒットを取ることも体系化されている。
  • 負荷の軽いヒットのために専用のローポリメッシュがよく使われる。さて、汎用エンジンたる OGRE3D はそういった手段を提供するだろうか?

私は、最後の項目「負荷の軽いヒットのためのローポリメッシュ」に少しの説明を加えたい。日本の開発者は、そのようなメッシュを「ヒットモデル」と呼ぶ。私は、英語でそれを何と呼ぶかを知らない。従って、私は、それをこのエントリではヒットモデルと記述する。

OGRE 3D は基本的なヒット機能はほとんどすべて提供する。また、境界ボリュームのインスタンスは自動的に生成される。たとえば、メッシュクラスは境界球や境界ボックスを自動的に生成してそれをキープする。ヒット用のデータを細かく作り込む必要がない点はプログラマにとっては魅力的で即席だが、開発上は問題になるかもしれない。

まず手初めに、あなたはレイと地形のヒットの取り方(いわゆる地形ヒット/床ヒット)を知りたがるかもしれない。もしあなたのゲームの地形ジオメトリが高さマップではなく静的なメッシュ(リジッドモデル)であれば、ヒットを取るのは簡単である。あなたはレイと地形ジオメトリ(のヒットモデル)に含まれるトライアングルとのヒットを取る必要があるわけだが、プリミティブクラスの組み合わせの代わりに RaySceneQuery クラスを使うことができる。これは非常に強力な考え方である。

RaySceneQuery は、要するにレイである。しかし、このクラスは衝突検出を扱うために存在する。 Ray クラスのほうを使う場合、あなたはレイと衝突の可能性のあるシーン内のジオメトリデータとの衝突を検出するためにプログラムをたっぷりと書かなければならない。加えて、あなたのプログラムは、八分木もしくは四分木を用いて分割された空間から、絶対にヒットしないジオメトリを取り除いて候補を絞り込み、さらに境界球からトライアングルまで段階的な検出を実装しなければならない。

RaySceneQuery はそのような標準的なヒット検出を実装済みのクラスとなっている。どこまでやっているかは後日読解する。なんにしても RaySceneQuery はヒット地点までの距離を返すので、Y アンジュレーションや押し出しを簡単に行うことができる。 SceneQuery サブクラスは、他のヒット関係のクラスのためにもいくらかの種類が定義されている。

さて、あなたは標準的なヒット検出プロセスに何が必要だと考えるか? シーンは多くのジオメトリ/メッシュを持ち、メッシュは多くのトライアングルを持っている。我々がエンジンに求める機能は以下のようなものになるだろう:
  • 1) レイと衝突する可能性がないジオメトリ(レイの方向の反対側の分割空間に属するジオメトリなど)を衝突候補から取り除く
  • 2) マスクできること
  • 3) 最初のヒットチェックには境界ボリュームを使う
  • 4) 1) の絞り込みの過程をある程度保持しておいて、次回のチェックに再利用する。

RaySceneQuery はこのようなフィーチャーを提供するか? まず初めに、 OGRE 3D が提供するヒット関係の機能すべてを把握したいところである。

0 件のコメント: