重力物理,避免无限弹跳?

时间:2013-02-24 14:06:48

标签: collision-detection physics

据我了解,有一种非常标准的方式来实现引力,这几乎是真正的交易;在每个时间步长中向对象的向下垂直速度添加一个数字(例如9.8)。

然而,这个简单的数学运算导致我的程序(and apparently others)出现“无限反弹”问题。到目前为止,简单的测试案例中有一个球垂直向下,并击中“地板”。碰撞时,球的矢量被偏转并减少1/4(占位符恢复系数)。在每个时间步,重力值(在我的情况下约为2)被添加到矢量。结果,球反弹,然后反弹,降低......然后不是真正停止,甚至明显停止(真正的目标),它在底部上下抖动的屏幕。调试读数显示它的速度从不低于2,超过几帧,因为该常数只是不断增加和取消,并无限期地再次添加。

现在,了解为什么不是困难的部分。这正是我从一开始就担心的,我只是觉得我有一些数学上的魔力,因为在解释数学时没有人真正提到这样的问题。但是 - 因为没有人讨论它 - 这让我想知道,修复它的“典型”方法是什么?

编辑:相当工作之后,我已经确定单独使用单独的加速度值无法解决问题 - 它仍会始终尝试添加一些常量分数重力。恒定时间步长意味着恒定加速;恒定加速意味着恒定速度增加。反弹时的恢复系数会导致速度减小到一定程度,并使加速度无效,但加速度将从0开始。如下:

  1. 加速从0开始,速度从y开始。
  2. 加速度增加(grav * timestep)。
  3. 速度因加速度而增加。
  4. 重申2-3直到与地板发生碰撞。
  5. 加速现在回到0。
  6. 相应地反映速度矢量,然后乘以CoR。
  7. 重申2-3,因为速度从负值变为0,再次变为正值。
  8. 重申2-7,每次反弹都比前一次保留更少的动力。
  9. 弹跳现在非常小。
  10. 速度现在小于(grav * timestep)。
  11. 与地板的碰撞将加速度设置为0。
  12. 加速度再次增加(grav * timestep)。
  13. 速度通过加速度增加 - 现在足以从负面摆动到正面。
  14. 无限重复11-13。
  15. 现在,整体问题是,速度永远不会等于0.这是预期的。但是,预期的是无限减少数。当恢复系数设置为0.5时,得到的弹跳速度应该是最后一次的弹跳速度的一半,逐渐减小,直到它可以被丢弃为“停止”。通过引入纯恒定加法 - 无论是直接添加到速度,还是将其添加到另一个加速到速度的值 - 这个问题都会产生。我需要知道如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

刚刚处理同样的问题。

以下是为我修复的代码:

if (cat.y + cat.height >= ground.y)    // if the cat has hit the ground
{
    cat.y = ground.y - cat.height;    // reset to the bottom
    cat.vector.y = Math.round(COR * -cat.vector.y);    // might want to round down
}

这里的重要部分是四舍五入。

答案 1 :(得分:0)

要解决这个问题,你唯一需要做的就是当球撞到地面时逆着垂直速度并将球放在障碍物上,这样球就会锁定在地面上,因为9.8 / 4向上速度不足以“解锁”并将其设置为另一次反弹。