Los Quadtrees se utilizan cuando solo necesita almacenar cosas que están efectivamente en un avión. Al igual que las unidades en un RTS clásico donde están todos en el suelo o un poco por encima. Esencialmente, cada nodo tiene enlaces a 4 niños que dividen el espacio del nodo en cuartos distribuidos uniformemente.
Los octrees hacen lo mismo pero en las tres dimensiones en lugar de solo dos, y así tienen 8 nodos secundarios y dividen el espacio en ochos. Deben usarse cuando las entidades del juego se distribuyen de manera más uniforme entre las tres dimensiones.
Si está buscando un árbol binario, como un árbol rojo-negro, querrá usar una estructura de datos llamada árbol de particionamiento de espacio binario (árbol BSP) o una versión llamada árbol KD. Estos espacios de partición en mitades utilizando un plano, en el árbol KD los planos son ortogonales (en los ejes XZ, XY, ZY) por lo que a veces funciona mejor en una escena 3D. Los árboles BSP dividen la escena usando planos en cualquier orientación, pero pueden ser bastante útiles, y se usaron desde Doom.
Ahora porque has dividido el espacio del juego, ahora no tienes que probar cada entidad de juego contra cada otra entidad del juego para ver si colisionan, que es un algoritmo O (n^2) en el mejor de los casos. En su lugar, consulta la estructura de datos para devolver las entidades del juego dentro de una subregión del espacio del juego, y solo realiza la detección de colisión para esos nodos uno contra el otro.
Esto significa que la detección de colisiones para todas las entidades del juego debe ser n operación O (nlogn) (en el peor de los casos).
Un par de cosas adicionales a tener en cuenta:
- asegúrese de probar entidades juego de nodos adyacentes, no sólo los que están en el nodo actual, ya que todavía podrían colisionar.
- Reequilibre la estructura de datos después de que las entidades se hayan movido ya que puede tener nodos vacíos en la estructura de datos o demasiados para un buen rendimiento (también el caso degenerado de todas las entidades en el mismo nodo).
Esto es un poco vago. Creo que la implementación del árbol necesita saber qué tipo de datos quiere almacenar, ya que eso afecta los detalles sobre cómo funciona la inserción (división, etc.). – unwind