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

问题描述 投票:2回答:2

当重力施加到我的球对象时,它首先按预期运行,在下降时加速,摩擦力为速度的一半,然后反转速度。问题是最终速度似乎达到了停止下降的程度,并且球开始在地板上轻微地上下跳跃。

下面的代码表示我将重力应用于球的过程。

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并靠在地板上。

java velocity gravity
2个回答
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

不过,你的近似/假设非常粗糙。你可以考虑改进它们。


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

© www.soinside.com 2019 - 2024. All rights reserved.