【问题标题】:Unity bouncing ball miraculously gains heightUnity弹跳球奇迹般地长高了
【发布时间】:2021-08-07 22:59:23
【问题描述】:
我有一个弹性设置为 1 的球体
球没有阻力并使用重力
它撞到了一个平台,该平台的弹性设置为 1 并且没有摩擦
然而,球在每次反弹时反弹得更高,达到无穷大。在我没有给它任何额外动力的情况下,这怎么可能?
【问题讨论】:
标签:
unity3d
game-physics
physics
gameobject
rigid-bodies
【解决方案1】:
问题来自这样一个事实,即游戏中的物理发生在离散帧中,并且在发生碰撞的帧中,一个移动的对象将在另一个“内部”。然后物理引擎必须在下一帧之前分离物体,并计算出要“反弹”多少能量。
执行此操作的步骤之一是确定对象重叠的程度,这就是这种幻像额外能量的来源。重叠误差越小,能量误差越小。
不要摆弄弹性;这些都是幼稚的解决方案,更不用说他们回避问题而不是解决问题。
您应该做的是解决碰撞问题。这可以通过多种方式完成,其中最合适的/性能取决于每个特定的游戏:
- 提高物理帧速率(减少固定增量时间)。这减少了重叠并使物理框架“更平滑”。但它并没有真正解决幻影能量;只会让它的原因和影响变得更小(也许太小以至于它们变得不明显,这就是你所需要的)。
- 将球体的碰撞检测方法设置为连续动态,
并将您的地面设置为静态。如果你需要球体碰撞
其他的东西,那些其他的东西存在类似的问题,那些需要
为非静态,设置其刚体的碰撞检测方法
为连续。 (这是我最常认为最好的方法,但我有一些项目由于各种原因而其他人更好)
- 增加默认求解器速度迭代次数
- 将求解器类型更改为 Temporal Gauss Seidel
【解决方案2】:
我对 javascript/html/css 画布动画也有类似的问题。我对此没有任何解释。使用像 0.99999 或 0.969399 这样的数字就可以了。我明白你的意思,虽然这很奇怪。只要接近 1。我只能这么说。无论如何,我希望这会有所帮助。