2D衝突検出に四分木を使用しようとしていますが、それを実装する方法に少し困っています。まず、4つのサブツリー(各象限を表す1つ)を含む四分木と、単一のサブツリーに収まらないオブジェクトのコレクションがあります。
ツリー内のオブジェクトの衝突をチェックするとき、私はこのようなことをします(2D衝突検出のための QuadTreeのおかげで ):
四分木ツリー内のすべての衝突を見つけるには:
四分木に挿入するには:
四分木を更新するには:
よろしいですか?改善できますか?
四分木構造は最適ではありません。ノードごとに4つのサブツリーを格納するのは適切ですが、実際のオブジェクトは、内部ノードではなく、リーフ内にのみ格納する必要があります。したがって、実際のオブジェクトを保持するコレクションを葉に移動する必要があります。
operationsの実装を見てみましょう:
これにはいくつかの利点があります:
のみ不利な点:
四分木は、衝突検出に常に最適なデータ構造であるとは限りません。クワッドツリーのオーバーヘッドは無制限になる可能性があり(ツリーの深さを制限しない場合)、最悪の場合はまったく速度を上げないでください。代わりに、スパースグリッドの使用を検討することをお勧めします。これにより、複数のツリーレベルをトラバースする余分なオーバーヘッドがなく、クアッドツリーよりもパフォーマンスが向上します。
さらに良いかもしれない他の完全に異なるアプローチもあります。たとえば、次のモジュールで行ったように、ZomorodianおよびEdelsbrunnerのアルゴリズムを実装してみることができます。
これらの問題をより詳細に議論するために私が書いたいくつかの記事もここにあります:
特に、前のセクションのベンチマークを見ると、調査されたすべてのライブラリーのクアッドツリーは、Rツリー、グリッド、セグメントツリーなどの他の衝突検出方法と比較して、パフォーマンスが非常に悪い傾向があります。
まだどの程度のCPU効果があるのかはわかりませんが、Eclipseで私のコアデュオで問題なく動作しているようですが、それでも2400 fpsを超えていますlol ..
基本的に、衝突可能なオブジェクトに1つのリストを追加して、(四分木への挿入により)オブジェクトを関連付けた四分木ノードオブジェクトへの参照を格納します。また、各クワッドツリーノードにリストを追加しました。このリストには、そのノードの境界内であると見なされたオブジェクトへの参照が格納されています。したがって、各ノードには各オブジェクトが1つだけ出現します。各ノードには、親ノードへの参照も格納されます。衝突の精度をさらに上げるために最初のノードの後にそれらのノードをチェックしたい場合は、近くのノードに移動します。
1つのセルで他のすべてのオブジェクトへの参照を取得するのは非常に簡単です。
list temp_checklist = object.cells[cell_index].objects
//('objects' being some sort of array or list of object references as described above)
それが誰かを助けることを願っています;)