No meu mecanismo de física 2D, posso detectar colisões AABB vs AABB e resolvê-las, encontrando o menor vetor de penetração e adicionando-o à posição da AABB.
Fazer isso "empurra" o primeiro AABB para fora do segundo AABB, mas não lida com as mudanças de velocidade / aceleração.
Se eu adicionar aceleração por gravidade à minha simulação, a velocidade do primeiro AABB dinâmico continua crescendo, mesmo quando está apoiada no segundo AABB estático. Eventualmente, a velocidade se tornará muito grande e a colisão não será detectada (o AABB dinâmico passará pelo estático).
Tentei ajustar a velocidade para zero após a resolução, mas obviamente não funcionou bem e criei simulações irrealistas.
Li online que a resolução de colisões trabalhando manualmente na posição ou a velocidade não está correta. Tentei implementar forças (massa é um "codificado" 1 por enquanto):
void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; }
void Body::integrate(float mFrameTime)
{
velocity += acceleration * mFrameTime;
position += velocity * mFrameTime;
acceleration = {0, 0};
}
Se eu aplicar o menor vetor de penetração como força durante a resolução de colisão, o AABB dinâmico será "empurrado" para fora do estático, mas sua velocidade nunca diminuirá em uma simulação sem gravidade e continuará se movendo para sempre.
Existe uma maneira de aplicar uma força "temporária"? Uma força que lida com empurrar o primeiro AABB para fora do segundo AABB e depois para quando o AABB não colide mais?
Código fonte completo disponível aqui: https://github.com/SuperV1234/SSVSCollision