Así es como puedes hacerlo:
Movimiento aproximado
Todo objeto de física necesita estos vectores:
- Posición : donde está el objeto.
- Velocidad : cómo está cambiando su posición.
- Aceleración : cómo está cambiando su velocidad.
Entonces, intuitivamente, debes hacer este tipo de cosas en cada cuadro a cada objeto de física a
:
a.speed += a.acceleration
a.position += a.speed
Errores : esto se conoce como el método de integración de Euler . Esta aproximación es mejor para pequeñas velocidades y aceleraciones y con pequeños pasos de tiempo. En un juego, esto es normalmente cierto. Pero si un objeto se mueve muy rápido hacia una pared delgada o directamente hacia otro objeto en movimiento, puede saltarse la colisión con ese objeto cuando su posición se incrementa en una cantidad lo suficientemente grande como para cruzarlo por completo. Si tiene objetos que se mueven rápidamente, es posible que necesite Detección de colisión continua para salirse con la suya.
Colisión
La colisión se puede aproximar con este tipo de secuencia:
- Detección : se detecta que dos cuerpos se cruzan.
- Resolución : la posición de cada cuerpo cambia para que ya no se crucen.
- Física : la velocidad de cada cuerpo se cambia para tener en cuenta el impulso, la fricción y la restitución (rebote).
Esto se conoce como Detección de colisión discreta, ya que ocurre en puntos discretos en el tiempo. Cada paso merece atención:
Paso 1: detección de colisión (¿Están colisionando las cosas?)
Para dos círculos : solo verifique si sus centros están separados más que la suma de sus radios.
Para dos rectángulos : Verifique si alguna de sus coordenadas de esquina está dentro del otro rectángulo.
Para cualquier cosa que involucre polígonos más complejos , necesitará el Teorema del eje de separación , que es un tema para otra pregunta.
Errores : realmente hay muchos otros tipos de colisión que puede considerar. Algunos son realmente complejos: ¡los polígonos convexos pueden cruzarse varias veces !
Paso 2: resolución de colisión (separándolos)
Un método simple para resolver una colisión es la traducción por mínima penetración , utilizando valores obtenidos de la detección de colisión. Esto implica esencialmente separar los objetos con la mínima distancia de movimiento posible.
Como ejemplo, considere la colisión círculo-círculo donde uno de los círculos está fijo en su lugar. El vector de desplazamiento mínimo tiene la misma dirección que la diferencia entre sus vectores de punto medio. Su longitud es la diferencia entre la suma de sus radios y la distancia entre los centros.
Esta idea se generaliza fácilmente a otras formas.
Errores : si ambos objetos en colisión son móviles, es posible que tenga que moverlos una fracción de la distancia total para obtener una aproximación creíble de su movimiento. Obviamente tendrán que moverse en diferentes direcciones.
Paso 3: física de colisión (otros cambios)
Lo más obvio que suele suceder es que uno o dos de los objetos cambian de dirección, es decir, gira su vector de velocidad. Esto es bastante fácil de implementar.
Errores : los objetos pueden ser elásticos , pero pueden no serlo , en cuyo caso se reduce la energía total en el sistema. Es posible que necesite resistencia debido a la resistencia del aire. La fricción (particularmente la fricción estática ) es notoriamente compleja de implementar .
Algunas conclusiones
La simulación de la realidad es exponencialmente más difícil cuanto más quieras simular. Estás entrando en un campo minado de innumerables casos extremos, fórmulas increíblemente difíciles y montones cada vez mayores de trabajos de investigación.
Si sus necesidades son simples o está ansioso por aprender, pruébelo.
Si sus necesidades son complejas o no le gustan las matemáticas, obtenga un motor de física para pasar por alto los detalles por usted. Box2D y Bullet son bastante populares en los juegos.