重力模拟变得混乱

时间:2013-07-01 15:55:23

标签: processing

我目前正在制作一个处理草图,其中包含一个非常基本的重力模拟(基于Daniel Schiffman的书“学习处理”中给出的一个例子),但我的引力仍然以奇怪的方式表现,我不知道是什么要做的。这是我能提出的最简单的例子:

float x = 50;
float y = 50;

float speed = 2;
float gravity = 0.1;

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

void draw() {
  background(255);

  fill(175);
  stroke(0);
  ellipseMode(CENTER);
  ellipse(x, y, 10, 10);

  y = y + speed;
  speed = speed + gravity;

//Dampening bounce effect when the ball hits bottom
  if (y > height) {
    speed = speed * -0.95;
  }
}

除了不同的起始速度和不同的窗口大小之外,上述几乎与Schiffman的书中的相同。它似乎在前两次反弹时工作正常,但在第三次反弹时,球会粘在窗户的底部。

我不知道在哪里开始尝试调试它。任何人都可以提供任何指示吗?

2 个答案:

答案 0 :(得分:2)

如果y仍然大于height,那么您的代码只会一遍又一遍地翻转speed,而不会让球有机会反弹。你希望球在边界处或越过边界时远离边界。

答案 1 :(得分:1)

在(如果y>高度)块中将y设置为高度有帮助,但球永远不会“休息”(完成后坐在底线上)。
Shiffman的例子5.9有两个问题,这是你可能开始的地方:
1)y可以变得大于(高度+速度),这使得它似乎在地面上砰的一声或猛烈地反弹
   - 修改建议
2)更新y的算法以错误的顺序执行,因此球永远不会停下来 正确的顺序是:

  • 如果是时候“反弹”了
    • 否定速度,包括阻尼(* 0.95)
    • 将y设置为“地面”的位置
  • 将重力加到速度上
  • 为y
  • 添加速度

这样,当它是时候反弹(y是>高度),速度是正向(向下)时:
   速度设定为负(减少次数)
   y设置为高度
   速度因重力因子而设定为负值    通过加上(仍然是负的)速度使得y变得不那么正

在我的例子中,我不希望对象消失,因此我使用名为'limit'的变量作为对象中心的最低(最正y)位置。

float x = 50;
float y = 50;

float speed = 2;
float gravity = 0.1;

void setup() {
  size(400, 400);
  y = height - 20;  
}

void draw() {
  background(255);

  fill(175);
  stroke(0);
  ellipseMode(CENTER);
  ellipse(x, y, 10, 10);

  float limit = height - (speed + 5);

//Dampening bounce effect when the ball hits bottom
  if (y > limit) {
    speed = speed * -0.95;
    y = limit;
  }
  speed = speed + gravity;
  y = y + speed;
}