高速で正確な2D衝突検出を実装するにはどうすればよいですか?


11

2つ以上の2Dオブジェクトが衝突しているかどうかを検出する方法はよく知っていますが、衝突をチェックするかどうかを決定する方法に興味があります。以前のプロジェクトでは、すべてのオブジェクトを他のすべてのオブジェクト(O(n ^ 2)レベルの愚かさ)に対してチェックしただけで、滑らかではないゲームプレイが作成されました。

さまざまなフォーラムが、クワッドツリー、Bツリー、および他のあらゆる種類のツリーや構造を思いつくことができます。

衝突をチェックするかどうかを決定するための最も効率的な構造は何ですか?


1
考慮したいことの1つは、移動したオブジェクトの衝突のみをチェックすることと、自分に近いオブジェクトだけをチェックすることです。私の現在のシステムはうまく機能します(数十万のオブジェクト)-そして私がやっていることはそれだけです。
ultifinitus 2011年

gamedev.stackexchange.com/questions/14369/…があなたの助けになると思います。それはもともと並列処理のためのアルゴリズムのためのものでしたが、同じアルゴリズムでシングルスレッドアプリケーションも改善できると思います。
Ali1S232 2011年

1
@ultifinitusそれは本質的に私が求めていることです。すべてのオブジェクトを繰り返し処理してその位置を確認せずに、どのオブジェクトが近くにあるかを判断するにはどうすればよいですか?
Mike Cluck、2011年

マイク、私が使用した特定のコードをメールで受け取ることができます。それはc ++で記述されています。または、基本的な構造を提供することもできますが、そのため、あいまいで複雑になる場合があります。
ultifinitus 2011年

1
衝突のチェックを行う必要があるかどうかを判断するためにどのような構造が最適かを尋ねていたため、これは重複ではありません。その別の質問は、透過的衝突と非透過的衝突について尋ねていました。言うまでもなく、この質問はあなたがリンクした質問の1年前に尋ねられました。
Mike Cluck、2014年

回答:


12

2Dゲームの場合、2Dオブジェクトがマップの片側に非常に重い分布をしていない限り、ほとんどの場合、均一なグリッドが適しています。メモリの複雑さは単純で(マップの次元に比例)、妥当な分布で、O(1)ルックアップ時間と平均log(numberOfObjects /(行*列))^ 2交差テストがありますセルごとに行われます。オブジェクトが移動したセルのみをチェックするように決定すると、静的なジオメトリがはるかに効率的になります。均一なグリッドをその場で変更することは簡単で(ツリーベースのソリューションよりもはるかに簡単です)、実装も簡単です。2Dゲームでそれを使用しないと言う唯一の時間は、均一なグリッドのメモリ要件が大きくなりすぎたときです(たとえば、レベルがまばらであるが巨大なスペースシム)。


このソリューションは、2つまたは4つのグリッドセルに隣接するオブジェクトをどのように扱いますか?
ashes999

1
オブジェクトがオーバーラップしているセルは、その中にあると見なされるため、オブジェクトは複数のセルに存在できます。ほとんどの空間データ構造は、オーバーラップの問題を同様の方法で処理します。
Darcy Rayner

うわー、それはかなり賢いです。+1乾杯。
ashes999 2012年


1

他のものと比較して、世界に1つの非常に「長い」次元(Xと呼ぶ)がある場合、オブジェクトを順序付きリストに保持し、移動時に再ソートできます。衝突検出は、 X軸で重なります。

もう1つの可能性は、オブジェクトのアクティブ/パッシブリストを保持し、パッシブオブジェクト(まったく移動しない)を気にしないことです。

それらがすべて画面上のプレーヤーに見える中程度のサイズのオブジェクトである場合、すべて対すべてがおそらくそれほど悪くはありません。

それ以外は、ダーシーと一緒です。均一なグリッドがいいです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.