Soy muy consciente de cómo detectar si dos o más objetos 2D chocan, pero estoy interesado en cómo decidir si se verifica una colisión. En proyectos anteriores, solo tenía que comprobar cada objeto contra cualquier otro objeto (lo sé, O (n ^ 2) nivel de estupidez) y creó un juego menos fluido.
Varios foros aclaman la grandeza de Quadtrees, B-Trees y cualquier otro tipo de árbol o estructura que se te ocurra.
¿Cuál es la estructura más eficiente para determinar si se debe verificar una colisión?
2d
collision-detection
data-structure
Mike Cluck
fuente
fuente
Respuestas:
Para un juego 2D, a menos que los objetos 2D tengan una distribución muy pesada a un lado de su mapa, una cuadrícula uniforme es casi siempre el camino a seguir. La complejidad de la memoria es sencilla (proporcional a las dimensiones de su mapa), y con una distribución razonable, tiene O (1) tiempo de búsqueda y un promedio de log (numberOfObjects / (filas * columnas)) ^ 2 pruebas de intersección hecho por celda. Puede decidir verificar solo las celdas que han tenido un objeto moviéndose en ellas, lo que hace que la geometría estática sea mucho más eficiente. Es fácil modificar una cuadrícula uniforme sobre la marcha (mucho menos doloroso que en soluciones basadas en árboles), y es más sencillo de implementar. El único momento en que diría que no lo use en un juego 2D es cuando los requisitos de memoria de una cuadrícula uniforme se vuelven demasiado grandes (digamos un simulador espacial donde los niveles son escasos pero enormes).
fuente
Los motores de física 2D, como Box2D y Chipmunk, hacen un uso intensivo de un mapa espacial de hash
ver http://chipmunk-physics.net/release/ChipmunkLatest-Docs/#CollisionDetection para referencia. Las demostraciones de ardilla listada incluyen un visualizador de hash espacial realmente bueno que deja muy claro cómo funciona su técnica.
fuente
Si su mundo tiene una dimensión muy "larga" (llámela X), en comparación con otras, puede mantener los objetos en una lista ordenada que puede reordenar a medida que se mueven, y luego la detección de colisión significa solo verificar los objetos que solapamiento en el eje X.
Otra posibilidad es mantener listas activas / pasivas de objetos, y no molestarse con los objetos pasivos (que no se mueven en absoluto).
Si todos son objetos de tamaño mediano que son visibles para el jugador en la pantalla, todo vs todo probablemente no sea tan malo.
Aparte de eso, estoy con Darcy, una cuadrícula uniforme es buena.
fuente