AABB - Colisão AABB, em que cara eu acerto?

7

Para permitir que meus objetos deslizem quando colidem, preciso:

  • Saiba com qual face da AABB eles colidem.
  • Calcule o normal para essa face.
  • Retorne ao normal e calcule o impulso a aplicar à velocidade do jogador.

Questão

Como posso calcular com que face da AABB colidi, sabendo que tenho duas colisões da AABB? Um é o jogador e o outro é um objeto do mundo.

Aqui está o que parece (colisão de problemas circulada em branco):

colisão de problemas

Obrigado pela ajuda.

PeeS
fonte

Respostas:

2

Verifique cada plano individual da AABB em relação à outra AABB. Se um plano intercepta o AABB do outro objeto, mas seu plano oposto não, você sabe que esse plano está envolvido na colisão. Se ambas as faces opostas cruzarem a outra AABB, o objeto estará totalmente dentro da outra ao longo desse eixo, e a direção da colisão será ambígua / indefinida.

Na prática, essas são as mesmas verificações usadas para determinar se os AABBs colidem, portanto, você deve poder determinar quais faces colidem ao fazer a verificação de colisão AABB com pouco custo adicional.

Observando o exemplo, vemos que:

  • O plano yz + da esfera cruza o prisma, mas yz- não. A esfera yz + colide. De maneira semelhante, o yz do prisma colide.
  • Tanto o prisma xy- e xy + estão dentro dos xy- e xy + da esfera. O prisma está totalmente dentro da esfera na direção z; colisão é ambígua.
  • Ambos os prismas xz- e xz + estão dentro dos xz- e xy + da esfera. O prisma está totalmente dentro da esfera na direção y; colisão é ambígua.

Portanto, neste exemplo, detectamos uma colisão entre a esfera yz + e o prisma yz-.

As normais de todas as faces devem ser óbvias (yz + tem (1,0,0), yz- tem (-1,0,0), xz- tem (0, -1,0) ...) Em geral, se se um quad possui os vértices (a, b, c, d) no sentido anti-horário, então você pode calcular o normal com (ba) .cross (cb)

Observe que esse problema apresenta a possibilidade de múltiplas colisões: dependendo do posicionamento, você pode ter colisões nos três eixos. Eu acho que essa 'ambiguidade' é bastante inerente, e como você resolve isso é realmente sua. Você pode apenas levar a média das normais individuais. Você pode encontrar a área de interseção em cada plano e, em seguida, escolher o normal que corresponde à maior área ou usar as áreas para ponderar a média dos normais. Você pode encontrar a profundidade da intrusão ao longo de cada eixo e escolher o normal correspondente à intrusão mais rasa (ou mais profunda). Etc etc.

ipê
fonte
Não poderia ser mais fácil? Graças ipeet - mais longos dias, semanas para me tentar código-lo ..
Pees
@PeeS - Eu sinto que isso é provavelmente algo que foi feito muitas vezes. Talvez você deva procurar ao redor como outras pessoas o implementaram.
Richard Marskell - Drackir