私は大規模なプロジェクトで四分木を使用しました。これは、あまり動かない (削除と再挿入が少ない) ゲーム オブジェクトに適しています。オクトリーにも同じ原則が適用されます。
基本的なアイデアは、再帰的なツリー構造を作成し、ツリーのルートと同じタイプの 4 (quad) または 8 (oct) の子オブジェクトを格納することです。ツリーの各ノードはデカルト空間のセクションを表します。たとえば、該当する各軸で -100 -> +100 です。各子は同じスペースを表しますが、半分に分割されます (例の直接の子は、たとえば、X 軸で -100->0、Y 軸で -100->0 を表します)。
与えられた一連の寸法を持つ正方形または平面を想像してみてください。次に、各軸の中心を通る線を引き、その平面を 4 つの小さな平面に分割します。そのうちの 1 つを取得して、平面セグメントのサイズがゲーム オブジェクトのサイズとほぼ同じになるポイントに到達するまで、何度も繰り返します。これでツリーができました。同じ平面を占めるオブジェクトのみが衝突する可能性があります。どのオブジェクトが衝突できるかを決定したら、それらから可能な衝突のペアを生成します。この段階で、ブロード フェーズが完了し、ナロー フェーズの衝突検出に進むことができます。これは、より正確で高価な計算を行う場所です。
Broadphase の目的は、安価な計算を使用して衝突の可能性を生成し、発生しない接触を除外することです。これにより、狭いフェーズ アルゴリズムが実行する必要のある作業が削減され、衝突検出アルゴリズム全体がより効率的になります。
したがって、先に進んでそのようなアルゴリズムを実装しようとする前に、次のことを行います。
ゲーム内のオブジェクトの数は? たくさんある場合は、おそらくブロードフェーズが必要です。そうでない場合は、Nnarrowphase で十分です。また、多くの移動オブジェクトを扱っていますか?
ツリー構造は、移動するだけでツリー内の位置が時間の経過とともに変化する可能性があるため、オブジェクトを移動すると一般に速度が低下します。これには、フレームごとにオブジェクトを削除して再挿入する必要があり (場合によっては)、これは理想的ではありません。
この場合、ワールド内の形状の範囲の最小/最大ヒープを維持する Sweep と Prune を使用する方がよいでしょう。オブジェクトを再挿入する必要はありませんが、フレームごとにヒープを再ソートする必要があります。これは、削除と再挿入を伴うツリー全体のトラバーサルよりも一般的に高速であると考えられます。
コーディングの経験によっては、コーディングがより複雑になる場合があります。個人的には、ツリーはコーディングがより直感的であることがわかりましたが、効率が低く、エラーが発生しやすいことがわかりました。これは、オブジェクトが軸の真上または中心にある場合にどうするかなど、他の問題を引き起こすためです。ルートノードの。これは、空間的なオーバーラップがあるルーズ ツリーを使用することで解決できます。これにより、このような場合に、1 つの子ノードが常に他のノードよりも優先されるようになります。