我正在努力学习Verlet整合,主要是因为我很无聊,并且想要为我正常的“弹跳球”学习练习增添趣味。
我在http://sandbox.electricgrey.com:8080/physics/有一个简单的弹跳球Canvas / HTML5页面。如果你点击它,你会注意到球并不总是弹回到相同的高度。有时它更高,有时更低。为什么这样做?
是因为我太简单了吗?我是否真的需要计算部分时间步数,以便我准确地确定球碰撞的时间/地点,然后从那里继续?
PS:如果您对我的HTML或Javascript有任何意见,我很乐意听到他们的意见。我正在学习如何使用Javascript进行编码,我想确保我正在使用The Right Way™。
答案 0 :(得分:1)
在Verlet算法中,最重要的是计算下一步所需的时间步。使用Verlet算法:Basic或Velocity?你对地板碰撞的想法是什么?我可以看到每次碰撞点都不在同一高度。在这种情况下,你必须计算碰撞时间(t1)与t1一起移动,进行碰撞然后随时间移动(t_step -t1)。我在this model
的第一次实现中使用此方法答案 1 :(得分:0)
Asar说你可能需要改变步长。尝试类似下面的内容,看看你是否可以通过改变t来解决问题。
function Vertex(x,y,vx,vy,t) {
this.t = t
this.x = x;
this.y = y;
this.px = x-vx*t;
this.py = y-vy*t;
.......
this.tick = function() {
....
var tx = this.x;
var ty = this.y;
this.x = this.x + (this.x - this.px) + this.ax * this.t;
this.y = this.y + (this.y - this.py) + this.ay * this.t;
....
}
....
}
你也可以通过改变以下方法来获得一定的准确性,当球撞到地板时,它可以反转球的速度。
if (this.y < this.r) {
this.y = 2 * this.r - this.y;
this.py = 2 * this.r - this.py;
}
如果球在时间步的中间反弹,那么它在时间步的第一部分期间沿着重力方向行进,但是它在时间步的最后部分期间远离重力行进。这两项贡献应该在一定程度上相互抵消。但是在你的代码中你假设引力在整个时间步过程中将球拉向前方。您可以通过更改上述方法中的公式来包含一个包含“this.ax * this.t”的术语来解决此错误。 (但我不完全确定这个术语应该如何看待。)
调试这样的程序的最佳方法是绘制一个图表,其中您在x轴上有时间,在y轴上有总机械能。然后,您可以轻松确定在弹跳期间或正常时间步过程中是否失去能量。