衝突検出は、 2つ以上の空間オブジェクト(通常はコンピュータグラフィックスオブジェクト)の交差を検出する計算上の問題です。主にコンピュータグラフィックス、コンピュータゲーム、コンピュータシミュレーション、ロボット工学、計算物理学など、さまざまなコンピューティング分野で応用されています。衝突検出は計算幾何学の古典的な問題です。衝突検出アルゴリズムは、2Dまたは3D空間オブジェクトでの動作に分けられます。[1]
概要

物理シミュレーションでは、ビリヤードのプレイなどの実験が行われます。[2]ビリヤードのボールが跳ねる物理学は、剛体運動と弾性衝突の枠組みで理解されています。[ 3 ]状況の初期説明は、ビリヤード台とボールの非常に正確な物理的説明、およびすべてのボールの初期位置とともに与えられます。[4]キューボールに適用された力に基づいて、コンピュータプログラムはすべてのボールの軌道、正確な動き、および最終的な停止位置を計算します。 このゲームをシミュレートするプログラムはいくつかの部分で構成され、そのうちの1つはビリヤードボール間の正確な衝撃を計算する役割を担います。 この特定の例も条件が悪いことが判明しています。計算の小さな誤差がビリヤードボールの最終的な位置に劇的な変化をもたらすためです。
ビデオ ゲームにも同様の要件がありますが、いくつか重要な違いがあります。一部のコンピューター シミュレーションでは現実世界の物理を可能な限り正確にシミュレートする必要がありますが、コンピューター ゲームでは現実世界の物理を許容可能な方法でリアルタイムかつ堅牢にシミュレートする必要があります。結果として得られるシミュレーションがゲーム プレイヤーにとって満足のいくものである限り、妥協は許されます。
コンピュータシミュレーションにおける衝突検出
物理シミュレーターは、衝突に対する反応方法が異なります。一部のシミュレーターは、素材の柔らかさを使用して力を計算し、現実と同じように次の時間ステップで衝突を解決します。これは、柔らかさが低い素材の場合、CPU を非常に集中的に使用します。一部のシミュレーターは、線形補間によって衝突時間を推定し、シミュレーションをロールバックして、より抽象的な保存則の方法によって衝突を計算します。
線形補間 (ニュートン法) を反復して、シミュレーションの残りの部分よりもはるかに高い精度で衝突の時間を計算するものもあります。衝突検出では、航空管制などのように、時間の一貫性を利用して、CPU の需要をあまり増やさずに、さらに細かい時間ステップを可能にします。
非弾性衝突の後には、滑りや静止といった特殊な状態が発生する可能性があり、たとえばOpen Dynamics Engineでは、制約を使用してこれらの状態をシミュレートします。制約により慣性が回避され、不安定性も回避されます。シーン グラフを使用して静止を実装すると、ドリフトが回避されます。
言い換えると、物理シミュレータは通常、衝突が事後的に(衝突が発生した後)または事前に(衝突が発生する前)検出される 2 つの方法のいずれかで機能します。事後的と事前的の区別に加えて、ほとんどすべての最新の衝突検出アルゴリズムはアルゴリズムの階層に分割されています。事後的と事前的という用語ではなく、「離散的」と「連続的」という用語がよく使用されます。
事後的に(離散的)対先験的に(継続)
事後的ケースでは、物理シミュレーションが小さなステップで進められ、交差しているオブジェクトまたは交差していると見なされるオブジェクトがあるかどうかがチェックされます。各シミュレーション ステップで、交差するすべての物体のリストが作成され、これらのオブジェクトの位置と軌道が衝突を考慮して「固定」されます。この方法は、衝突の実際の瞬間を見逃し、実際に衝突が発生した後にのみ衝突を捕捉するため、 事後的と呼ばれます。
事前法には、物理的な物体の軌道を非常に正確に予測できる衝突検出アルゴリズムがあります。衝突の瞬間は高精度で計算され、物理的な物体が実際に相互に貫通することはありません。衝突検出アルゴリズムは、物理的な物体の構成を更新する前に衝突の瞬間を計算するため、 事前法と呼ばれます。
事後法の主な利点は次のとおりです。この場合、衝突検出アルゴリズムは無数の物理変数を認識する必要がありません。単純な物理物体のリストがアルゴリズムに入力され、プログラムは交差する物体のリストを返します。衝突検出アルゴリズムは、摩擦、弾性衝突、さらに悪いことに非弾性衝突や変形可能な物体を理解する必要がありません。さらに、事後アルゴリズムは、事実上、事前アルゴリズムよりも 1 次元単純です。事前アルゴリズムは、事後問題には存在しない時間変数を処理する必要があります。
一方、事後アルゴリズムは、物理的に正しくない交差を修正する必要がある「修正」ステップで問題を引き起こします。さらに、離散ステップが大きすぎると、衝突が検出されず、十分に高速または小さければ、オブジェクトが別のオブジェクトを通り抜けることになります。
事前アルゴリズムの利点は、忠実度と安定性が向上することです。物理的シミュレーションを衝突検出アルゴリズムから分離することは困難ですが (完全に不可能というわけではありません)、最も単純なケースを除いて、2 つの物体が衝突するタイミングを事前に判断する (初期データが与えられた場合) という問題には、閉じた形式の解法はなく、通常は数値ルート ファインダーが関係します。
テーブルの上に置かれた花瓶など、一部のオブジェクトは静止接触、つまり衝突しているが跳ね返ったり貫通したりしていない状態にあります。すべての場合において、静止接触には特別な処理が必要です。2 つのオブジェクトが衝突 (事後) またはスライド (事前) し、それらの相対的な動きがしきい値を下回る場合、摩擦はスティクションになり、両方のオブジェクトはシーン グラフの同じブランチに配置されます。
最適化
複数のオブジェクトの衝突検出に対する明白なアプローチは非常に低速です。 すべてのオブジェクトを他のすべてのオブジェクトに対してチェックすることはもちろん機能しますが、オブジェクトの数が多い場合は非効率的すぎます。複雑な形状を持つオブジェクトを、各面を他の面に対してチェックするという明白な方法で互いにチェックすることは、それ自体非常に低速です。そのため、問題を高速化するためにかなりの研究が行われてきました。
時間的一貫性の活用
多くのアプリケーションでは、あるタイム ステップから次のタイム ステップまで、物理的な物体の構成はほとんど変化しません。多くのオブジェクトはまったく動かない場合があります。アルゴリズムは、前のタイム ステップで実行された計算を現在のタイム ステップで再利用できるように設計されており、計算がより速く完了します。
衝突検出の大まかなレベルでは、交差する可能性のある物体のペアを見つけることが目的です。これらのペアは、さらに分析する必要があります。このための初期の高性能アルゴリズムは、カリフォルニア大学バークレー校のミン・C・リン氏によって開発されました [1]。リン氏は、シーン内の すべてのn個の物体に対して軸に沿った境界ボックスを使用することを提案しました。
各ボックスは、3 つの区間の積で表されます (つまり、ボックスは です)。境界ボックスの衝突検出の一般的なアルゴリズムは、スイープとプルーニングです。このような 2 つのボックスと が交差するのは、 が と交差し、がと交差し、 が と交差する場合に限ります。1 つのタイム ステップから次のタイム ステップにかけて、と が交差する場合、次のタイム ステップでもそれらが交差する可能性が非常に高いと想定されます。同様に、それらが前のタイム ステップで交差しなかった場合は、それらが交差し続けない可能性が非常に高くなります。
そこで、問題は、どの間隔が交差するかをフレームごとに追跡する問題にまで縮小されます。間隔のリストは 3 つ (各軸に 1 つ) あり、すべてのリストの長さは同じです (各リストの長さは境界ボックスの数 であるため)。各リストでは、各間隔がリスト内の他のすべての間隔と交差することが許可されています。したがって、各リストには、 0 と 1 の行列があります。間隔とが交差する場合は 1、交差しない場合は 0 です。
我々の仮定によれば、間隔のリストに関連付けられたマトリックスは、基本的に 1 つのタイム ステップから次のタイム ステップまで変更されません。これを利用するには、間隔のリストは実際にはラベル付けされたエンドポイントのリストとして維持されます。リストの各要素には、間隔のエンドポイントの座標と、その間隔を識別する一意の整数が含まれます。次に、リストを座標で並べ替え、マトリックスを更新します。境界ボックスの構成が 1 つのタイム ステップから次のタイム ステップまで大幅に変更されない場合、このアルゴリズムが比較的迅速に機能すると考えるのはそれほど難しくありません。
布のシミュレーションなどの変形可能なボディの場合、以下で説明するように、より具体的なペアワイズ プルーニング アルゴリズムを使用することはできない可能性があり、nボディ プルーニング アルゴリズムが最善の方法です。
シーン内の物理的な物体の速度に上限を設定できる場合は、オブジェクトのペアを初期距離と時間ステップのサイズに基づいて削減できます。
ペアワイズ剪定
さらに調査するために 1 組の物理的な物体を選択したら、衝突をより慎重にチェックする必要があります。ただし、多くのアプリケーションでは、個々のオブジェクト (変形しにくい場合) は、主に三角形である小さなプリミティブのセットによって記述されます。つまり、三角形のセットが 2 つあり、(簡単にするために、各セットには同じ数の三角形があると仮定します)。
当然のことですが、すべての三角形をすべての三角形と衝突の有無でチェックすることになりますが、これには比較が含まれるため、非常に非効率的です。可能であれば、プルーニング アルゴリズムを使用して、チェックする必要のある三角形のペアの数を減らすことが望ましいです。
最も広く使用されているアルゴリズム群は、階層的境界ボリューム法として知られています。前処理ステップとして、各オブジェクト(この例では、および)に対して、境界ボリュームの階層を計算します。次に、各時間ステップで、との間の衝突をチェックする必要がある場合、階層的境界ボリュームを使用して、検討中の三角形のペアの数を減らします。球は多くの場合望ましくないことが指摘されていますが、簡単にするために、境界球を使用した例を示します。[引用が必要]
が三角形の集合である場合、境界球 を事前に計算することができます。 を選択する方法は多数ありますが、ここではが を完全に含み、 が可能な限り小さい球であると仮定します。
事前に、と を計算することができます。明らかに、これら 2 つの球が交差しない場合 (これは非常に簡単にテストできます)、 とも交差しません。ただし、これはn体の剪定アルゴリズム よりもそれほど優れているわけではありません。
が三角形の集合である場合、それを 2 つの半分とに分割できます。 これをとに実行して、境界球と を(事前に) 計算することができます。 ここでの期待は、これらの境界球がおよびよりもはるかに小さいことです。 また、たとえばと が交差しない場合は、 の任意の三角形を の任意の三角形と比較する意味はありません。
事前計算として、各物理的物体 (三角形の集合で表される) を取り、それを二分木に再帰的に分解することができます。ここで、各ノードは三角形の集合を表し、その 2 つの子はと を表します。木の各ノードで、境界球 を事前計算できます。
オブジェクトのペアの衝突をテストするときが来たら、それらの境界球ツリーを使用して、多数の三角形のペアを排除できます。
に球以外のものを選択すると、アルゴリズムのさまざまなバリエーションが得られます。軸に沿った境界ボックスを選択すると、AABBTree が得られます。有向境界ボックスツリーは OBBTree と呼ばれます。一部のツリーは、基になるオブジェクトが変更された場合に更新が簡単になります。一部のツリーは、単純な三角形ではなく、 スプラインなどの高次のプリミティブに対応できます。
正確なペアワイズ衝突検出
剪定が完了すると、正確な衝突検出をチェックするための候補ペアがいくつか残ります。
基本的な観察は、互いに重なり合わない任意の 2 つの凸型オブジェクトについて、空間内に平面を見つけることができ、一方のオブジェクトが完全にその平面の一方の側に位置し、もう一方のオブジェクトがその平面の反対側に位置するということです。これにより、凸型オブジェクトの非常に高速な衝突検出アルゴリズムの開発が可能になります。
この分野における初期の研究には、「分離平面」法が含まれていました。2 つの三角形が衝突するのは、基本的に、3 つの頂点を通る平面によって分離できない場合のみです。つまり、三角形が であり、各三角形が 内のベクトルである場合、3つの頂点 を取り、3 つの頂点すべてを通る平面を見つけて、これが分離平面であるかどうかを確認できます。そのような平面のいずれかが分離平面である場合、三角形は互いに重ならないとみなされます。一方、これらの平面のいずれも分離平面でない場合、三角形は交差しているとみなされます。そのような平面は 20 あります。
三角形が同一平面上にある場合、このテストは完全には成功しません。三角形のエッジに垂直な平面など、いくつかの追加の平面を追加することで、問題を完全に解決できます。他のケースでは、平面で出会うオブジェクトは、他の場所でも角度で出会う必要があるため、全体的な衝突検出で衝突を見つけることができます。
その後、より優れた方法が開発されました。2つの凸多面体オブジェクトの表面上で最も近い点を見つけるための非常に高速なアルゴリズムが利用可能です。Ming C. Linによる初期の研究[5]では、線形計画法の単体アルゴリズムのバリエーションが使用されました。Gilbert -Johnson-Keerthi距離アルゴリズムがそのアプローチに取って代わりました。これらのアルゴリズムは、前回の衝突チェックからの開始点を使用して、静止または低速で移動するオブジェクトのペアに繰り返し適用すると、定数時間に近づきます。
このアルゴリズム作業の最終結果として、一般的なパーソナル コンピューターやゲーム コンソールで、数千個の移動オブジェクトの衝突検出をリアルタイムで効率的に実行できるようになります。
事前剪定
ビデオゲームによくあるように、関係するオブジェクトのほとんどが固定されている場合、事前計算を使用する事前手法を使用して実行を高速化できます。
ここでも、n体プルーニングとペアワイズプルーニングの両方のプルーニングが望ましいですが、アルゴリズムでは、基礎となる物理システムで使用される時間と動作の種類を考慮する必要があります。
正確なペアワイズ衝突検出に関しては、これは軌道に大きく依存し、衝突の瞬間を計算するために 数値ルート検索アルゴリズムを使用する必要があるほどです。
例として、時間とを移動する 2 つの三角形を考えてみましょう。任意の時点で、前述の 20 の平面を使用して、2 つの三角形の交差を確認できます。ただし、これらの 20 の平面はすべて時間で追跡できるため、より優れた方法があります。 がの点を通過する平面である場合、追跡する平面は 20 あります。各平面は 3 つの頂点に対して追跡される必要があるため、追跡する値は 60 になります。これらの 60 個の関数にルート ファインダーを使用すると、2 つの指定された三角形と 2 つの指定された軌道の正確な衝突時間が生成されます。ここで、頂点の軌道が の線形多項式であると仮定すると、最終的な 60 個の関数は実際には 3 次多項式であり、この例外的なケースでは、3 次多項式のルートの公式を使用して正確な衝突時間を特定できることに留意してください。一部の数値解析者は、3 次多項式のルート ファインダーを使用する方が、多項式のルート ファインダーを使用するほど数値的に安定していないと示唆しています。[引用が必要]
空間分割
代替アルゴリズムは空間分割の傘の下にグループ化されており、これには八分木、バイナリ空間分割(または BSP ツリー)、およびその他の同様のアプローチが含まれます。空間をいくつかの単純なセルに分割し、2 つのオブジェクトが同じセルに存在しないことが示される場合、それらの交差をチェックする必要はありません。BSP ツリーは事前に計算できるため、このアプローチはゲーム内の壁や固定障害物の処理に適しています。これらのアルゴリズムは、一般的に上記のアルゴリズムよりも古いものです。
境界ボックス
バウンディングボックス(またはバウンディングボリューム)は、ほとんどの場合、2Dの長方形または3Dの直方体ですが、他の形状も可能です。ビデオゲームのバウンディングボックスは、ヒットボックスと呼ばれることもあります。バウンディングダイヤモンド、最小バウンディング平行四辺形、凸包、バウンディング円またはバウンディングボール、バウンディング楕円などがすべて試されてきましたが、バウンディングボックスはその単純さから最も人気があります。[6]バウンディングボックスは通常、衝突検出の初期段階(剪定段階)で使用され、重なり合うバウンディングボックスを持つオブジェクトのみを詳細に比較する必要があります。[7]
三角形の重心セグメント
三角形メッシュオブジェクトは、3D ボディ モデリングでよく使用されます。通常、衝突関数は三角形と三角形の交差、またはメッシュに関連付けられた境界形状です。三角形の重心は、鉛筆の先端でバランスをとるような質量の中心位置です。シミュレーションでは、物理パラメータに重心の次元を追加するだけで済みます。オブジェクトとターゲットの両方に重心ポイントがあれば、これら 2 つのポイントを結ぶ線分を定義できます。
三角形の重心の位置ベクトルは、その頂点の位置ベクトルの平均です。したがって、頂点が直交座標 を持つ場合、重心は です。
これは、2 つの 3D ポイント間の線分距離を計算する関数です。
ここで、セグメントの長さ/距離は、セグメントの調整可能な「ヒット」基準サイズです。オブジェクトが近づくと、長さはしきい値まで減少します。三角形の球が有効なジオメトリ テストになります。重心を中心とする球は、三角形のすべての頂点を囲むようにサイズを設定できます。
ビデオゲーム
ビデオゲームでは、非常に限られた計算時間を複数のタスクに分割する必要があります。このリソース制限と比較的原始的な衝突検出アルゴリズムの使用にもかかわらず、プログラマーはゲームで使用するための、正確ではないにしても信憑性のあるシステムを作成することができました。[引用が必要]
長い間、ビデオゲームでは扱うべきオブジェクトの数が非常に限られていたため、すべてのペアをチェックすることは問題ではありませんでした。2次元ゲームでは、ハードウェアが画面上のスプライト間の重なり合うピクセルを効率的に検出して報告できる場合もありました。[8]他の場合には、画面をタイル状に並べ、各スプライトを重なり合うタイルに結合するだけで十分な剪定が行われ、ペアごとのチェックにはヒットボックスと呼ばれる境界の四角形または円が使用され、十分に正確であると見なされました。
3 次元ゲームでは、空間分割法を使用して -body プルーニングを行っており、長い間、実際の 3D オブジェクトごとに 1 つまたは数個の球を使用してペアワイズ チェックを行ってきました。現実を忠実にシミュレートしようとするゲームを除き、正確なチェックは非常にまれです。その場合でも、正確なチェックがすべてのケースで使用されるとは限りません。
ゲームは実際の物理法則を模倣する必要がないため、安定性はそれほど問題になりません。ほとんどすべてのゲームは事後的な衝突検出を使用しており、衝突は多くの場合非常に単純なルールを使用して解決されます。たとえば、キャラクターが壁に埋め込まれた場合、最後に認識された良好な位置に戻されるだけです。一部のゲームでは、キャラクターが壁に埋め込まれる前に移動できる距離を計算し、その距離だけ移動できるようにします。
多くの場合、ビデオゲームでは、キャラクターを点に近似するだけで、環境との衝突検出に十分です。この場合、バイナリ空間分割ツリーは、点が風景に埋め込まれているかどうかを確認するための、実行可能で効率的でシンプルなアルゴリズムを提供します。このようなデータ構造は、キャラクターが地面に沿って走っているときの「静止位置」状況をうまく処理するためにも使用できます。キャラクター間の衝突、および発射物や危険物との衝突は、別々に処理されます。
堅牢なシミュレータとは、あらゆる入力に合理的な方法で反応するシミュレータです。たとえば、高速レースカーのビデオ ゲームを想像すると、シミュレーションの 1 つのステップから次のステップまでの間に、車がレース トラックに沿ってかなりの距離を進むことが考えられます。トラックに浅い障害物 (レンガの壁など) がある場合、車が完全にそれを飛び越えてしまう可能性がまったくないわけではなく、これは非常に望ましくありません。他の例では、事後アルゴリズムに必要な「修正」が正しく実装されていないため、キャラクターが壁に閉じ込められたり、壁を通り抜けて無限の空間に落ちたりするバグが発生します。その空間には、支配的な色に応じて「ブラック ヘル」、「ブルー ヘル」、「グリーン ヘル」と呼ばれることもある、致命的な底なしの穴があるかどうかはわかりません。これらは、衝突検出および物理シミュレーション システムが機能していないことの証です。Big Rigs: Over the Road Racing は、衝突検出システムが機能していないか、または機能していない可能性のあるゲームの悪名高い例です。
ヒットボックス
ヒットボックスは、ビデオゲームでリアルタイムの衝突検出によく使用される目に見えない形状で、バウンディング ボックスの一種です。ヒットボックスは、多くの場合、長方形 (2D ゲームの場合) または直方体(3D の場合) で、可視オブジェクト (モデルやスプライトなど) 上の点に取り付けられ、その点をたどります。円形や球形も一般的ですが、これらは依然として「ボックス」と呼ばれることが多いです。アニメーション化されたオブジェクトでは、動きの正確性を確保するために、各可動部分にヒットボックスが取り付けられているのが一般的です。[9] [信頼できない情報源? ]
ヒットボックスは、キャラクターがパンチや弾丸に当たった場合など、「一方通行」の衝突を検出するために使用されます。ヒットボックスの位置は常に変化するため、人間とAIの両方にとって管理が難しいため、ヒットボックスはフィードバックを伴う衝突 (壁にぶつかるなど) の検出には適していません。このような種類の衝突は通常、より単純な軸に沿った境界ボックスで処理されます。プレイヤーは、これらの種類のインタラクションを指すために「ヒットボックス」という用語を使用できます。
ハートボックスは、入ってくるダメージ源を検出するために使用されるヒットボックスです。この文脈では、ヒットボックスという用語は通常、ダメージを与えるものに対して使用されます。たとえば、攻撃者のパンチの周りのヒットボックスが相手の体のハートボックスの 1 つに当たった場合にのみ攻撃が成功しますが、反対のヒットボックスが衝突すると、プレイヤーは打撃を交換したりキャンセルしたりすることがありますが、反対のハートボックスは互いに影響しません。この用語は業界全体で標準化されていません。ヒットボックスとハートボックスの定義が逆になっているゲームもあれば、両側にのみ「ヒットボックス」を使用するゲームもあります。
参照
参考文献
- ^ Teschner, M.; Kimmerle, S.; Heidelberger, B.; Zachmann, G.; Raghupathi, L.; Fuhrmann, A.; Cani, M.-P.; Faure, F.; Magnenat-Thalmann, N.; Strasser, W.; Volino, P. (2005). 「変形可能なオブジェクトの衝突検出」. Computer Graphics Forum . 24 : 61–81. CiteSeerX 10.1.1.58.2505 . doi :10.1111/j.1467-8659.2005.00829.x. S2CID 1359430.
- ^ 「myPhysicsLab Billiards」. www.myphysicslab.com . 2024年7月8日閲覧。
- ^ ビリヤード台シミュレーション (calpoly.edu) https://users.csc.calpoly.edu/~zwood/teaching/csc471/finalW19/jpietrok/index.html
- ^ https://www.cs.rpi.edu/~cutler/classes/advancedgraphics/S09/final_projects/anderson.pdf
- ^ Lin, Ming C (1993). 「アニメーションとロボット工学のための効率的な衝突検出 (論文)」(PDF)。カリフォルニア大学バークレー校。2014 年 7 月 28 日のオリジナル(PDF)からアーカイブ。
- ^ Caldwell, Douglas R. (2005-08-29). 「境界ボックスの謎を解明する」。米国陸軍工兵研究開発センター、地形工学センター、研究部門、情報生成管理部門。2012-07-28時点のオリジナルよりアーカイブ。2014-05-13に閲覧。
- ^ Gan B 、 Dong Q (2022)。「ハイブリッド階層境界ボックスの衝突検出のための改良最適アルゴリズム」。進化知能。15 (4): 2515–2527。doi :10.1007/ s12065-020-00559-6。
- ^ 「Amiga のコンポーネント: MC68000 と Amiga カスタム チップ」(リファレンス マニュアル) (2.1 版)。第 1 章。2018 年 7 月 17 日にオリジナルからアーカイブされました。2018年 7 月 17 日に取得。
さらに、システム ハードウェアを使用してオブジェクト間の衝突を検出し、プログラムがそのような衝突に反応するようにすることもできます。
- ^ 「 Hitbox」。Valve開発者コミュニティ。Valve。2011年9 月 18 日閲覧。
外部リンク
- ノースカロライナ大学チャペルヒル校の衝突検出研究ウェブサイト
- 衝突検出に関するスティーブン・キャメロン教授(オックスフォード大学)のウェブサイト
- 衝突を回避する方法、George Beck、Wolfram Demonstrations Project著。
- 境界ボックスとその使用法
- 分離軸定理
- Unity 3D 衝突
- ゴドー物理衝突
