57

私はいつもこれを疑問に思っていました。何万ものオブジェクトがあるGTAのようなゲームでは、ヘルス パックを使用するとすぐに、ゲームはどのようにそれを認識しますか?

オブジェクトごとにイベントリスナーが存在する可能性はありませんか? 繰り返しも良くないですか?実際にどうやって作ったのか気になります。

4

6 に答える 6

63

これに対する答えは1つではありませんが、大規模な世界では、多くの場合、四分木またはkd木の線に沿って何かを使用して空間分割され、線形時間(分数の累乗、または最悪の場合O(N ^( 2/3))3Dゲームの場合)。これらの方法は、バイナリ空間分割のBSPと呼ばれることがよくあります。

衝突検出に関しては、各オブジェクトには通常、バウンディングボリュームメッシュ(凸包を形成するポリゴンのセット)が関連付けられています。これらの非常に単純化されたメッシュ(場合によっては単なる立方体)は描画されませんが、衝突の検出に使用されます。最も基本的な方法は、各オブジェクトの中点を線の中点で線と交差する平面と接続する線に垂直な平面を作成することです。オブジェクトのバウンディングボリュームがこの平面の両側にポイントを持っている場合、それは衝突です(平面に対して2つのバウンディングボリュームの1つをテストするだけで済みます)。もう1つの方法は、拡張GJK距離アルゴリズムです。チュートリアルを詳しく知りたい場合は、NeHe ProductionsのOpenGLレッスン#30をご覧ください。

ちなみに、バウンディングボリュームは、オクルージョンクエリと呼ばれるものなどの他の最適化にも使用できます。これは、どのオブジェクトが他のオブジェクト(オクルーダー)の背後にあるかを判断するプロセスであるため、処理/レンダリングする必要はありません。バウンディングボリュームは、どのオブジェクトが遠近法のビューボリュームの外側にあるか(視野角に近すぎる、遠すぎる、または超えている)を判断するプロセスである錐台カリングにも使用できます。したがって、レンダリングする必要はありません。


Kylotanが指摘したように、バウンディングボリュームを使用すると、オクルージョンを検出するときに誤検知が発生する可能性があり、トロイドなどの一部のタイプのオブジェクト(ドーナツの穴を通して見るなど)ではまったく機能しません。これらのようなオブジェクトを正しく閉塞させることは、ポータルカリングに関するまったく別のスレッドです。

于 2009-12-25T06:51:05.847 に答える
9

Quadtrees と Octrees (別の quadtree ) は、空間分割を使用してこれを実現する一般的な方法です。後者の例では、衝突のペアごとの総当たり検索で処理が 97% 削減されたことを示しています。

于 2009-12-25T06:26:33.343 に答える
4

ゲーム物理エンジンの一般的な手法は、スイープアンドプルーン方式です。これは、David BaraffのSIGGRAPHノートで説明されています(「制約付きのモーション」の章を参照)。Havokは間違いなくこれを使用しています。これはBulletのオプションだと思いますが、PhysXについてはよくわかりません。

アイデアは、各軸でAABB(軸に位置合わせされたバウンディングボックス)のオーバーラップを確認できるということです。2つのオブジェクトのAABBの投影が、3つの軸すべてでオーバーラップする場合、AABBはオーバーラップする必要があります。AABBの始点と終点を並べ替えることで、各軸を比較的すばやく確認できます。通常、ほとんどのオブジェクトはあまり速く移動しないため、フレーム間には多くの時間的一貫性があり、並べ替えはあまり変わりません。

スイープアンドプルーンがAABB間のオーバーラップを検出したら、球とボックスなど、オブジェクトのより詳細なチェックを実行できます。詳細なチェックで衝突が明らかになった場合は、力を加えることで衝突を解決したり、ゲームイベントをトリガーしたり、効果音を再生したりできます。

于 2009-12-25T16:50:18.527 に答える
2

正しい。通常、各オブジェクトのイベント リスナーはありません。多くの場合、ゲーム マップを模倣する非バイナリ ツリー構造がメモリ内に存在します。地下鉄/地下鉄の地図を想像してみてください。このメモリ構造は、ゲーム内のもののコレクションです。あなたはプレイヤー、あなたが拾うことができるモンスターやアイテム、または爆破してあなたに害を及ぼす可能性のあるアイテムです。そのため、プレイヤーがゲーム内を移動すると、プレイヤー オブジェクト ポインターがゲーム/マップ メモリ構造内で移動します。

自分のゲーム エンティティに周囲の情報を知ってもらうにはどうすればよいですか? を参照してください。

于 2009-12-25T05:43:17.050 に答える
1

リアルタイム衝突検出に関する Christer Ericson の堅実な本をお勧めしたいと思います。衝突検出の基礎を示しながら、現代の研究努力に関する参考資料を提供します。

リアルタイム衝突検出 (対話型 3D テクノロジのモーガン カウフマン シリーズ)

于 2010-12-21T21:11:50.073 に答える
1

多くの最適化を使用できます。まず、任意のオブジェクト (インデックス i など) は、中心座標CXiCYi、およびサイズの立方体によって境界付けられます。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) のオブジェクトは、物理計算などで衝突として処理されます。

于 2009-12-25T06:18:50.193 に答える