Resolución de colisiones de cuerpos rígidos en 2D
Definición del problema
- Desde Mario pisando una nube hasta dos autos chocando en un juego de carreras, manejar colisiones es una parte muy importante en la mayoría de los videojuegos.
- Esta serie de blog abordará las matemáticas y la física reales de la simulación física.
- Los videojuegos son una buena forma de dar contexto a estos conceptos y hacerlos menos abstractos.
Una palabra sobre las matemáticas
- En este artículo aparecen muchas matemáticas, pero se recomienda no tenerles miedo.
- La notación matemática puede parecer compleja, pero en su mayor parte es aritmética simple.
- Se recomienda no temerle a las matemáticas y animarse a intentarlo.
Antes de empezar
Cuerpo rígido
- La física de cuerpos rígidos es una simulación física que trata con objetos que no se deforman.
- En la realidad, todos los objetos se deforman a nivel molecular, pero en una simulación esto se simplifica tratándolos como cuerpos rígidos.
Detección de colisiones y resolución de colisiones
- La detección de colisiones es el proceso de comprobar qué objetos están chocando en una escena.
- La resolución de colisiones es el proceso de decidir cómo deben moverse los objetos que han colisionado.
- En esta serie de blog nos enfocaremos en la etapa de resolución de colisiones.
¿Qué vamos a hacer?
- La mayoría de los juegos se ejecutan dentro de un gran bucle.
- En cada iteración del bucle del juego, la posición de los objetos se actualiza según su velocidad actual.
- La velocidad es un vector con magnitud y dirección.
Velocidad
- La velocidad representa el cambio de posición de un objeto durante un cierto tiempo.
- La nueva posición de un objeto se calcula sumando el desplazamiento, que resulta de multiplicar la velocidad actual por el intervalo de tiempo.
Resolución de colisiones
- El objetivo de la resolución de colisiones es cambiar la velocidad de los objetos después del choque para que ya no se atraviesen entre sí.
- La velocidad después de una colisión se expresa como la suma de la velocidad antes de la colisión y el cambio de velocidad causado por la colisión.
¿Qué es una colisión?
- Para comprobar si dos objetos están colisionando, deben cumplirse dos condiciones:
- La forma geométrica de los objetos debe estar en contacto o superponerse.
- Los objetos deben seguir moviéndose uno hacia el otro.
Normal de la superficie
- Para mover un objeto lo más lejos posible de una superficie, hay que moverlo en una dirección perpendicular a esa superficie.
- A esta dirección se le llama dirección normal, y es perpendicular a la superficie.
Producto punto
- Para calcular en qué medida dos vectores apuntan en la misma dirección, se usa el producto punto.
- El producto punto se define como la suma de los productos de los elementos correspondientes de dos vectores.
- A través del signo del producto punto se puede saber si dos vectores apuntan en la misma dirección o en direcciones opuestas.
Conclusión
- Una colisión ocurre cuando un punto de un objeto entra en contacto con un punto de otro objeto y la velocidad normal relativa es negativa.
- En el siguiente artículo se abordará la física real de las colisiones.
La opinión de GN⁺
- La importancia de la simulación física: en el desarrollo de videojuegos, la simulación física es un elemento importante para aumentar el realismo.
- El papel de las matemáticas: las matemáticas son el núcleo de la simulación física, y entenderlas permite crear mejores simulaciones.
- La complejidad de la resolución de colisiones: resolver colisiones es un proceso más complejo que simplemente actualizar la posición de los objetos.
- Valor educativo: este artículo ayuda mucho a comprender los fundamentos de la simulación física.
- Aprendizaje adicional: implementar directamente un motor físico también es una buena forma de aprender. Se pueden tomar como referencia motores físicos de código abierto como Box2D o Chipmunk.
1 comentarios
Opiniones de Hacker News
Resumen de comentarios de Hacker News
Hey everyone, author here!
Oh! Look, a well-researched, deeply-explained, and interactive post.
One side project I am working on right now is a 2d space shooter I am developing with my son.
I always enjoyed the explanation from the N game: N game tutorial
I had fun building a TypeScript demo about this topic, involving balls that can bounce and collide. I learned a lot.
This is great. This reminds me of Chris Hecker's Rigid Body Dynamics series from GDMag/Gamasutra that I read (checks watch) almost 30 years ago!
Collisions are violations of the pairwise non-intersection constraint between bodies.
If you want to go further and go for rigid body dynamics and constraint, I found that series of blog post very useful: Toptal blog post
To dredge up a related oldie-but-goodie memory of blog posts: Gaffer on Games
Guess this is a Shameless plug but I wrote an interesting program over 12 years ago using even then very old three Js which is not quite the metal but much less abstract than today's tools.