Você pode estar recebendo falsos positivos. Colisões detectadas, mas não realmente colidindo.
O número 15 vem de
- 3 eixos do objeto A (face normal)
- 3 eixos do objeto B (face normal)
- 9 eixos de todos os pares de arestas de A e arestas de B (3x3)
- = 15 no total
Os 9 eixos são compostos por produtos transversais das arestas de A e arestas de B
- Ae1 x Be1 (Borda 1 de A borda cruzada 1 de B)
- Ae1 x Be2
- Ae1 x Be3
- Ae2 x Be1
- ... e assim por diante
Os 6 primeiros eixos (das normais da face) são usados para verificar se um canto de um objeto está cruzando uma face do outro objeto. (ou mais corretamente para eliminar esse tipo de colisão)
O conjunto de 9 eixos formado pelos produtos transversais das arestas é usado para considerar a detecção de colisão de arestas, onde não há um vértice penetrando no outro objeto. Como a colisão 'quase' na foto abaixo. Vamos supor, para o restante desta resposta, que as duas caixas da figura não estão colidindo, mas estão separadas por uma pequena distância.
Vamos ver o que acontece se apenas usarmos as 6 faces normais para o SAT. A primeira imagem abaixo mostra um eixo da caixa azul e 2 eixos da caixa amarela. Se projetarmos ambos os objetos nesses eixos, obteremos uma sobreposição nos três. A segunda imagem abaixo mostra os dois eixos restantes da caixa azul e o eixo restante da caixa amarela. Mais uma vez, projetar nesses eixos mostrará sobreposições em todos os 3.
Portanto, apenas a verificação das 6 normais de face mostrará sobreposições em todos os 6 eixos, o que, de acordo com o SAT, significa que os objetos estão colidindo, porque não conseguimos encontrar uma separação. Mas é claro que esses objetos não estão colidindo. A razão pela qual não encontramos uma separação é porque ainda não procuramos o suficiente!
Então, como vamos encontrar essa lacuna? A imagem abaixo mostra um eixo no qual a projeção de ambos os objetos revelará uma separação.
De onde tiramos esse eixo?
Se você imaginar deslizando um pedaço de cartão rígido no espaço, esse cartão fará parte do plano de separação. Se projetarmos para o normal desse plano (seta preta na figura acima), veremos a separação. Sabemos o que é esse plano porque temos dois vetores que se encontram nesse plano. Um vetor é alinhado com a borda do azul e o outro vetor é alinhado com a borda do amarelo e, como todos sabemos, o normal para um plano é simplesmente o produto cruzado de dois vetores no avião.
Portanto, para os OOBBs, precisamos verificar todas as combinações (9 delas) de produtos cruzados das bordas dos dois objetos para garantir que não faltem separações de bordas.
A resposta de Ken observa:
É um pouco confuso fazer referência às arestas, pois existem 12 arestas em comparação com 6 normais, quando você também pode usar os três principais normais para a mesma saída - as arestas estão todas alinhadas com as normais, então eu recomendo usá-las !
Observe também que os normais que apontam para o mesmo eixo, mas em uma direção diferente, são ignorados e, portanto, temos três eixos únicos.
Outra coisa que eu gostaria de acrescentar é que você pode otimizar esse cálculo saindo cedo se encontrar um eixo de separação antes de calcular todos os eixos que deseja testar. Portanto, não, você não precisa testar todos os eixos em todos os casos, mas precisa estar pronto para testá-los todos :)
Aqui está uma lista completa dos eixos a serem testados, dados dois OBBs, A e B, onde x, ye z se referem aos vetores base / três normais únicos. 0 = eixo x, 1 = eixo y, 2 = eixo z
Há também uma pequena ressalva, da qual você deve estar ciente.
O produto cruzado fornecerá um vetor zero {0,0,0} quando dois eixos entre os objetos apontarem na mesma direção.
Além disso, como essa parte foi deixada de fora, aqui está minha implementação para verificar se a projeção está sobreposta ou não. Provavelmente existe uma maneira melhor, mas isso funcionou para mim! (Usando o Unity e sua API C #)
fonte
exemplo c # de trabalho com base na resposta de Acegikmo (usando algumas APIs de unidade):
fonte