XNA Framework によって提供される、衝突の検出に関係する機能の概要です。
衝突の検出とは、ゲームの世界のオブジェクトが互いに重なり合うかどうかを判定するプロセスのことです。XNA Framework には、ゲームにおける衝突の検出システムの実装を迅速化するためのクラスおよびメソッドがいくつか用意されています。
境界ボリューム クラス
XNA Framework には、ゲームの世界での 3 次元の領域を表す 3 つのクラスがあります。境界ボリューム クラスを使用すると、衝突検査を行う際の負担が低い形状を持つモデルが占めるボリュームを近似することができます。境界ボリューム クラスはすべて、相互の交差テストと包含テスト、および平面クラスと光線クラスをサポートします。
境界球
BoundingSphere 構造体 は、球体が占める空間を表します。
境界球を衝突の検出に使用することには、いくつかの利点があります。
-
球体間の検査が非常に高速です。2 つの球体の衝突を検査するために、球体の中心間の距離と、両方の球体の半径の和とが比較されます。その距離が両方の球体の半径の和に満たない場合、球体は交差しています。
-
BoundingSphere 構造体 クラスはコンパクトです。このクラスには、その中心と半径を表すベクトルのみが格納されます。
-
境界ボックスと異なり、モデルが回転した場合に境界球を再作成する必要がありません。境界のあるモデルが回転する場合でも、境界球はそのモデルを十分に包含できる大きさです。
-
境界球の移動は低コストな処理です。中心に値を加えるだけです。
境界球クラスを衝突の検出に使用する場合、大きな弱点が 1 つあります。
-
近似されているオブジェクトの形状が球体でない場合、境界球にすきまができ、誤検出の原因となる可能性があります。細長いオブジェクトの場合、その境界球内のすきまが最も多くなります。
境界ボックス
BoundingBox 構造体 は、ボックスが占める空間を表します。境界ボックス クラスは軸に沿います。境界ボックスの各面は X 軸、Y 軸、または Z 軸に垂直です。
境界ボックスを衝突の検出に使用することには、いくつかの利点があります。
-
境界ボックス クラスは、きれいに軸に沿った矩形の形状ではめ込まれます。境界球クラスと比べて、境界ボックス クラスは、回転しない矩形オブジェクトにはぴったりとはまります。
-
境界ボックス クラスは軸に沿うため、特定の仮定を立てることにより、境界ボックス間の衝突検査を、回転が可能な境界ボックスよりも高速に行うことができます。
境界ボックスを衝突の検出に使用することには、いくつかの弱点があります。
-
境界ボックスを回転させると、そのボックスは軸に沿った状態ではなくなります。このため、境界のあるモデルを回転させた場合、境界ボックスを再作成する必要があります。境界ボックスを得るためにオブジェクト内のすべての点が反復処理されるため、その処理には時間がかかる場合があります。モデルの向きが変わっていない場合は、境界ボックスを変換することができ、再作成する必要はありません。
-
境界のあるモデルが軸に沿っていない場合、境界ボックスには多少のすきまができます。すきまの量は、オブジェクトが軸から 45 度回転した位置にあるときに最も大きくなります。
-
衝突を検査するとき、境界ボックス内のすきまが原因で誤検出が生じる可能性があります。
境界錐台
BoundingFrustum クラス を使用すると、カメラから見える空間に相当する境界ボリュームを作成できます。カメラが現在使用している結合ビューおよび射影行列から境界錐台を作成します。カメラが移動または回転した場合は、境界錐台を再作成する必要があります。境界錐台は、2 つのオブジェクトが衝突するタイミングではなく、カメラが見ることのできる空間のボリュームとオブジェクトとが衝突状態にあるタイミングを判定するために使用されます。境界錐台と交差しないオブジェクト、また境界錐台に包含されないオブジェクトはカメラから見えないため、描画の必要はありません。複雑なモデルの場合は、これによってグラフィック カードの処理量を大幅に削減できます。
非境界ボリューム クラス
平面
Plane 構造体 は空間内の平面を記述します。平面は、平面に垂直なベクトルと平面上の一点によって定義されます。平面クラスは、境界ボリューム クラスとの交差テストをサポートします。平面クラスの交差テストは、平面に対するテスト対象オブジェクトの相対位置を返します。戻り値は、オブジェクトが平面と交差するかどうかを示します。オブジェクトが平面と交差しない場合、戻り値はオブジェクトが平面の表側と裏側のどちらにあるかを示します。
光線
Ray 構造体 は、空間内の一点を起点とする光線を記述します。光線構造は、境界ボリューム クラスとの交差テストをサポートします。光線の交差テストの戻り値は、交差が発生した距離です。交差が発生しなかった場合の戻り値は null です。
モデル
Model クラス には、モデルを描画するために必要な情報に加えて、そのパーツのための境界ボリュームが含まれます。モデルがインポートされるとき、コンテンツ パイプラインはモデルの各パーツについて境界球を計算します。2 つのモデル間の衝突を検査するには、一方のモデルの境界球と、もう一方のモデルのすべての境界球とを比較します。
包含メソッドと交差メソッド
境界ボリューム クラスには、交差テストと包含テストの 2 種類の衝突テストをサポートするためのメソッドがあります。交差メソッドは、テスト対象の 2 つのオブジェクトが少しでも重なり合うかどうかを検査します。オブジェクトが交差することがテストで判明すると、メソッドは交差の程度を特定することなく、そのまま戻ります。包含メソッドは、オブジェクトが交差しているだけか、それとも一方のオブジェクトがもう一方に完全に包含されているかを判定します。交差メソッドは、交差が発生しているかどうかの判定だけを行えばよいため、一般的に包含メソッドよりも高速です。包含メソッドを使用するのは、交差の程度を知る必要がある場合に限られます。
新しい衝突データ構造の追加
ここで説明しなかった境界ボリューム クラスや交差テストを実装するときは、ほとんどの場合、カスタムのコンテンツ パイプライン プロセッサの追加が必要になります。たとえば、ゲームによっては衝突の検出に凸包を使用する必要があります。その場合は、カスタム プロセッサを使用して凸包を決定し、モデルのタグ フィールドにそれを配置します。その後、実行時にモデルが読み込まれた時点で、凸包情報がモデルで利用できるようになります。詳細については、「XNA Framework 標準プロセッサの拡張」を参照してください。
タスク
XNA クリエーターズ クラブ オンライン