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.