处理弹跳球(弹性碰撞)的JS模拟



我写了一个程序,显示球掉落,一旦落地就会反弹。有时当它反弹时,它没有达到其初始高度。这是一个JS小提琴来说明我的意思:

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日编辑:我更仔细地检查了向报告类似问题的其他人提供的解决方案,但他们没有解决我的问题。上面的代码与小提琴中的代码不同,但我认为它们本质上大致相同。

一个简单的"修复"是让你的弹跳更加"对称":

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

对于更可靠的方法,您应该使用更复杂的积分器来更新速度和力的速度。

最新更新