据我了解,有一种非常标准的方式来实现引力,这几乎是真正的交易;在每个时间步长中向对象的向下垂直速度添加一个数字(例如9.8)。
然而,这个简单的数学运算导致我的程序(and apparently others)出现“无限反弹”问题。到目前为止,简单的测试案例中有一个球垂直向下,并击中“地板”。碰撞时,球的矢量被偏转并减少1/4(占位符恢复系数)。在每个时间步,重力值(在我的情况下约为2)被添加到矢量。结果,球反弹,然后反弹,降低......然后不是真正停止,甚至明显停止(真正的目标),它在底部上下抖动的屏幕。调试读数显示它的速度从不低于2,超过几帧,因为该常数只是不断增加和取消,并无限期地再次添加。
现在,了解为什么不是困难的部分。这正是我从一开始就担心的,我只是觉得我有一些数学上的魔力,因为在解释数学时没有人真正提到这样的问题。但是 - 因为没有人讨论它 - 这让我想知道,修复它的“典型”方法是什么?
编辑:在相当工作之后,我已经确定单独使用单独的加速度值无法解决问题 - 它仍会始终尝试添加一些常量分数重力。恒定时间步长意味着恒定加速;恒定加速意味着恒定速度增加。反弹时的恢复系数会导致速度减小到一定程度,并使加速度无效,但加速度将从0开始。如下:
现在,整体问题是不,速度永远不会等于0.这是预期的。但是,预期的是无限减少数。当恢复系数设置为0.5时,得到的弹跳速度应该是最后一次的弹跳速度的一半,逐渐减小,直到它可以被丢弃为“停止”。通过引入纯恒定加法 - 无论是直接添加到速度,还是将其添加到另一个加速到速度的值 - 这个问题都会产生。我需要知道如何解决这个问题。
答案 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向上速度不足以“解锁”并将其设置为另一次反弹。