El evento Unity's on collision le proporciona un objeto Collision que le brinda información sobre la colisión que ocurrió (incluida una lista de ContactPoints con normales de hit).
Pero lo que no obtienes son normales de superficie para el colisionador que golpeas. Aquí hay una captura de pantalla para ilustrar. La línea roja es de ContactPoint.normal
y la línea azul es de RaycastHit.normal
.
¿Es esta una instancia de Unity que oculta información para proporcionar una API simplificada? ¿O las técnicas estándar de detección de colisiones en 3D en tiempo real simplemente no recopilan esta información?
Y para la segunda parte de la pregunta, ¿cuál es una forma segura y relativamente eficiente de obtener una superficie normal para una colisión?
Sé que la emisión de rayos le da normales de superficie, pero parece que necesito hacer varias transmisiones de rayos para lograr esto en todos los escenarios (tal vez un punto de contacto / combinación normal pierde el colisionador en el primer lanzamiento, o tal vez necesite hacer un promedio de todos las normales de los puntos de contacto para obtener el mejor resultado).
Mi método actual:
Copia de seguridad a lo
Collision.contacts[0].point
largo de su golpe normalRaycast por el golpe negado normal para
float.MaxValue
, enCollision.collider
Si eso falla, repita los pasos 1 y 2 con la normalidad no negada
Si eso falla, intente los pasos 1 a 3 con
Collision.contacts[1]
Repita 4 hasta que tenga éxito o hasta que se agoten todos los puntos de contacto.
Ríndete, vuelve
Vector3.zero
.
Esto parece captar todo, pero todas esas emisiones de rayos me marean, y no estoy seguro de cómo probar que esto funciona para suficientes casos. ¿Hay una mejor manera?
EDITAR Si esto es así como están las cosas con la colisión 3D, una descripción general de por qué en el caso general sería tan bienvenida como algo específico de Unity.