Estou tentando implementar um sistema de colisão em um jogo 2D que estou criando. O teorema do eixo de separação (conforme descrito no tutorial de colisão da metanet ) parece ser uma maneira eficiente e robusta de lidar com a detecção de colisões, mas não gosto muito do método de resposta a colisões que eles usam. Ao deslocar-se cegamente ao longo do eixo de menor sobreposição, o algoritmo simplesmente ignora a posição anterior do objeto em movimento, o que significa que ele não colide tanto com o objeto estacionário quanto entra nele e depois salta.
Aqui está um exemplo de uma situação em que isso seria importante:

De acordo com o método SAT descrito acima, o retângulo simplesmente sairia do triângulo perpendicular à sua hipotenusa:

No entanto, realisticamente, o retângulo deve parar no canto inferior direito do triângulo, pois esse seria o ponto da primeira colisão se estivesse se movendo continuamente ao longo do seu vetor de deslocamento:

Agora, isso pode não ser realmente importante durante o jogo, mas eu adoraria saber se existe uma maneira de obter, de maneira eficiente e geral, deslocamentos precisos dessa maneira. Tenho estourado meu cérebro nos últimos dias e não quero desistir ainda!
(Publicada na StackOverflow, espero que isso não seja contra as regras!)
Etapa 1: para cada polígono, encontre os dois pontos mais distantes ao longo da projeção desse polígono na linha perpendicular ao vetor de movimento.
Etapa 2: divida cada polígono ao longo da linha que liga esses pontos. A metade do polígono voltado para o outro polígono ao longo do vetor de movimento é o "casco para a frente". Essa é a única parte do polígono que pode colidir.
Etapa 3:Projete um vetor de cada ponto no "casco dianteiro" de cada polígono ao longo do vetor de movimento em direção ao polígono oposto e verifique se há interseção com cada aresta do "casco dianteiro" do polígono oposto. (Possivelmente lento, mas os computadores são bem rápidos hoje em dia - certo?) (Desculpe a seta inclinada. Todas as setas devem ser paralelas.)
Etapa 4: Pegue o vetor mais curto. Esta é a distância exata da colisão.
Etapa 5: Voila!
