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!)
Respostas:
Aqui está o método que encontrei. Pode ter falhas, mas ainda não encontrei nenhum problema na análise superficial. Também funciona para polígonos arbitrários com algumas pequenas modificações.
Nas ilustrações abaixo, o objeto azul está se movendo e o objeto vermelho está parado. 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!
fonte
Confira esta pergunta semelhante: Resolução de colisão
E também, em http://www.metanetsoftware.com/technique/tutorialA.html#section5 (para o qual você postou um link para :))
EDITAR
Em resumo e no AFAIK, existem algumas soluções
fonte
Depende se você deseja apenas movimento linear ou se também precisa lidar com o movimento angular.
Uma alternativa ao uso do SAT:
No caso de linear apenas, você pode transmitir raios contra a diferença de Minkowski dos dois polígonos a partir da origem na direção da velocidade linear delta dos objetos.
Se o raio atingir o MD, os dois objetos colidirão e o ponto de impacto indicará o tempo t em que eles colidiram.
Agora, se os objetos estão se movendo e girando , fica mais difícil, mas você ainda pode usar uma técnica semelhante. O avanço conservador permitirá que você lide com esse caso. Essa técnica é iterativa; cada iteração irá gerar um novo MD e aproximar você do momento da interseção.
Aqui está o rascunho original do documento sobre o avanço conservador:
http://www.continuousphysics.com/BulletContinuousCollisionDetection.pdf
Escrevi um artigo explicando a técnica com mais detalhes aqui:
http://www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/
Espero que estas ajudem!
fonte