【问题标题】:processing JS simulation of bouncing ball (elastic collision)弹跳球的处理JS模拟(弹性碰撞)
【发布时间】:2017-05-25 00:25:14
【问题描述】:

我编写了一个程序,该程序显示一个球落下,然后在落地后反弹。有时当它弹起时,它并没有达到它的初始高度。这是一个 JS fiddle 来说明我的意思:

https://jsfiddle.net/abq4zvsx/

我希望球表现得好像完全有弹性。也就是说,我希望它从某个初始高度开始,并在弹跳时再次达到该初始高度,以此类推,直到永远。

2017 年 5 月 25 日编辑: 我从绘图函数中删除了一些方法。只有 4 个在运行:绘制、重力和反弹决定了图形。 ballArray.heightStamp 触发将新线添加到数组 lineArray 以绘制球每次反弹时达到的高度。

我改变了小提琴来反映这一点。我删除了一些可能掩盖了最相关代码的方法。

2017 年 5 月 30 日编辑:我写的不同。我不太熟悉这样写,所以这个例子要简单得多。完整代码如下:

void setup() {  
  size(800, 400);
}

class Ball {

  float x = 400;
  float y = 50;
  float d = 14;
  float r = 7;
  float vy = 0;
  float ay = 0.2;

  void display() {
    ellipse(x, y, d, d);
  }
  void gravity() {
    vy += ay;
    y += vy;
  }
  void bounce() {
    if ((y+r)>height) {
      vy *= -1;
      y = height - r;
    }
  }

} //closing ball class

Ball ball = new Ball();

void draw() {
  background(235, 245, 255);
  ball.display();
  ball.gravity();
  ball.bounce();
}

2017 年 6 月 2 日编辑:我已经更仔细地检查了向其他报告类似问题的人提供的解决方案,但他们并没有解决我的问题。上面的代码与小提琴中的代码不同,但我认为它们的本质是一样的。

【问题讨论】:

  • 如果您发布一个较小的示例,您将会有更好的运气。只是一组简单的变量,显示了一个弹跳的球,而不是处理所有力的所有函数。
  • 谢谢。我猜其他的东西让我们很难看出什么是相关的。我也换了小提琴。
  • 你的问题是什么,@Jozurcrunch?
  • 我希望球每次反弹时都能达到初始高度。

标签: javascript processing.js


【解决方案1】:

一个简单的“修复”是让您的弹跳更加“对称”:

ball.prototype.bounce = function() {
  if ((this.y+this.r)>=height) {
    this.vy *= -1;
    this.y += this.vy; // Add this line
  }
};

对于更稳健的方法,您应该使用more sophisticated integrator 根据速度和力更新您的位置。

【讨论】:

  • 据我所知,这 一半 有效。球确实达到了相同的高度,但从外观上看,球并没有触地;令人震惊的是它只是害羞。给我一个非常相似的结果的东西是替换'this.y = height - this.r;' 'this.y = height - this.d;'但我一点也不知道为什么。我也会看看你链接的帖子。
  • @Jozurcrunch 这是因为您只计算固定时间步长的位置。地面碰撞通常发生在之间,而不是恰好在这些步骤中。实际上,您使用非常简单(但在大多数情况下足够)迭代近似来近似抛物线(恒定加速度 -> 线速度 -> 二次距离)。使用链接积分器之一以获得更好的结果,或者 - 当您真的只想模拟球 - 具有恒定重力的地面碰撞 - 用精确解替换近似值(让球遵循已知的抛物线轨迹)。
  • 冲突发生在步骤之间而不完全是在步骤之间,我很清楚。但我想更多的是你写的那行。以下听起来对吗?说在 t=0 时,位置是 y0 就在高度上方。它的当前速度是vy0。然后说在t=1,y1 = y0 - vy0 > height,所以弹跳条件满足,所以在t=2,y2 = y1 + vy0 = y0 - vy0 + vy0 = y0,速度为vy0。因此,球在完全在满足反弹条件之前相同的位置,完全相反的速度。我真的只是在这里抓住稻草
  • @Jozurcrunch 没错,这就是我所说的“对称”
  • 我只是想澄清一下数学问题:在 t=1,y1 = y0 + vy0 > 高度,在 t=2(遇到反弹),y2 = y1 + (-vyo) = y0 + vy0 - vy0 = y0,因为反弹条件反转了速度的方向。无论如何,尽管您已经提到了一些缺点,并且正如我在此示例中所经历的那样,但我认为就如何计算值的洞察力而言,您的答案非常可靠,而且我认为它给出了我可以通过一些算法来将这种近似的最缺点的部分转移到动画中不太明显的特征上。
猜你喜欢
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
相关资源
最近更新 更多