3

本当に楽しいだけのプロジェクトに取り組んでいるときに、いくつかの問題に遭遇しました。

丸いボール、先のとがった三角形、細い線 (その他の野生動物も) で構成された 2D の世界があります。それらはすべて WorldCreatures のサブクラスです。彼らはこの世界の中を移動することができます。それらが互いに出会うと、衝突が発生します。

私がやりたいことは、それらの間の衝突を検出する方法を作ることです。これが私が今立っているものです:

  • 私にとって、Ball-Ball は簡単​​です。位置からの距離を計算し、それを「サイズ」の合計と比較するだけです。
  • ボールと世界の端の間の衝突も単純です - 私はそこからの距離をチェックするだけで、デカルト座標では単純です。
  • より一般的な問題は - ライン (あるポイントで開始および終了する) またはそこにある可能性のある他のオブジェクト間の衝突を検出する方法は? 線と点の間の距離も簡単に計算できますが、私が欲しいのは

AObject が Objectと衝突するかどうかを示すある種の一般的な方法B。現在のコードは次のようになります。

class WorldCreature:
    def detectCollision(self, otherObject):
        # do something 
        if collision:
            self.onCollision(otherObject)
            otherObject.onCollision(self)
class Ball(WorldCreature):
    # someing here
class Line(WorldCreature):
    # someing here

ここで、衝突検出メカニズムは、どのオブジェクトが衝突できるかに依存する必要があります。効果もそうでしょう。

メモリ内のすべてのオブジェクトのリストを保持し、すべてのステップでそれらすべてをループする必要があります? または、このタスクのパフォーマンスを向上させるためのより良い方法はありますか?

4

4 に答える 4

5

四分木を使用します。これらは、衝突半径の外側にあることがわかっている大きな領域を削除するために使用されます。さらに、最も近いポイントをすばやく検索できます。

実際の衝突検出に関しては、凸型オブジェクトのみを使用しているため、分離軸定理に関するMetanetSoftwareのチュートリアルを参照してください。彼らの主力ゲームでは、実際にはグリッドを使用して衝突をチェックするすべてのオブジェクトを見つけますが、代わりに四分木を使用するのはそれほど難しいことではありません。

(半径内の点を見つける方法を説明するためにグリッド内の円を使用した四分木に関する記事を読んだことを覚えています。しかし、それを見つけることができないようです。)

于 2009-03-14T19:24:59.697 に答える
1

Python。私にとってちょっと奇妙な獣8)

私はc++でゲームを作成した経験があるので、この観点から話します。

まず第一に(オブジェクトの数が少ない場合はこれをスキップできます)、広相衝突検出が必要です。すでに述べたクアッドツリーは、可能な実装の1つにすぎません。衝突する可能性のあるオブジェクトのペアを見つけるには、ブロードフェーズが必要です。

次に、狭いフェーズに進みます-ペアがチェックされるとき。

私は次のスキームを使用しました(注-多面体の衝突が必要な場合は、プリミティブを念頭に置いて作成されました-GJKと球、さらに光線、セグメントを使用してください):

衝突が必要なものにはすべて、CollisionPrimitive(ボックス、球など)の変換と保存を処理するCollisionObjectがあります。

各CollisionPrimitiveにはtype_idがあります(A_B_CheckIntersectionと書くと、最初のオブジェクトには常に低いtype_idがあります)

ブロードフェーズから取得するリスト内のペアごとに、必要に応じてオブジェクトを交換し、特定の衝突関数へのポインターが格納されている配列にインデックスを付けます。確かに-そのためには、それらに同一のインターフェース(c ++)を持たせる必要がありますが、それは簡単です8)

特定の衝突ルーチンについては、http://realtimerendering.com/intersections.html にアクセスしてください。開始するのに適した場所です。

于 2009-05-03T22:18:52.967 に答える
1

これに対する答えは、オブジェクトの数、移動しているオブジェクトと移動していないオブジェクトの数、移動速度など、さまざまな要因によって異なります。開始するのに適切な場所は、コアの衝突を取得することだと思います。衝突チェックなどを整理するために行う可能性のある最適化を無視しながら、検出と動作のコードを修正します。

コアコードが正しい場合は、実験の実行を開始して、何がうまく機能するかを確認できます。kdツリーなどのある種の空間細分割手法をお勧めします(2Dでは、クワッドツリーを使用することもできます)。

ただし、基本的には、ゲームをコーディングして実験することで判断できることを除いて、正しい答えはおそらく1つではありません。

于 2009-03-14T19:30:03.833 に答える
0

ハフ変換はどういうわけか役立つはずだと思います 。

于 2009-03-14T19:46:19.443 に答える