O evento Unity's on collision fornece um objeto Collision que fornece algumas informações sobre a colisão que ocorreu (incluindo uma lista de ContactPoints com normais de ocorrência).
Mas o que você não obtém são normais de superfície para o colisor atingido. Aqui está uma captura de tela para ilustrar. A linha vermelha é de ContactPoint.normal
e a linha azul é de RaycastHit.normal
.
Essa é uma instância de informações ocultas do Unity para fornecer uma API simplificada? Ou as técnicas padrão de detecção de colisão em tempo real 3D simplesmente não coletam essas informações?
E para a segunda parte da pergunta, qual é a maneira certa e relativamente eficiente de obter uma superfície normal para uma colisão?
Eu sei que o raycasting fornece normais de superfície, mas parece que eu preciso fazer vários raycasts para fazer isso em todos os cenários (talvez uma combinação de ponto de contato / normal perca o colisor no primeiro elenco ou talvez você precise fazer uma média de tudo normais dos pontos de contato para obter o melhor resultado).
Meu método atual:
Faça backup do
Collision.contacts[0].point
seu hit normalRaycast abaixo o hit negado normal para
float.MaxValue
, emCollision.collider
Se isso falhar, repita as etapas 1 e 2 com a função normal não negada.
Se isso falhar, tente as etapas 1 a 3 com
Collision.contacts[1]
Repita 4 até obter êxito ou até que todos os pontos de contato tenham se esgotado.
Desista, volte
Vector3.zero
.
Isso parece pegar tudo, mas todos esses raycasts me deixam enjoado e não sei como testar se isso funciona em casos suficientes. Existe uma maneira melhor?
EDITAR Se realmente é assim que as coisas acontecem com a colisão 3D, uma visão geral do porquê, no caso geral, seria tão bem-vinda quanto algo específico do Unity.