【发布时间】:2019-04-10 17:37:22
【问题描述】:
当对我的球物体施加重力时,首先它会按预期运行,在下落时加速,摩擦力减半,然后反转速度。问题是最终速度似乎达到了一个点,它停止下降并且球开始在地板上轻微上下跳跃。
下面的代码代表我对球施加重力的过程。
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 的速度并停在地板上。
【问题讨论】:
-
为什么不向上移动?当球触地时,您的代码将速度乘以 -1(即反转方向)。
-
可能是因为它永远不会恰好在 y=0 处结束。您需要补偿您的地板可能不在您的时间步长的确切边缘这一事实。如果是这样,你就让球继续穿过它。检查
y <= 0而不是y < 0。 -
@MadPhysicist 使用
<=,OP 将遇到浮点值相等比较的陌生之地。为避免这种情况,他们可以使用>并切换if和else子句。 -
您应该设置一些阈值。想象一下你的球移动得如此缓慢,然后它通过了 y 一个单位的一小部分,但随后重力立即增加了速度,即使实际上它离地面如此之近,它也没有时间累积所有这些加速度。您应该设置条件,以便如果 y