¿Cómo obtener la nueva dirección de colisión de 2 discos?

Estoy desarrollando un juego 2D que incluye colisiones entre muchos discos. Me gustaria saber como puedo obtener el angulo correspondiente a la nueva direccion de cada disco. Para cada disco tengo esta información: dirección (entero), velocidad (flotante) y posición ( X ; y , que son ambos números enteros).

Por supuesto, sé que la nueva dirección será la opuesta a donde ocurre la colisión (el disco golpeado en la parte inferior izquierda irá a la parte superior derecha), pero no sé cómo calcular exactamente el nuevo ángulo.

¿La dirección y la posición son números enteros? ¿Significa esto que los círculos solo existen en puntos discretos de la cuadrícula? ¿También es de suponer que estos son círculos de igual masa con colisiones elásticas (sin adherencia / pérdida de energía)?
Bueno, para ser más precisos, se trata de desarrollar una simulación de rizado. Entonces, la posición de los discos (círculos) está representada por su punto central, ambos números enteros corresponden a unidades de píxeles. La dirección es un ángulo entero, decidí elegir 0° como el eje perfectamente vertical hacia abajo. Por el momento solo son de igual masa, pero considero agregar discos con diferentes pesos más adelante.
Definitivamente desea almacenar la posición como flotantes en lugar de enteros y luego redondearlo a enteros justo antes de renderizarlo. Si no hace esto, verá algunos artefactos extraños cuando la velocidad esté cerca de un píxel por cuadro, y si es menos de un píxel por cuadro, el objeto dejará de moverse repentinamente, porque la velocidad se redondeará a cero. cada fotograma. Tampoco hay razón para no hacer que la dirección también sea flotante.

Respuestas (1)

En el caso ideal donde la colisión es instantánea y solo hay un único punto de contacto, las fuerzas experimentadas por cada objeto solo pueden ser a lo largo de la línea que conecta los centros y pasa por el punto de contacto. En realidad, la "fuerza" será infinita, pero impartirá un impulso finito (es decir, un cambio en la cantidad de movimiento) durante el intervalo de tiempo infinitesimal durante el cual ocurre la colisión. No puede haber componente de impulso ortogonal a esto, porque eso equivaldría a una "fuerza" tangencial al círculo. Con cualquier coeficiente de fricción finito, no puede afectar un círculo empujando la tangente a él en solo un punto.

Esta restricción, junto con la conservación de la cantidad de movimiento en dos direcciones y la conservación de la energía, es suficiente para determinar el movimiento de ambos círculos dadas las condiciones iniciales (que necesitan 4 escalares para definirse por completo).

Si el círculo objetivo está inmóvil antes de la colisión, su dirección de movimiento posterior es bastante fácil de encontrar: está exactamente a lo largo de la línea que conecta los centros de los dos círculos en el momento del contacto. (Asegúrese de seguir el camino correcto a lo largo de esta línea; solo una de las direcciones es sensata). a él en la colisión. Si quiere números, diga que el círculo en movimiento hace contacto cuando su centro está en ( X 1 , y 1 ) , y el otro centro está en ( X 2 , y 2 ) . Entonces el ángulo en el que 2 se aleja de la colisión es

θ = 180 π broncearse 1 ( y 2 y 1 X 2 X 1 ) .
Por cierto, podría ser más fácil simplemente usar X y y componentes de la velocidad, en lugar de velocidades y ángulos.

Por supuesto, si desea llevar esto al siguiente nivel de realismo, es posible que deba tener en cuenta los siguientes efectos:

  • La energía cinética se pierde (quizás en un cierto porcentaje) con cada colisión.
  • La colisión podría resultar en torques, transfiriendo momento angular.
  • Los objetos giratorios pueden curvarse mientras se deslizan. Sin embargo, este es un efecto complicado y probablemente tengas que modelarlo con un coeficiente de fricción cinético que varía con la velocidad.

Finalmente, para la precisión numérica, sugiero mantener todos los números como flotantes en los cálculos y solo redondear a los enteros más cercanos al renderizar.

Muchas gracias por esta respuesta tan completa. Voy a trabajar mucho en esto para hacer las cosas bien. Con respecto a mi precisión numérica, olvidé mencionarlo pero, por supuesto, ya estaba calculando mis números como flotantes y redondeándolos al final. ¡Gracias de nuevo!
¿Qué pasa si ambos círculos se están moviendo?
@tekknolagi En ese caso, sugiero transformarse en un marco de modo que uno esté sentado quieto, haciendo el cálculo y luego transformándose de nuevo. La primera transformación resta una de las velocidades de los objetos (vectorialmente) de ambos, mientras que la segunda transformación simplemente suma esta misma cantidad a ambas velocidades resultantes.