En mi motor de física 2D, puedo detectar colisiones AABB vs AABB, y resolverlas al encontrar el vector de penetración más corto y agregarlo a la posición de AABB.
Hacer esto "empuja" al primer AABB fuera del segundo AABB, pero no trata en absoluto los cambios de velocidad / aceleración.
Si agrego aceleración por gravedad a mi simulación, la velocidad del primer AABB dinámico sigue creciendo incluso cuando descansa sobre el segundo AABB estático. Finalmente, la velocidad será demasiado grande y no se detectará la colisión (el AABB dinámico caerá a través del estático).
Intenté establecer la velocidad a cero después de la resolución, pero obviamente no funcionó bien, y creé simulaciones poco realistas.
Leí en línea que resolver colisiones trabajando manualmente en la posición o la velocidad no es correcta. Intenté implementar fuerzas (la masa es un "codificado" 1 por ahora):
void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; }
void Body::integrate(float mFrameTime)
{
velocity += acceleration * mFrameTime;
position += velocity * mFrameTime;
acceleration = {0, 0};
}
Si aplico el vector de penetración más corto como fuerza durante la resolución de colisión, el AABB dinámico será "expulsado" del estático, pero su velocidad nunca disminuirá en una simulación sin gravedad y seguirá moviéndose para siempre.
¿Hay alguna forma de aplicar una fuerza "temporal"? ¿Una fuerza que trata de empujar al primer AABB fuera del segundo AABB, y luego se detiene cuando el AABB ya no choca?
Todo el código fuente disponible aquí: https://github.com/SuperV1234/SSVSCollision