Bounding Spheres probablemente lo ayude con muchos objetos en movimiento; calcula el radio al cuadrado del objeto y lo rastrea desde su centro. Si la distancia cuadrada entre los centros de dos objetos es menor que la suma de los radios cuadrados de los dos objetos, entonces tiene una colisión potencial. Todo hecho con distancias cuadradas; sin raíces cuadradas
Puede ordenar los vecinos más cercanos por la distancia mínima al cuadrado entre sus objetos. La detección de colisiones puede ser compleja, por supuesto, y con objetos de forma no esférica, Bounding Spheres no necesariamente obtendrá información de colisión, pero puede podar bastante el árbol de objetos que necesita para la colisión.
Necesitará, por supuesto, rastrear el CENTRO de su objeto; e idealmente, le gustaría que cada objeto sea rígido, para evitar tener que recalcular los tamaños de las esferas delimitadoras (aunque el recálculo no es particularmente difícil, particularmente si utiliza un árbol de objetos rígidos cada uno con su propia esfera delimitadora para los objetos que no son rígidos, pero se complican).
Básicamente, para responder a su pregunta sobre estructuras de datos, puede mantener todos sus objetos en una matriz maestra; Tendría un conjunto de matrices de "región" que consisten en referencias a los objetos en la matriz maestra en la que puede clasificar los objetos rápidamente en función de sus coordenadas cartesianas; las matrices de "región" deben tener una superposición definida de al menos 2 veces el radio de objeto más grande en su matriz de objetos maestra (si es factible, aparece una pregunta de escala de esfera que limita el número de objetos)
Una vez tienes eso, puedes hacer una prueba de colisión rápida comparando las distancias de todos los objetos dentro de una región entre sí, de nuevo, aquí es donde la definición de la región se vuelve importante, porque estás haciendo un intercambio significativo de número de regiones para numerar Sin embargo, es un poco más simple simplemente porque sus comparaciones de distancia se reducen a simples restas (y operaciones abs(), por supuesto).
Por supuesto, entonces usted tiene que hacer la detección de colisión real entre su no esférica objetos, y que pueden ser no t rivial, pero ha reducido el número de posibles comparaciones de manera muy dramática en ese momento.
Básicamente, es un sistema de dos niveles; la primera es la matriz de región, mediante la cual haces un tipo aproximado en tu escena. En segundo lugar, tiene su comparación de distancia intra-región; en donde vas a hacer tu detección de colisión básica y marcar colisión en los objetos que han colisionado.
Probablemente hay espacio en este tipo de algoritmo para el uso de árboles en la determinación de regiones dinámicas para igualar los tamaños de su región para asegurar que el tamaño de su región no crezca demasiado rápido en regiones "atestadas"; ese tipo de cosas, sin embargo, no es trivial, porque con objetos de diferentes tamaños, su tipo de densidad se vuelve ... complejo, por decir lo menos.
Entiendo que el uso de esferas hará que las pruebas de colisión sean un poco más rápidas, y que el uso de regiones particione el espacio y limite la cantidad de comparaciones, ¿pero tienes que recalcular estas "regiones" y esto es lento? Estoy buscando una estructura de datos que pueda actualizar sus "regiones" de manera rápida. – esiegel