unity弹跳球奇迹般长高

Unity bouncing ball miraculously gains height

我有一个弹力设置为 1 的球体

小球没有阻力,利用重力

它击中了一个平台,该平台的弹力设置为 1 并且没有摩擦力

然而,球每次弹跳都会弹得更高,直至无穷大。我没有给它任何额外的动力,这怎么可能?

我在 javascript/html/css canvas 动画方面遇到了类似的问题。我对此没有任何解释。使用像 0.99999 或 0.969399 这样的数字应该可以解决问题。我确实明白你的意思,虽然这很奇怪。只要接近 1。这就是我能说的。无论如何,我希望这对您有所帮助。

这个问题是因为游戏中的物理现象发生在离散的帧中,并且移动对象将在发生碰撞的帧中位于另一个对象的“内部”。物理引擎然后必须在下一帧之前分离对象,并计算出用多少能量“反弹”。

执行此操作的步骤之一涉及计算对象重叠的程度,这就是这种幻影额外能量的来源。重叠误差越小,能量误差越小。

不要fiddle有弹性;这些都是天真的解决方案,更不用说他们回避问题而不是解决问题。

您应该做的是修复碰撞问题。这可以通过多种方式完成,最 appropriate/performant 取决于每个特定游戏:

  • 提高你的物理帧速率(减少固定增量时间)。这减少了重叠并使物理框架“更平滑”。不过,它真的 并不能解决幻象能量;只会使它的因果关系变小(也许小到不明显,这就是你所需要的)。
  • 将球体的碰撞检测方法设置为连续动态, 并将你的地面设置为静态。如果你需要球体碰撞 其他的东西,那些其他的东西也有类似的问题,那些需要 是非静态的,设置他们的刚体碰撞检测方法 连续。 (这是我经常发现最好的方法,但由于各种原因,我有一些其他方法更好的项目)
  • 增加默认求解器速度迭代
  • 将求解器类型更改为 Temporal Gauss Seidel