Suponha que eu use um sistema simples de detecção de colisão discreta, onde movo todos os objetos e depois procuro por colisões. Eu quero que todos os objetos em colisão sejam separados (é claro) e tenham velocidades de resposta apropriadas (salto, deslize, parada, etc.).
Quando tenho um par de objetos colidindo, como os separo sem terminar com um ou ambos colidindo com outros objetos?
A única maneira de impedir que isso aconteça é impedir a penetração em primeiro lugar. Antes de mover um objeto, verifique se é um movimento legal. Observe que isso significa que você deve mover seus objetos um de cada vez para evitar que dois objetos se movam um contra o outro.
Se não ocorrer penetração, você não precisará redefinir nenhuma posição e, portanto, não ativará nenhuma penetração secundária.
fonte
O que eu costumo fazer é o seguinte:
Quando você separa objetos e acaba com mais colisões, basta iterar novamente, até que uma quantidade máxima de etapas seja alcançada ou os objetos penetrem menos que um limite predefinido.
fonte