Resposta de colisão de jogo em 2D: SAT e deslocamento mínimo ao longo de um determinado eixo?


13

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:

Exemplo

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

Resposta estilo SAT

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:

Resposta realista

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!)


É contra as regras. Não faça cruzamento.
AttackingHobo

Sim, exclua-o do StackOverflow e mantenha-o aqui: P
TravisG


Excluído do SO.
Archagon

Comece uma recompensa, archagon: P Caso contrário, talvez eu precise. Essa pergunta é realmente interessante e seria incrível ver uma resposta que faz mais do que apenas listar algumas referências.
TravisG 6/09/11

Respostas:


11

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. 1 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. 2 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. 3 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.) 4 Etapa 4: Pegue o vetor mais curto. Esta é a distância exata da colisão. 5 Etapa 5: Voila! 6


2
Isso é impressionante. Por acaso, você comparou a velocidade do seu algoritmo à simples amostragem múltipla (4x ou 8x)?
TravisG

Infelizmente não.
Archagon

Impressionante, e tenho certeza de que a matemática também não é muito complicada / intensiva. +1
you786

7

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 :))

SEÇÃO 5: Objetos em movimento rápido

Como mencionado acima, objetos pequenos e / ou em movimento rápido podem produzir problemas ao usar um teste de colisão estática. Existem várias abordagens que podem ser adotadas para lidar com esses objetos - a mais simples é restringir o design do jogo para que esses objetos não sejam necessários.

Se você precisar absolutamente deles, existem dois métodos comuns para lidar com objetos pequenos e / ou em movimento rápido: testes de colisão de varredura e multisampling.

- = testes de varredura = -

Em vez de testar a interseção entre duas formas estáticas, podemos criar novas formas varrendo as formas originais ao longo de sua trajetória e testando a sobreposição entre essas formas varridas.

A idéia básica é descrita em [Gomez], para testes de varredura círculo a círculo e AABB-AABB.

- = multisampling = -

Uma alternativa muito mais simples aos testes varridos é a amostragem múltipla; em vez de executar um único teste estático na nova posição do objeto, execute vários testes em várias posições localizadas entre a posição anterior e a nova do objeto. Esta técnica foi usada para colidir a boneca de pano em N.

Se você garantir que as amostras estejam sempre espaçadas a distâncias inferiores ao raio do objeto, isso produzirá excelentes resultados. Em nossa implementação, limitamos o número máximo de amostras, portanto, velocidades muito altas às vezes resultam em problemas; isso é algo que pode ser ajustado com base em seu aplicativo específico.

EDITAR

Em resumo e no AFAIK, existem algumas soluções

  1. Limite seu jogo para nunca ter um objeto em movimento pequeno e / ou rápido que possa causar isso
  2. Implemente um sistema que impeça a ocorrência de colisões, conforme descrito no primeiro link que publiquei
  3. Aumente sua taxa de amostragem para objetos em movimento rápidos e / ou pequenos
  4. ... possivelmente mais, mas não sou especialista.

1

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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.