据我所知,有一种非常标准的方法来实现重力,这几乎是真正的方法;在一个物体的向下垂直速度中加入一个数字(比如9.8)。
然而,这个简单的数学在我的程序(and apparently others)中导致了“无限反弹”的问题。到目前为止,简单的测试案例中有一个球直接下降,并击中了“地板”。在碰撞时,球的矢量被偏转,并减少1/4 (一个占位符的恢复系数)。在每一时间步骤中,重力值(在我的例子中大约为2)被添加到向量中。结果,球会反弹,然后反弹得越来越低.然后,它不是真正的停止,甚至是明显的停止(真正的目标),而是在屏幕底部上下抖动。调试读数显示,它的速度从不会下降到2以下超过几个帧,因为这个常数只是不断地被添加和取消,并再次无限期地添加。
现在,理解为什么不是困难的部分。这正是我从一开始就担心的,我只是觉得我忽略了一些数学魔法,因为在解释数学时,没有人真正提到过这样的问题。但是--因为从来没有人讨论过--这确实让我好奇,修复它的“典型”方法是什么?
编辑:在做了大量的工作后,我已经确定单独使用单独的加速值并不能解决这个问题--它仍然会尝试添加一些恒定的重力分数。恒定的时间步长意味着恒定的加速度;恒定的加速度意味着恒速的增加。弹跳恢复系数会使速度降低到一个点,并使加速度负值,但是加速度会从0开始。就像这样:
现在,总的问题是而不是,速度永远不会等于0。这是意料之中的。但我们也期待的是,一个无限递减的数字。当恢复系数设定为0.5时,所产生的反弹速度应为最后一次反弹速度的一半,逐渐减少,直至可作为“停止”予以丢弃。通过引入纯常数加法--不管是直接加到速度上,还是把它加到另一个加到速度上的值--就产生了这个问题。我需要知道如何解决这个问题,特别是。
发布于 2013-10-26 02:06:52
只是处理了同样的问题。
这里是为我修复它的代码:
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
}
这里的重要部分是四舍五入。
发布于 2013-04-01 18:05:21
要解决这个问题,你唯一要做的就是当球击中地面时,倒转垂直速度,并将球放在障碍物上,这样球就会锁定在地面上,因为9.8 /4向上的速度不足以“解锁”它,并使它再次反弹。
https://stackoverflow.com/questions/15052500
复制相似问题