【问题标题】:Why does my balls velocity eventually stop decreasing when applying gravity?为什么在施加重力时我的球速度最终会停止下降?
【发布时间】: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 &lt;= 0 而不是y &lt; 0
  • 阅读ericlippert.com/2014/03/05/how-to-debug-small-programs 了解调试代码的技巧。
  • @MadPhysicist 使用&lt;=,OP 将遇到浮点值相等比较的陌生之地。为避免这种情况,他们可以使用&gt; 并切换ifelse 子句。
  • 您应该设置一些阈值。想象一下你的球移动得如此缓慢,然后它通过了 y 一个单位的一小部分,但随后重力立即增加了速度,即使实际上它离地面如此之近,它也没有时间累积所有这些加速度。您应该设置条件,以便如果 y

标签: java velocity gravity


【解决方案1】:

代码中有一个问题......在某些反弹之后......球的最大高度超过了之前的最大高度。这显然违反了物理学。就像你放了一个y&lt;0 来避免让y 走向负面一样,你应该放一个y&gt;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

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

【讨论】:

    【解决方案2】:

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

    从这个开始(大约 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 2014-02-15
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      相关资源
      最近更新 更多