Algoritmos de detecção de colisão em fase estreita

10

Existem três fases de detecção de colisão.

  1. Broadphase : É laços entre todos objecs que podem interagir, falsos positivos são permitidos, se ele iria acelerar o loop.

  2. Fase estreita : determina se colidem e, às vezes, como, sem falsos positivos

  3. Resolução : resolve a colisão.

A pergunta que estou fazendo é sobre a fase estreita. Existem vários algoritmos, diferindo em complexidade e precisão.

  1. Interseção do Hitbox : este é um algoritmo a posteriori, que tem a menor complexidade, mas também não é muito preciso,

  2. Interseção de cores : interseção da Hitbox para cada pixel, a posteriori, perfeito em pixels, não precisa em relação ao tempo, maior complexidade

  3. Teorema do eixo separador : é usado com mais frequência, preciso para triângulos, porém a-posteriori, pois não consegue encontrar a aresta. Ao considerar o último quadro, é mais estável

  4. Radiodifusão linear : o algoritmo A-priori, útil para a física de aparência semi-realista, encontra o ponto de interseção ainda mais preciso que o SAT, mas com mais complexidade

  5. Interpolação de spline : A-priori, ainda mais preciso que os raios lineares, ainda mais coplexidade.

Provavelmente há muito mais que eu esqueci. A questão é: quando é melhor usar SAT, quando raios, splines e se há algo melhor.

Marian Ivanov
fonte

Respostas:

6

Dois que você está perdendo e que imediatamente se destacam são GJK e MPR.

GJK é um algoritmo para encontrar o ponto mais próximo de dois polígonos convexos. Com um pouco de trabalho extra, você pode usá-lo para encontrar pontos de incidente para objetos que se cruzam e, assim, calcular um coletor de colisão. Isso é feito através do recorte de polígono, como se estivesse usando SAT, mas o GJK poupa algumas etapas (já que você já terá os pontos mais próximos).

O MPR (Minkowski Portal Refinement) é outro algoritmo, semelhante ao GJK (ambos usam espaços Minkowski). Ele não consegue encontrar o ponto mais próximo entre objetos sem interseção, como o GJK, mas possui muitas outras propriedades interessantes para jogos e é uma maneira de usar para obter um coletor de contatos.

O MPR é um dos mais populares para jogos. É muito eficiente, numericamente estável e fácil de implementar.

Outras fases estreitas são mais usadas em jogos especializados. Os jogos de corrida geralmente usam o raio vazado como modelagem de pneus reais e o comportamento realista (ou mesmo divertido) ainda não é possível usando o formato tradicional de colisão e resolução. Os criadores de plataforma também costumam usar física e colisão altamente personalizadas, pois a física "tipo Mario" preferida não é modelada com algoritmos tradicionais de física. Você também verá frequentemente diferentes métodos físicos e de colisão para fluidos e similares, embora eu saiba menos sobre eles.

Vejo:

Sean Middleditch
fonte
3

Eu queria dizer, o Teste do Eixo Separador , não o Teorema.

Você usaria o SAT em polígonos sem movimento (2D), embora possa estendê-lo para lidar com o movimento linear relativo.

http://elancev.name/oliver/2D%20polygon.htm#tut3

Não use o GJK em 2D, achei o seu mais lento do que simplesmente forçar o SAT.

Outra técnica que você pode usar é a diferença de Minkowski, que reduz um objeto a um ponto e 'cresce' o outro pela forma do primeiro. Em seguida, você testa o objeto combinado em relação ao ponto que é muito mais fácil - isso fornece a distância de penetração e o normal. Acho que essa ferramenta é conceitualmente muito útil para abordar novos problemas de detecção de colisão; mais fácil de visualizar do que o SAT.

Para polígonos em movimento e rotação (e poliedros), você pode usar o Avanço Conservador para encontrar a hora exata e o ponto de contato.

http://www.continuousphysics.com/BulletContinuousCollisionDetection.pdf

Você pode ler mais sobre essas técnicas nesta postagem de blog que escrevi há algum tempo:

http://www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/

Espero que ajude!

Saúde, Paul.

wildbunny
fonte
2
O teorema do eixo separador: existe um eixo ao longo do qual as projeções de dois objetos convexos são disjuntas se os objetos são disjuntos. Um teste de eixo separador: colocando em prática o teorema mencionado, eu acho.
Eric
0

Isso realmente depende do tipo de jogo que você tem. Cada método acima tem suas próprias vantagens e desvantagens.

No entanto, SAT é bastante padrão em minha experiência para bibliotecas genéricas de física, Ex. O Box2D o usa extensivamente (Angry Birds, e muitos outros jogos usam o Box2D).

Variações de interseção de cores misturadas com interseção SAT ou Hitbox são usadas em jogos como Sonic, Megaman, com bons resultados.

Eu não sei muito sobre os nºs 4 e 5.

XiaoChuan Yu
fonte