为什么在施加重力时我的球速度最终停止下降?

时间:2019-04-10 17:37:22

标签: java velocity gravity

首先将重力施加到我的球物体上时,它会按预期的方式发挥作用,在下落时加速,摩擦力是速度的一半,然后反转速度。问题在于,速度最终似乎达到了停止降低的水平,球开始在地板上轻微地上下跳跃。

下面的代码代表了我对球施加重力的过程。

double y        = 100;
double vel      = -10;
double gravity  = -1;
double friction = 0.5;

while(true) {
    y += vel;

    //if collides with floor
    if(y < 0) {
        y = 0;
        vel *= -1;
        vel *= friction;
    }

    else
        vel += gravity;
}

在此特定示例中,速度最终开始从-1.3333 ... 0.666 ...和-0.333 ...来回反弹。

我的目标是使球反弹到地板上,使其速度随着每次反弹而降低,直到最终达到速度0并停留在地板上。

2 个答案:

答案 0 :(得分:0)

代码中有一个问题……经过一定的弹跳后..球的最大高度超过了先前的最大高度。这显然违反了物理学。就像您放了y<0支票以避免让y走到负侧一样,您应该放一个y>prevMaxY以使高度不超过先前的最大值。

else if(y > maxY) {
    y = maxY;
    vel *= -1;
    vel *= friction;
}

为此,您必须跟踪以前的最大高度。

此外,作为终止条件,您应该在y上设置一个阈值,这意味着-if max height is less than the threshold then the ball has come to rest

不过,您的近似/假设非常粗糙。您可以考虑完善它们。

答案 1 :(得分:0)

记录有助于理解奇怪的振荡。

从此开始(大约65帧后到达):

vel: -1.365234375 
y: 0.26953125

下一帧,球击中地面,vel被翻转并减半:

vel: 0.6826171875 
y: 0 

接下来,球向上移动,而vel切换为负:

vel: -0.3173828125 
y: 0.6826171875 

接下来,球向下移动,而vel进一步降低:

vel: -1.3173828125 
y: 0.365234375

接下来,球击中地面,而vel减半并再次翻转:

vel: 0.65869140625 
y: 0

请注意,我们现在已经非常接近开始的地方,并且它将以这种方式继续进行,归一化到大约y = 1/3和y = 2/3。

如果从else语句中删除重力影响并允许重力影响每一帧,则球将沉降为零。

p5js中的示例:https://editor.p5js.org/bcingle/sketches/hfVbE9YJf