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í?
Respuestas:
Utilizo el siguiente enfoque (similar al algoritmo de división en masa de Tonge http://www.richardtonge.com/ ):
m_A/M
y la de B enm_B/N
m_A = m_A * M
ym_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:
Un documento algo simple sobre la resolución de colisiones de cuerpos rígidos a través de métodos basados en impulsos: http://web.archive.org/web/20060925200136/http://i31www.ira.uka.de/docs/PaperFinal.pdf
Varillas elásticas inextensibles con fricción torsional basadas en multiplicador de Lagrange
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 "
fuente
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 .
fuente
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
fuente