性能和真实性
在过去的几次测试测试中,我们注意到有时候磁化有些挑剔。 这导致我们重新考虑我们在核心机制中的一些选择。 这迫使我们进行一些有趣的观察和设计决策。
通常,我们在每对对象之间循环并对其施加力,从而根据极点改变符号。 听起来很简单,对吧? 好吧,要施加力,我们需要计算吸引/排斥的方向。 我想到了两种简单的方法:(1) 最接近点的差异和(2) 中心差异 。 考虑一对对象A和B。对于第一种技术,我们将在B的对撞机上找到最接近A的点,然后施加力以获取方向矢量,反之亦然。对于第二种技术,我们将使用每个身体的中心以获得方向向量。
问题在于这些技术都不是完美的! 考虑以下情况:B是弯曲的墙面,A停在其底部。 下图中可以看到一个粗略的草图。 在这种情况下,最接近A的点是下面的地板。 因此,有时不是从整个表面向A施加力,而是有时会从距离为0的地板上获得零向量。我们可以通过计算距A对撞机中心最近的点来解决此问题。 但是,在大多数曲面隧道壁的非凸网格碰撞器上,未定义查找最接近点的行为。 用小技巧不可能解决这个问题。

中心差异技术在实践中效果更好。 这是我们进行大部分游戏测试课程时使用的方法。 但是,这会产生不同的误差:大墙的中心可能无法代表应从墙的一部分施加的力。 一种解决方案是将墙壁分解为较小的碎片,每个碎片都有不同的对撞机,以使游戏对象的中心近似于最接近的点。
从理论上讲,甚至更准确的方法是考虑B的整个表面并将力施加到A上。我们可以使用特定粒度的射线投射来实现此目的,尤其是针对B的对撞机(绕过所有其他对撞机)。 这项技术为我们提供了许多差分矢量,可以对它们进行平均以得出应向哪个方向施加力。但是,事实证明,在每个物理框架上执行此操作极其昂贵,并且导致施加较大滞后的力。 Unity Scripting API没有任何其他方法可以获取到整个曲面的距离。
目前,尽管存在一些缺陷和不真实的动作,但我们发现中央差分方法的平均效果最佳。 它可能并不完全准确,但它的速度要快几个数量级,因此对于VR游戏而言更为流畅。