首先将重力施加到我的球物体上时,它会按预期的方式发挥作用,在下落时加速,摩擦力是速度的一半,然后反转速度。问题在于,速度最终似乎达到了停止降低的水平,球开始在地板上轻微地上下跳跃。
下面的代码代表了我对球施加重力的过程。
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并停留在地板上。
答案 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语句中删除重力影响并允许重力影响每一帧,则球将沉降为零。