¿Cuál es la mejor manera de manejar colisiones simultáneas en un motor de física?

13

Estoy escribiendo un motor de física 2D en JavaScript para poder aprender más sobre física en los videojuegos. Lo tengo funcionando correctamente para colisiones de cuerpos rígidos, excepto si algún cuerpo choca con otros dos o más cuerpos al mismo tiempo.

Actualmente, para cada par de cuerpos en colisión (A, B) modifico sus velocidades y velocidades angulares en función del impulso de colisión, y los empujo unos de otros para que no penetren. Pero entonces la detección de colisiones y los cálculos de impulsos para otras colisiones que involucren a A serán incorrectos.

¿Qué enfoques puedo explorar para que mi motor funcione para más de 3 objetos que chocan entre sí?

Leva
fuente
2
Relacionado: gamedev.stackexchange.com/questions/15836/… y gamedev.stackexchange.com/questions/26181/… y estoy seguro de que hay más, simplemente no puedo encontrar el ahora.
MichaelHouse

Respuestas:

11

Utilizo el siguiente enfoque (similar al algoritmo de división en masa de Tonge http://www.richardtonge.com/ ):

  • Detecta todos los pares de colisión en tu escena / contexto. Deje (A, B) ser tal par. Aplique una idea de división fantasma / masa: si A está en contacto con M cuerpos y B está en contacto con N otros cuerpos, entonces establezca temporalmente la masa de A m_A/My la de B enm_B/N
  • calcule las contribuciones de la fuerza de reacción / restitución para cada par (A, B) y almacene estas contribuciones en los propios acumuladores de A y B
  • calcule las velocidades de restitución de los impulsos (como usted indicó) y almacénelas de la misma manera (como residuos de velocidad deltaV en sus propios acumuladores para cada par (A, B))
  • calcule los desplazamientos de penalización (de nuevo, acumule desplazamientos, ¡no los aplique al instante!)
    • restablecer las masas de todos los cuerpos previamente designados como partes en pares de colisión ( m_A = m_A * My m_B = m_B * N)

Este enfoque es similar a cómo funciona el algoritmo iterativo de Jacobi con sistemas lineales simultáneos de ecuaciones. Y no se garantiza que converja, pero en mi simulador hace el trabajo sin problemas ... en 3D (sí, ¡una dimensión adicional agrega el doble de dificultad!).

Advertencia : ¡posiciones y velocidades correctas solo después de que termine su fase de detección / manejo de colisiones! De esa manera, actualizas simultáneamente a tus actores en conflicto. Además, las fuerzas de restitución deben tenerse en cuenta la próxima vez cuando se integra para posiciones y velocidades.

EDITAR: Bueno, supongo que está utilizando el método de integración Verlet ya abusado (este se ha convertido en un nombre familiar entre los entusiastas de gamedev). En este espectro de manejo e integración de colisiones, es posible que desee echar un vistazo aquí .

ACTUALIZACIÓN: Parte de la información sobre cómo abordar la colisión (y la auto colisión de hecho) se puede encontrar en estos documentos:

El enfoque que propuse no es de lejos una contribución original, muchos juegos lo usan con resultados plausibles y Jakobsen lo empleó mejor en su motor de juego Hitman.

Desde una experiencia algo práctica, las fuerzas de penalización (similares a los resortes lineales o exponenciales que obtienen su entrada de la distancia de penetración) no resuelven adecuadamente las penetraciones cuando otras fuerzas de los cuerpos que chocan logran ser mayores que ellas. Es por eso que elegí combinar tres enfoques (casi redundantes): fuerzas de reacción newtonianas (empujas la pared, la pared empuja hacia atrás), velocidades derivadas del impulso (bolas de billar que chocan) y un "movimiento natural" que separa los cuerpos unos de otros geométricamente "solución. Juntos parecen proporcionar todo: deshacerse de la mayoríaartefactos de interpenetración feos, los cuerpos en colisión tienden a interactuar entre sí a largo plazo (debido a las velocidades y fuerzas de restitución, al menos las fuerzas que tendieron a arrastrar los cuerpos en un escenario de colisión se cancelan y los cuerpos rebotan entre sí) . Por último, para una mejor comprensión de estos conceptos simples pero comunes, sugiero analizar estas diapositivas .

Mi epíteto del "método abusado" que describe los pasos de integración de Verlet está dirigido a la creencia de la cultura popular de que este es el Santo Grial de los métodos de integración. Es marginalmente mejor que su primo Symplectic Euler (también llamado por algunos Euler semi-implícitos). Existen métodos de integración mucho más complicados (y todos llevan el nombre implícito en ellos). Los potentes motores de juegos los utilizan, pero los desarrolladores independientes no tienen tiempo para experimentar con ellos, ya que Verlet, cuando se ajusta a un escenario específico, realmente hace maravillas. Además, no hay absolutamente ningún método de integración que pueda lidiar con restricciones rígidas sin que haya un poco de trampa (no se puede encontrar el enlace, pero el documento al que me refiero debería llamarse "X.Provot -" Restricciones de deformación en una misa) de muelles para describir el comportamiento de tela rígida "

teodron
fuente
Gracias (+1)! ¿Qué son la 'velocidad de restitución' y los 'desplazamientos de penalización'? Además, ¿por qué dice que se 'abusa' de la integración verlet? ¿Crees que es un mal método para usar?
Cam
Las velocidades de restitución son exactamente aquellas velocidades que obtienes de los impulsos, la única diferencia es que las calculo como residuos (es decir, almaceno la diferencia entre esa velocidad basada en impulsos y la velocidad actual mientras mantengo la velocidad actual intacta para otros cálculos). Los desplazamientos de penalización son vectores con una longitud determinada por cuánto se interpenetran dos objetos y es el vector de longitud mínima que puede traducir un objeto completamente fuera del otro. Por lo general, agrego tal desplazamiento a cada objeto dividiendo la longitud por 2).
teodron
1
Brillante respuesta! Sin embargo, tengo otra pregunta. Digamos que acumulo las velocidades de restitución, ¿no sumarán un número muy poco realista? Si trato cada colisión con el objeto A por separado y solo sumo los efectos en cada objeto, ¿no se propagará A su impulso entre los objetos? En su lugar, se aplicará un impulso total a cada uno, lo que me parece erróneamente intuitivo
Cam
Esa es una muy buena pregunta ... desde un punto de vista, parece plausible que los impulsos contribuyan aditivamente a la velocidad resultante. Aquí está mi razonamiento (¡quizás defectuoso!): Imagine tres bolas de billar / snooker colisionando. Uno de ellos debería recibir contribuciones de los otros dos de manera aditiva. Inicialmente, pensé en sopesar estas contribuciones y calcular un promedio ponderado para la velocidad final, pero como quería resultados rápidos, me salteé esta idea. Con todo, la bola que colisiona debe obtener contribuciones de velocidad de los dos restantes. Quizás un libro de texto de secundaria puede ayudar.
teodron
3
Tal vez no entiendo lo que ha explicado, porque el siguiente ejemplo todavía me preocupa: considere un rectángulo horizontalmente largo que cae directamente hacia abajo, y suponga que el piso es irregular (compuesto de múltiples triángulos uno al lado del otro). Si hay n triángulos, usando su método acumulativo, el rectángulo rebotará en n veces la velocidad que debería. ¿Cómo se puede arreglar esa situación?
Cam
1

Sugiero que, en lugar de cambiar las velocidades, cambie las fuerzas que actúan sobre un objeto. No los "empuje", más bien, hágalo sin problemas y utilizando código ya existente. Al hacer esto, los cuerpos no cambiarán de inmediato (y rápidamente, supongo) sus velocidades.

Consulte Box2DJS para ver un ejemplo: http://box2d-js.sourceforge.net/index2.html .

jcora
fuente
-1

He resuelto analíticamente la ecuación de impulso para grupos de cuerpos en colisión. El único problema que enfrenté fue la falta de variables para encontrar la fuerza de interacción relativa entre los contactos en un grupo, que he llenado con la intersección de la profundidad de los cuerpos.

La solución para contactos grupales no es mucho más difícil que un solo contacto. Desafortunadamente, perdí un documento con cálculos, por lo que no puedo compartirlo aquí.

Editar: Probablemente se me ocurrió algo como esto /physics/296767/multiple-colliding-balls

George Vinokhodov
fuente