L'événement On collision de Unity vous donne un objet Collision qui vous donne des informations sur la collision qui s'est produite (y compris une liste de ContactPoints avec des normales de hit).
Mais ce que vous n'obtenez pas, ce sont des normales de surface pour le collisionneur que vous frappez. Voici une capture d'écran pour illustrer. La ligne rouge est de ContactPoint.normal
et la ligne bleue est de RaycastHit.normal
.
Est-ce une instance de Unity cachant des informations pour fournir une API simplifiée? Ou les techniques de détection de collision 3D en temps réel ne collectent-elles tout simplement pas ces informations?
Et pour la deuxième partie de la question, quel est un moyen infaillible et relativement efficace d'obtenir une surface normale pour une collision?
Je sais que le raycasting vous donne des normales de surface, mais il semble que je doive faire plusieurs raycasts pour accomplir cela pour tous les scénarios (peut-être qu'un point de contact / une combinaison normale manque le collisionneur sur la première distribution, ou peut-être que vous devez faire une moyenne de tous les normales des points de contact pour obtenir le meilleur résultat).
Ma méthode actuelle:
Sauvegarder le
Collision.contacts[0].point
long de son hit normalRaycast sur le coup négatif normal pour
float.MaxValue
, leCollision.collider
Si cela échoue, répétez les étapes 1 et 2 avec la normale non inversée
Si cela échoue, essayez les étapes 1 à 3 avec
Collision.contacts[1]
Répétez 4 jusqu'à la réussite ou jusqu'à ce que tous les points de contact soient épuisés.
Abandonnez, revenez
Vector3.zero
.
Cela semble tout comprendre, mais tous ces raycasts me rendent mal à l'aise, et je ne sais pas comment tester que cela fonctionne pour suffisamment de cas. Y a-t-il une meilleure façon?
EDIT S'il s'agit vraiment de la façon dont les choses se passent avec les collisions 3D, un aperçu des raisons pour lesquelles dans le cas général serait tout aussi bienvenu que quelque chose de spécifique à Unity.