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/M
y 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 * M
y 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 "