Das Kollisionsereignis von Unity gibt Ihnen ein Kollisionsobjekt , das Ihnen einige Informationen über die aufgetretene Kollision gibt (einschließlich einer Liste von ContactPoints mit Treffer-Normalen).
Was Sie jedoch nicht erhalten, sind Oberflächennormalen für den Collider, den Sie treffen. Hier ist ein Screenshot zur Veranschaulichung. Die rote Linie ist von ContactPoint.normal
und die blaue Linie ist von RaycastHit.normal
.
Ist dies eine Instanz von Unity, die Informationen verbirgt, um eine vereinfachte API bereitzustellen? Oder erfassen Standard-3D-Echtzeit-Kollisionserkennungstechniken diese Informationen einfach nicht?
Und für den zweiten Teil der Frage, was ist ein todsicherer und relativ effizienter Weg, um eine normale Oberfläche für eine Kollision zu erhalten?
Ich weiß, dass Raycasting Oberflächennormalen liefert, aber es scheint, dass ich mehrere Raycasts durchführen muss, um dies für alle Szenarien zu erreichen (möglicherweise fehlt bei einer Kombination aus Kontaktpunkt und Normal der Collider beim ersten Cast, oder Sie müssen einen Durchschnitt von allen erstellen die Normalen der Kontaktpunkte, um das beste Ergebnis zu erzielen).
Meine aktuelle Methode:
Sichern Sie die
Collision.contacts[0].point
entlang seiner Treffer normalRaycast den negierten Treffer normal für
float.MaxValue
, aufCollision.collider
Wenn dies fehlschlägt, wiederholen Sie die Schritte 1 und 2 mit der nicht negierten Normalen
Wenn dies fehlschlägt, versuchen Sie die Schritte 1 bis 3 mit
Collision.contacts[1]
Wiederholen Sie 4 bis erfolgreich oder bis alle Kontaktpunkte erschöpft sind.
Gib auf, kehre zurück
Vector3.zero
.
Dies scheint alles zu erfassen, aber all diese Raycasts machen mich mulmig, und ich bin mir nicht sicher, wie ich testen soll, ob dies für genügend Fälle funktioniert. Gibt es einen besseren Weg?
BEARBEITEN Wenn dies bei 3D-Kollisionen wirklich so ist, wäre ein Überblick darüber, warum dies im Allgemeinen der Fall ist, genauso willkommen wie etwas, das für Unity spezifisch ist.