Algoritmos de detección de colisiones
Detección de colisiones
- En la programación de videojuegos, la detección de colisiones es un problema muy común
- Es esencial para evitar que los personajes se atraviesen entre sí o para implementar un motor de física
Enfoque simple 🐥
Problemas de rendimiento
- A medida que aumenta la cantidad de objetos, aparecen problemas de rendimiento
- Por ejemplo, cuando n = 20, hay que revisar 190 pares
Mejorando la solución
Optimización mediante ordenamiento
- Si se ordenan los objetos según la coordenada x, se pueden reducir las revisiones innecesarias
- Ejemplo de código:
sortByLeft(balls);
for (let i = 0; i < balls.length; i++) {
const ball1 = balls[i];
for (let j = i + 1; j < balls.length; j++) {
const ball2 = balls[j];
if (ball2.left > ball1.right) break;
if (intersects(ball1, ball2)) {
bounce(ball1, ball2);
}
}
}
Análisis de rendimiento
- Ordenamiento: O(n log n)
- Bucle interno: en promedio O(n + m) (m es la cantidad total de superposiciones en el eje x)
- Complejidad temporal final: O(n log n + m)
Comparación visual
- Comparación entre revisar todos los pares globalmente y revisar pares ordenados
- La revisión de pares ordenados realiza muchas menos comprobaciones
Resumen de GN⁺
- Este artículo trata sobre cómo optimizar algoritmos de detección de colisiones en desarrollo de juegos
- Comienza con un algoritmo simple de O(n^2) y mejora mucho el rendimiento mediante ordenamiento
- Es información muy útil para desarrolladores de juegos o ingenieros de software
- Otros proyectos con funciones similares incluyen Box2D y Bullet Physics
1 comentarios
Comentarios en Hacker News
El autor sugiere usar algoritmos de ordenamiento "rápidos" como mergesort o quicksort para lograr un rendimiento óptimo
Hicieron un trabajo similar en el pasado, pero en vez de ordenar mantuvieron una lista de índices para cada dirección
objectIndicesSortedByLeftEdge/RightEdge/TopEdge/BottomEdgeEste artículo está realmente muy bien organizado
Siempre he disfrutado leer documentación sobre detección continua de colisiones
Me gustó el uso de ilustraciones
Parte 2: https://leanrada.com/notes/sweep-and-prune-2/
Cuestionaron la afirmación de que "este algoritmo simple se ejecuta en tiempo O(n^2) en términos de Big O"
Se preguntaban si este método es similar a usar un quadtree para reducir los posibles colisionadores
Se preguntaban si alguna vez se ha propuesto un método de programación lineal
Este sitio web me distrajo, en el buen sentido