为什么Unity的OnCollisionEnter不能给我表面法线,最可靠的方法是什么?


11

Unity的on碰撞事件为您提供了Collision对象,该对象为您提供了有关发生的碰撞的一些信息(包括具有击中法线的ContactPoints列表)。

但是您不会得到的是所命中的对撞机的表面法线。这是说明的屏幕截图。红线来自ContactPoint.normal,蓝线来自RaycastHit.normal

在此处输入图片说明

这是Unity隐藏信息以提供简化API的实例吗?还是标准的3D实时碰撞检测技术只是不收集这些信息?

对于问题的第二部分,确保碰撞产生表面法线的方法是一种肯定有效且相对有效的方法?

我知道射线投射可以为您提供表面法线,但似乎我需要针对所有场景进行多次射线投射才能做到这一点(也许接触点/法线组合在第一次投射时错过了对撞机,或者您可能需要对所有物体进行平均接触点的法线以获得最佳效果)。

我目前的方法:

  1. 备份Collision.contacts[0].point其正常命中

  2. 对播放正常的否定命中的光线float.MaxValueCollision.collider

  3. 如果失败,请对非负法向重复步骤1和2。

  4. 如果失败,请尝试执行步骤1至3 Collision.contacts[1]

  5. 重复4,直到成功或直到所有接触点耗尽为止。

  6. 放弃,返回Vector3.zero

这似乎可以捕获所有内容,但是所有这些射线广播都使我感到不安,并且我不确定如何在足够的情况下测试这种方法是否奏效。有没有更好的办法?

编辑 如果这确实是3D冲突的处理方式,那么在一般情况下为什么要概述为什么与Unity特有的东西一样受欢迎。


这仅仅是出于好奇吗,还是您正在尝试做某事并被卡住?也就是说,为什么您认为需要表面法线?提出问题,询问您要达到的效果,而不是如何“解决”未解决的问题,某人可能会帮助您解决问题。:)
肖恩·米德迪奇

@SeanMiddleditch我不同意。这个问题提出得很好,而这正是我所寻找的。这个问题及其答案帮助我纠正了我做错的事情。
SteakOverflow '16

Answers:


12

这确实就是碰撞的方式。不仅是3D,还包括2D。请看以下示例:

重叠AABB

绿色和红色AABB发生碰撞,而接触歧管是蓝色区域。接触点将在某处的蓝色区域中(确切的位置可能会因算法而异,但是蓝色/红色/绿色相交的角是理想的)。

应该返回什么表面法线?红色AABB的顶部边缘还是左侧?如果绿色框掉下来了,也许我们可以合理地猜测顶部边缘。如果它向右移动,也许我们可以合理地猜测左边缘。如果它向右下移动怎么办?我们是否采用穿透力最小的轴?最大速度的速度轴?两者都有启发性吗?如果盒子恰好在拐角处碰撞怎么办?

将其扩展到可能由数百个tris / faces组成的复杂3D表面。您仍然只会拥有少量的理想联络点。应该返回什么表面法线?整个三重网格上的平均表面法线(对于大多数对象而言这没有意义)?这些点是否直接位于“碰撞盒”的角下面(对于大多数其他形状而言,定义不充分)?您是否尝试找到与所生成的接触点最接近的面(这需要第二遍,因为接触点不是直接从任何网格面计算得出的)?如果找到最接近的面,是采用该面的法线还是在接触点插值该面的顶点以获取“平滑”对象的正确法线?

确实,主要问题是接触点不是全部接触点。毕竟,在许多情况下,那将是无穷多个点。它们只是分布得很好的几个点,通过在所述点上施加力以使碰撞对象以松散的方式来回移动,可以近似地近似物理反应。实际物体接触的特定点/位置在简化的数学模型之后被抽象出来。因此,在一般情况下,接触的特定表面法线的想法根本没有多大意义。

当然,在对对象,世界和运动有更具体的约束和限制的情况下,您可以创建替代的碰撞算法,以告诉您有关表面法线的信息。在上面的2D情况下,如果我们假设盒子永远不会旋转并且我们知道每个盒子的相对速度和最后位置,则可以使用连续碰撞检测来准确找出它们何时会碰撞以及哪些特征发生碰撞,从而向我们提供发生碰撞的确切特征,可以用作接触/碰撞/表面法线。平台游戏完全基于这样的假设和特殊技巧(这就是为什么使用像Box2D或Havok这样的通用物理库,或者灯光永远不会产生像Mario或Sonic这样的经典平台游戏所能提供的那种严格而精确的控制的原因;我不会想说

像Unity3D中使用的那样,通用的牛顿物理学库无法进行这些简化和假设。因此,您不会得到碰撞表面法线,而是得到了一个接触歧管,通常简化为接触点,仅此而已。


这是一个很好的答案,也正是我一直在寻找的东西,谢谢。具体的问题是在碰撞时获得运动刚体上令人信服的反射向量。如果您想通过此类信息来选择是要进行射线广播还是要获取3个联系点(如果有)并采用叉装产品,这是通常的方法吗?
michael.bartnett 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.