Como resolver colisões de formas compostas usando SAT?

16

O SAT é uma maneira decente de determinar colisões entre polígonos convexos arbitrários. Você ainda receberá o vetor necessário para resolver uma colisão.

Para resolver colisões entre formas complexas (não convexas), eu estava pensando em algum tipo de forma composta que consiste em vários polígonos convexos. Se ocorrer uma colisão na fase ampla (por exemplo, círculo x círculo ou AABB x AABB), a colisão será resolvida verificando cada polígono na forma composta vs. cada polígono na outra forma composta.

Gostaria de saber qual é a melhor maneira de realmente separar os objetos? Uma abordagem ingênua seria apenas pegar o vetor com a maior magnitude e usá-lo para a separação. Na figura a seguir, isso seria V 2

Exemplo 1 do SAT

No entanto, se os vetores de separação apontarem para direções diferentes, a colisão não poderá ser resolvida imediatamente e poderá exigir várias iterações. Portanto, na próxima figura, separaríamos o uso de V 1 e em outra iteração de V 2 (ou algo próximo a V 2 , pois a forma teria se movido pela quantidade de V 1 ).

Exemplo 2 de SAT

Essa abordagem falhará ao separar vetores que apontam na direção oposta um do outro ou em um caso como o mostrado na figura a seguir:

Exemplo SAT 3

Aqui, iteraríamos interminavelmente entre o estado à esquerda e o estado à direita.

Então, para fazer uma pergunta real aqui: Qual é uma abordagem razoável para esse problema? Eu acho que usar polígonos compostos para formas complexas é uma idéia razoável, mas eu realmente me pergunto como as colisões devem ser resolvidas nesse caso. Como detecto um beco sem saída, como mostrado na terceira imagem?

bummzack
fonte
Você pode esclarecer para que deseja usar o vetor?
Será
@ Will O vetor deve ser usado para resolver a colisão, para que as formas não se sobreponham mais. Para que eu pudesse mover o objeto amarelo pelo vetor resultante e os dois objetos não colidiriam mais.
bummzack

Respostas:

7

Eu acho que você pode estar tentando encaixar uma chave quadrada em um buraco redondo aplicando SAT da maneira que está aqui. Obviamente, ele não foi projetado para colisões côncavas-côncavas e, embora eu recomende seu esforço para adaptá-lo para esse fim, há considerações que tornam improvável que isso funcione.

Realismo

Impulso angular e seus efeitos indiretos são o nome do jogo aqui.

A ordem dos pontos de contato é importante para a resolução realista de colisões. No mundo real, um desses pontos sempre vai aparecer antes de outro. E é apenas emulando a ordem de contato e os resultados de cada "subcolisão" representada por isso, que você pode esperar obter um resultado realista na simulação. Essa é uma das razões pelas quais você está dividindo seu côncavo em convexo, em primeiro lugar - ele permite a detecção por partes de qual parte foi atingida primeiro. Obviamente, isso também pode ser emulado de acordo com meu comentário sob o título "Menos realismo".

Seus acessórios convexos combinam-se para dar ao objeto o contorno e o centróide (e, claro, em simulações mais complexas, cada acessório pode afetar a densidade de maneira diferente). A razão pela qual mencionei isso é que, ao resolver colisões de maneira realista, você precisará calcular não apenas o impulso linear, mas também o angular, seguindo cada "sub-colisão" de seus pontos de contato. Não é tão simples quanto o "afastamento" básico que você aplica com o SAT.

Isso muda completamente a natureza do seu problema, porque, como você pode ver, é inútil obter e tentar usar 2 ou mais pontos de contato, porque na verdade é apenas o primeiro que importa. Depois de ter resolvido o primeiro em termos de impulso linear e angular, será necessário recalcular para outras colisões, porque as orientações de cada objeto serão alteradas. Além disso, a detecção de cada contato individual na etapa pode ou não precisar ser realizada dentro da mesma etapa - dependendo do tempo entre os contatos quando o primeiro ponto de contato dos objetos toca, o impulso linear e angular subsequente é aplicado, segundo toques no ponto de contato e assim por diante.

Menos realismo

Naturalmente, supondo que você não esteja nem um pouco interessado em resolver um impulso angular, o melhor que você pode fazer com o SAT se torna essencialmente exatamente o que você faria se você envolvesse esses polígonos como convexos usando algo como o Scan de Graham: Separando-se pela única separação vetor. Em outras palavras, faz pouco sentido tentar resolver três vetores em conjunto, como você demonstrou. É o maior do grupo que conta.

EDITAR em resposta à sua pergunta

O que você precisa fazer se quiser uma abordagem simplista é o seguinte:

  • Determine a direção correta do deslocamento. Isso é feito com mais facilidade casco convexo cada um e determinação das normais para o eixo de separação.

  • Agora você precisa determinar a magnitude do deslocamento . Por que não podemos simplesmente usar a magnitude dada pelo SAT? Porque se você pensar bem, as profundidades de interpenetração serão potencialmente maiores para os cascos convexos, do que para os cascos côncavos correspondentes - pense em dois E com os dentes um no outro! Como você fez acima, encontre todos os pontos de contato para uma determinada etapa, mas encontre-os paralelos às normais do eixo, porque essa é a direção correta do deslocamento. Agora determine qual desses vetores de sobreposição paralelos é o mais longo. Desloque por esse, descarte o resto e prossiga para a próxima etapa da física.

Engenheiro
fonte
Eu acho que entendo o que você quer dizer. Então, no cenário "menos realismo", eu não apenas avaliaria os vetores (mais curtos) dados pelo SAT para os polígonos individuais, mas também teria que considerar as outras sobreposições (maiores) e, na pior das hipóteses, usando o casco convexo?
bummzack
Consulte a edição (mais recente).
coordenador