No. La detección de colisión no siempre es O (N ^ 2).
Por ejemplo, supongamos que tenemos un espacio de 100x100 con objetos con un tamaño de 10x10. Podríamos dividir este espacio en celdas de 10x10 con una cuadrícula.
Cada objeto puede estar en hasta 4 celdas de la cuadrícula (podría caber en un bloque o estar "entre" celdas). Podríamos mantener una lista de objetos en cada celda.
Solo necesitamos verificar las colisiones en esas celdas. Si hay un número máximo de objetos por celda de cuadrícula (por ejemplo, nunca hay más de 4 objetos en el mismo bloque), la detección de colisión para cada objeto es O (1) y la detección de colisión para todos los objetos es O (N).
Esta no es la única forma de evitar la complejidad O (N ^ 2). Existen otros métodos, más adecuados para otros casos de uso, a menudo utilizando estructuras de datos basadas en árboles.
El algoritmo que describí es un tipo de partición espacial , pero hay otros algoritmos de partición espacial. Consulte Tipos de estructuras de datos de partición espacial para obtener más algoritmos que evitan la complejidad temporal O (N ^ 2).
Tanto Box2D como Bullet admiten mecanismos para reducir el número de pares marcados.
Del manual , sección 4.15:
El procesamiento de colisión en un paso de física se puede dividir en fase estrecha y fase amplia. En la fase estrecha calculamos puntos de contacto entre pares de formas. Imagina que tenemos N formas. Usando la fuerza bruta, necesitaríamos realizar la fase estrecha para N * N / 2 pares.
La clase b2BroadPhase reduce esta carga mediante el uso de un árbol dinámico para la gestión de pares. Esto reduce en gran medida el número de llamadas de fase estrecha.
Normalmente no interactúa directamente con la fase amplia. En cambio, Box2D crea y gestiona una fase amplia internamente. Además, b2BroadPhase está diseñado teniendo en cuenta el bucle de simulación de Box2D, por lo que probablemente no sea adecuado para otros casos de uso.
Del Wiki Bullet :
Existen varios tipos de algoritmos de fase amplia que mejoran el algoritmo ingenuo O (n ^ 2) que solo devuelve la lista completa de pares. Estas fases optimizadas a veces introducen incluso más pares no colisionantes, pero esto se compensa con su tiempo de ejecución generalmente mejorado. Tienen características de rendimiento diferentes y ninguna supera a las demás en todas las situaciones.
Árbol AABB dinámico
Esto es implementado por btDbvtBroadphase en Bullet.
Como su nombre indica, este es un árbol dinámico AABB . Una característica útil de esta broadphase es que la estructura se adapta dinámicamente a las dimensiones del mundo y sus contenidos. Está muy bien optimizado y es una muy buena fase general de uso general. Maneja mundos dinámicos donde muchos objetos están en movimiento, y la adición y eliminación de objetos es más rápida que SAP.
Barrer y podar (SAP)
En Bullet, este es el rango de clases AxisSweep. Esta también es una buena fase general de propósito general, con la limitación de que requiere un tamaño mundial fijo, conocido de antemano. Esta fase ancha tiene el mejor rendimiento para mundos dinámicos típicos, donde la mayoría de los objetos tienen poco o ningún movimiento. Tanto btAxisSweep3 como bt32AxisSweep3 cuantifican los puntos de inicio y finalización para cada eje como enteros en lugar de números de coma flotante, para mejorar el rendimiento.
El siguiente enlace es una introducción general a broadphase y también una descripción del algoritmo Sweep and Prune (aunque lo llama "Ordenar y barrer"):
http://www.ziggyware.com/readarticle.php?article_id=128
Además, eche un vistazo a la página de Wikipedia:
http://en.wikipedia.org/wiki/Sweep_and_prune