私はいつもこれを疑問に思っていました。 [〜#〜] gta [〜#〜] のようなゲームでは、何万ものオブジェクトがありますが、ヘルスパックを使用するとすぐにゲームはどのように認識しますか?
オブジェクトごとにイベントリスナーを配置することはできませんか?繰り返しも良くありませんか?私はそれが実際にどのように行われているのか疑問に思っています。
これには誰も答えはありませんが、大きな世界はしばしば quadtree または kd-tree の線に沿って何かを使用することで空間分割されます。線形時間(分数の力、または3Dゲームの場合は最悪の場合O(N ^(2/3)))。これらのメソッドは、バイナリスペースパーティショニングでは[〜#〜] bsp [〜#〜]と呼ばれることがよくあります。
衝突検出に関して、各オブジェクトには通常、境界ボリュームメッシュ(凸包を形成するポリゴンのセット)も関連付けられています。これらの非常に単純化されたメッシュ(場合によっては立方体)は描画されませんが、衝突の検出に使用されます。最も基本的な方法は、各オブジェクトの中点を結ぶ線に垂直な平面を作成することです。この平面は、線の中点で線と交差します。オブジェクトのバウンディングボリュームのこのプレーンの両側にポイントがある場合、衝突です(プレーンに対して2つのバウンディングボリュームのいずれかをテストするだけで済みます)。別の方法は、拡張された [〜#〜] gjk [〜#〜] 距離アルゴリズムです。チュートリアルの詳細については、 NeHe ProductionsのOpenGLレッスン# をご覧ください。
ちなみに、バウンディングボリュームは、いわゆるオクルージョンクエリなどの他の最適化にも使用できます。これは、どのオブジェクトが他のオブジェクト(オクルーダー)の背後にあるため、処理/レンダリングする必要がないかを判断するプロセスです。バウンディングボリュームは、frustum cullingにも使用できます。これは、どのオブジェクトが透視表示ボリュームの外側にあるか(近すぎる、遠すぎる、または視野角を超えて)、したがってレンダリングする必要はありません。
Kylotanが指摘したように、境界ボリュームを使用すると、オクルージョンを検出するときに誤検知が発生する可能性があり、トロイドなどの一部の種類のオブジェクトではまったく機能しません(ドーナツの穴を通して見るなど)。これらのようなオブジェクトを正しくオクルードすることは、portal-culling上の他のスレッド全体です。
クアッドツリーとオクトリーズ 、 別のクアッドツリー は、これを達成するためのスペース分割を使用する一般的な方法です。後者の例では、衝突のペアごとのブルートフォース検索よりも処理が97%削減されています。
ゲーム物理エンジンの一般的な手法は、スイープアンドプルーネ法です。これは David BaraffのSIGGRAPH notes で説明されています(「制約のあるモーション」の章を参照)。 Havokは間違いなくこれを使用しています。Bulletのオプションだと思いますが、PhysXについてはわかりません。
アイデアは、各軸上のAABB(軸に沿った境界ボックス)のオーバーラップを見ることができるということです。 2つのオブジェクトのAABBの投影が3つの軸すべてでオーバーラップする場合、AABBはオーバーラップする必要があります。 AABBの開始点と終了点を並べ替えることにより、各軸を比較的迅速に確認できます。通常、ほとんどのオブジェクトは非常に高速に移動しないため、フレーム間には多くの時間的一貫性があります。したがって、ソートはあまり変わりません。
スイープアンドプルーネがAABB間のオーバーラップを検出すると、オブジェクトのより詳細なチェックを行うことができます。球対箱。詳細なチェックで衝突が明らかになった場合は、力を加えて衝突を解決したり、ゲームイベントをトリガーしたり、効果音を再生したりできます。
正しい。通常、各オブジェクトのイベントリスナーはありません。多くの場合、ゲームマップを模倣する非バイナリツリー構造がメモリ内にあります。地下鉄/地下鉄の地図を想像してください。この記憶構造は、ゲーム内の物の集まりです。プレイヤー、モンスター、ピックアップできるアイテム、または爆発して害を及ぼす可能性のあるアイテム。そのため、プレーヤーがゲーム内を移動すると、プレーヤーオブジェクトポインターがゲーム/マップメモリ構造内で移動します。
リアルタイムの衝突検出に関するChrister Ericsonの堅実な本をお勧めします。衝突検出の基本を示しながら、現代の研究努力に関する参考資料を提供します。
多くの最適化を使用できます。まず、オブジェクト(たとえば、インデックスiなど)は、中心座標CXi
、CYi
、サイズSi
の立方体で区切られます。次に、推定で衝突検出が機能します。
a)条件付きのすべてのペアキューブi、jを見つける:Abs(CXi-CXj)<(Si+Sj) AND Abs(CYi-CYj)<(Si+Sj)
b)a)で取得したペアでのみ動作します。 Sqrt(Sqr(CXi-CXj)+Sqr(CYi-CYj))
のようなオブジェクト間の距離をより正確に計算します。オブジェクトは、キューブ、球、円錐などの単純な数字の数のセットとして表され、ジオメトリ式を使用してこれらの図形の交点を確認します。
c)b)から検出された交差点を持つオブジェクトは、物理計算などとの衝突として処理されます。