【问题标题】:Verlet integration bouncingVerlet 集成弹跳
【发布时间】:2011-05-02 17:13:49
【问题描述】:

我正在尝试学习 Verlet 集成,主要是因为我很无聊,并且想为我正常的“弹跳球”学习练习增添趣味。

我在http://sandbox.electricgrey.com:8080/physics/ 有一个简单的弹跳球 Canvas/HTML5 页面。如果单击它,您会注意到球并不总是弹回相同的高度。有时它更高,有时它更低。为什么要这样做?

是不是因为我把它简化得太多了?我真的需要计算部分时间步长,以便准确了解球碰撞的时间/地点,然后从那里继续吗?

PS:如果您对我的 HTML 或 Javascript 有任何意见,我很想听听。我只是在学习如何使用 Javascript 进行编码,并且我想确保我使用的是正确的方式™。

【问题讨论】:

  • 你真的不应该使用const 来声明常量。请参阅:developer.mozilla.org/en/JavaScript/Reference/Statements/const,具体来说,“const 是一个Mozilla 特定的扩展程序,它不受 IE 支持,但自 9.0 版和 Safari 起已被 Opera 部分支持。”
  • 感谢您的提示。我将代码更改为不使用 const。
  • 现在链接好像失效了。本来想看看你在说什么。
  • 对不起,@DrewNoakes,我认为这段代码早已不复存在。如果我再次找到它,我会在这里重新发布。

标签: javascript math simulation physics


【解决方案1】:

在 Verlet 算法中最重要的是计算下一步所采取的时间步长。您使用的 Verlet 算法:基本还是速度?你对与地板碰撞的想法是什么?我每次都能看到碰撞点不在同一高度。在这种情况下,您必须计算碰撞时间 (t1) 与 t1 一起移动,进行碰撞,然后随时间移动 (t_step - t1)。我在this model的第一个实现中使用了这个方法

【讨论】:

    【解决方案2】:

    正如 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 轴为总机械能。然后,您可以轻松确定您是在弹跳期间还是在正常时间步长期间失去能量。

    http://sandbox.electricgrey.com:8080/physics/physics.js

    【讨论】:

    • 感谢您的建议。我现在有点偏袒这个问题,但是当我回到碰撞响应时,我会记住这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 2013-05-23
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多