L'evento in caso di collisione di Unity ti dà un oggetto Collisione che ti fornisce alcune informazioni sulla collisione avvenuta (incluso un elenco di ContactPoints con hit standard ).
Ma ciò che non ottieni sono normali di superficie per il collisore che colpisci. Ecco uno screenshot per illustrare. La linea rossa proviene da ContactPoint.normal
e la linea blu proviene da RaycastHit.normal
.
È un'istanza di Unity che nasconde informazioni per fornire un'API semplificata? Oppure le tecniche di rilevamento delle collisioni 3D in tempo reale standard non raccolgono queste informazioni?
E per la seconda parte della domanda, qual è un modo sicuro e relativamente efficiente per ottenere una superficie normale per una collisione?
So che il raycasting ti dà le normali di superficie, ma sembra che devo realizzare diversi raycast per realizzarlo in tutti gli scenari (forse un punto di contatto / una combinazione normale manca il collider nel primo cast, o forse devi fare una media di tutto le normali dei punti di contatto per ottenere il miglior risultato).
Il mio metodo attuale:
Eseguire il backup
Collision.contacts[0].point
lungo il suo colpo normaleTrasmetti il colpo negato normale per
float.MaxValue
, suCollision.collider
In caso contrario, ripetere i passaggi 1 e 2 con la normale non negata
In caso contrario, prova i passaggi da 1 a 3 con
Collision.contacts[1]
Ripetere 4 fino al completamento o fino all'esaurimento di tutti i punti di contatto.
Rinuncia, ritorna
Vector3.zero
.
Questo sembra catturare tutto, ma tutti quei raycast mi fanno sentire nauseato, e non sono sicuro di come testarlo per un numero sufficiente di casi. Esiste un modo migliore?
MODIFICA Se questo è davvero il modo in cui le cose si verificano con la collisione 3D, una panoramica del perché nel caso generale sarebbe il benvenuto come qualcosa di specifico per Unity.