Estoy confundido. Bueno, no confundido, tanto como no querer hacer 6 programas de prueba para ver qué algoritmo es el mejor. Así que pensé en pedirle a mis amigos expertos aquí en SO que me dieran el beneficio de su experiencia.Mejor algoritmo para detección de colisiones eficiente entre objetos
El escenario es una escena en 3D con un área potencialmente bastante grande en comparación con los tamaños de los objetos que contiene. Hay potencialmente miles de objetos en la escena. Los objetos varían en tamaño desde décimas de una unidad hasta alrededor de 10 unidades, pero no más grandes (o más pequeñas). Los objetos tienden a estar agrupados, pero esos clústeres pueden aparecer potencialmente en cualquier parte de la escena. Todos los objetos son dinámicos y móviles. Los clústeres tienden a moverse juntos, pero cuando lo hacen, sus velocidades pueden no ser las mismas todo el tiempo. También hay geometría estática a considerar. Aunque hay un gran número de objetos dinámicos, también hay algunos objetos estáticos en la escena (los objetos estáticos tienden a ser uno o dos órdenes de magnitud más grandes que los objetos dinámicos).
Ahora, lo que quiero es una estructura de datos espaciales para realizar eficientemente detección de colisión para todos los elementos en la escena. Sería fantástico si el algoritmo también admitiera la consulta de visibilidad para la canalización de renderizado. En aras de la simplicidad, suponga que la detección de colisión aquí es de fase amplia (es decir, que todos los objetos dinámicos son simplemente esferas perfectas).
Por lo tanto, en mi investigación que puedo utilizar uno de:
(1) octárbol (2) Loose octárbol (3) lineal octárbol (+ suelto) (4) KD árbol (5) BSP Árbol (6) Hashing
Hasta ahora (6) es el único que he probado. En realidad es totalmente excelente en términos de velocidad (8192 elementos de colisión registrados en menos de 1 ms en mi sistema) si los objetos en la escena están en promedio distribuidos de manera uniforme. No es un algoritmo tan bueno si todos los objetos se combinan en un área más pequeña, lo que supongo que es posible.
¿Alguien tiene alguna idea de cuál usar, o cualquier truco que pueda emplear para acelerar? Estoy pensando que pase lo que pase, puedo usar un árbol BSP separado para la geometría estática. Supongo que las "esferas" dinámicas son las que más me preocupan aquí. Nota: no CUDA, esto es solo CPU: p.
Gracias
EDIT: Ok, gracias a Floris, he encontrado más información acerca de la AABB árboles. Hay una vieja discusión sobre GameDev aquí: http://www.gamedev.net/topic/308665-aabb-tree---wheres-the-poly-o_o/. Parece un buen compromiso.
Final EDIT: Decidió no reinventar la rueda. Es posible que la biblioteca de física de bala haga todo esto por mí (tiene un árbol AABB, probablemente también muy bien optimizado).
Probablemente pueda omitir el árbol KD para escenas dinámicas. El trabajo del árbol de KD en conjuntos de datos estáticos, tendrías que reconstruir todo el (sub) árbol cada vez que se mueva un solo elemento – SingleNegationElimination
Sí, parecía que era demasiado intenso para usarlo en escenas dinámicas. – Robinson