四分木は、効果的に平面上にあるものだけを格納する必要がある場合に使用されます。古典的なRTSのユニットのように、それらはすべて地面にあるか、その少し上にあります. 基本的に、各ノードには、ノードのスペースを均等に分散された四分の一に分割する 4 つの子へのリンクがあります。
オクトリーは同じことを行いますが、2 次元だけでなく 3 次元すべてであるため、8 つの子ノードがあり、空間を 8 つに分割します。これらは、ゲーム エンティティが 3 つの次元すべてに均等に分散されている場合に使用する必要があります。
赤黒木などの二分木を探している場合は、二分空間分割木 (BSP 木) と呼ばれるデータ構造か、KD 木と呼ばれるそのバージョンを使用します。これらは、平面を使用してスペースを半分に分割します。KD ツリーでは、平面は (XZ、XY、ZY 軸上で) 直交しているため、3D シーンでうまく機能する場合があります。BSP ツリーは、プレーンを使用して任意の方向にシーンを分割しますが、非常に便利であり、Doom まで使用されていました。
ゲーム空間を分割したので、すべてのゲーム エンティティを他のすべてのゲーム エンティティに対してテストして、それらが衝突するかどうかを確認する必要はありません。これはせいぜい O(n^2) アルゴリズムです。代わりに、データ構造にクエリを実行して、ゲーム空間のサブ領域内のゲーム エンティティを返し、それらのノードの相互の衝突検出のみを実行します。
これは、すべてのゲーム エンティティの衝突検出が (最悪の場合) n O(nlogn) 操作であることを意味します。
注意すべきいくつかの追加事項:
- 衝突する可能性があるため、現在のノードのゲーム エンティティだけでなく、隣接するノードのゲーム エンティティを必ずテストしてください。
- エンティティが移動した後にデータ構造のバランスを取り直します。これは、データ構造内に空のノードが存在するか、エンティティが多すぎてパフォーマンスが低下している可能性があるためです (すべてのエンティティが同じノードにあるという縮退のケースでもあります)。