Unity的on碰撞事件为您提供了Collision对象,该对象为您提供了有关发生的碰撞的一些信息(包括具有击中法线的ContactPoints列表)。
但是您不会得到的是所命中的对撞机的表面法线。这是说明的屏幕截图。红线来自ContactPoint.normal
,蓝线来自RaycastHit.normal
。
这是Unity隐藏信息以提供简化API的实例吗?还是标准的3D实时碰撞检测技术只是不收集这些信息?
对于问题的第二部分,确保碰撞产生表面法线的方法是一种肯定有效且相对有效的方法?
我知道射线投射可以为您提供表面法线,但似乎我需要针对所有场景进行多次射线投射才能做到这一点(也许接触点/法线组合在第一次投射时错过了对撞机,或者您可能需要对所有物体进行平均接触点的法线以获得最佳效果)。
我目前的方法:
备份
Collision.contacts[0].point
其正常命中对播放正常的否定命中的光线
float.MaxValue
,Collision.collider
如果失败,请对非负法向重复步骤1和2。
如果失败,请尝试执行步骤1至3
Collision.contacts[1]
重复4,直到成功或直到所有接触点耗尽为止。
放弃,返回
Vector3.zero
。
这似乎可以捕获所有内容,但是所有这些射线广播都使我感到不安,并且我不确定如何在足够的情况下测试这种方法是否奏效。有没有更好的办法?
编辑 如果这确实是3D冲突的处理方式,那么在一般情况下为什么要概述为什么与Unity特有的东西一样受欢迎。