2D物理引擎:弹跳球瓦特/非弹性碰撞不会停下来(2D Physics Engine: bouncin

2019-09-18 03:07发布

我在Java中创建一个简单的2D物理引擎,使用圆形弹和直壁。 目前,随着各帧中,每一个射弹的位置由前进velocity * (1/fps) 速度是继更新,每帧一次。 碰撞检测定义了使用先前和当前位置在点斜形式的线,检查是否该行与壁相交,并且如果该交叉点处的前一位置和当前位置之间在于,碰撞被登记和弹丸的当前位置和速度相应地更新。 目前,没有旋转,其目的。

现在,除了在非弹性碰撞这一切的作品。 目前,一个非弹性碰撞乘以弹丸的速度的分量垂直于它由一些系数小于1相撞的表面。

说有一个弹丸在水平表面上下颠簸。 什么应该发生的是,弹丸的速度的Y分量每弹跳下降,导致炮弹的最大高度与每一个反弹降低,最终达到它变得微不足道的一点。 取而代之的是,什么情况是,球的最大高度降低到某一点,然后开始增加了数反弹,再次开始下降,进入一个不断循环。 其结果是,球从来没有真正停止,但似乎“抖动”。

这是因为在射弹的直线段每帧移动,并且因为速度是不连续变化的。 如果有在此期间,球落下以外还有其间球上升帧多个帧,球被加速这些额外的帧,它最终会高于它应该有。 正在发生的事情是,球到达一个点,一个反弹将它发送上涨比它应该有上述原因。 当最大高度回落再度回落,由于非弹性碰撞,再次做同样的事情。

我试着通过使由球移动消除这种(v*t + 0.5*a*t^2)其中, v是速度, a是重力加速度,并且t1/fps 。 这工作,除了它会导致使用直线当反弹得到足够小的失败碰撞检测的事实。 我也试着做碰撞检测与参定义的抛物线,但是当涉及到抛射之间的冲突检测变得令人难以置信的恼人和低效。 如果您有兴趣,我可以解释我尝试的解决方案更加深入。

任何其他简单的解决方案,你想建议?

在此先感谢,特别是如果你实际上是通过这些五个段落阅读。

Answer 1:

我的建议是有一个代码块,如果弹跳高度达到或超过您已经定义为高度一定的常数, 只会反弹。 你会需要某种循环结构(或“助手”方法,我做了如下)球的每一个反弹后计算预计反弹高度。 然后,你也许能够做这样的事情:(假设你已经进入了“现在是时候反弹方法”)

private static final int MINIMUM_BOUNCE = 100 //arbitrary value

. . .

if(calculateNewBounceHeight() >= MINIMUM_BOUNCE) {
    bounce();
} else {
    // terminate program?
    // notify user?
    // etc.
}

这种方式唯一的问题是,如果你没有在某些时候终止,该程序将被检查,如果它可以无限反弹(如果球在基线“滚动”)。 这可能会导致一些内存的问题,因为它是在一定程度上的无限循环。

只是为了澄清: calculateNewBounceHeight()bounce()是我认为你将能够创建methds。 这是否帮助呢? 让我知道如果我错过了什么或错误解释的问题(我可能没有阅读整个事情)。



文章来源: 2D Physics Engine: bouncing ball w/ inelastic collisions does not come to a stop