如何在 JavaScript 中计算给定加速度的速度和位移?

Posted

技术标签:

【中文标题】如何在 JavaScript 中计算给定加速度的速度和位移?【英文标题】:How to compute velocity and displacement for a given acceleration in JavaScript? 【发布时间】:2021-04-19 08:49:40 【问题描述】:

我有一个以 m/s^2 为单位的加速度值和时间戳的 JSON 文件。另一方面,我有一个可以根据输入值平移和旋转的 threeJS 网格。现在我想将速度和位移传递给网格,使其加速和减速并渲染这些运动。 目前我计算速度和位移并将它们存储在一个数组中,但在实时设置中我不想将值存储在一个数组中以防止内存过载,因此,我只想使用最后的加速度读数进行测量。我不确定是否有可以进行集成的 JS API,但我正在尝试实现下面的公式,但它没有按预期工作。

const previousVelocity = initialVelocity + ((currentAcceleration + previousAcceleration)/2)*(currentTime - previousTime)

const currentVelocity  = previousVelocity + ((currentAcceleration + previousAcceleration)/2)*(currentTime - previousTime)

const disp             = initialDisplacement + ((previousVelocity + currentVelocity)/2)*(currentTime - previousTime)

以下是我的 JSON 文件示例:

[
    
        "time": 0,
        "acc": 0.11,
        "vel": 0,
        "disp": 0
    ,
    
        "time": 86400,
        "acc": 0.11,
        "vel": 0.11,
        "disp": 0.055
    ,
    
        "time": 172800,
        "acc": 0.11,
        "vel": 0.22,
        "disp": 0.22
    ,
    
        "time": 259200,
        "acc": 0.11,
        "vel": 0.33,
        "disp": 0.495
    ,
    
        "time": 345600,
        "acc": 0.35,
        "vel": 0.56,
        "disp": 0.9400000000000001
    
]

这就是我在渲染函数中访问加速度的方式:

更多分类:这里我已经在excel中计算了速度和分布,然后将它们解析为JSON文件,但理想情况下我只想使用加速度值并直接在JS中实现公式,而不将任何内容存储在数组中。

function render(dt) 
    dt *= 0.8 // in seconds
    time += dt
    while (data[currentIndex].time < time) 
        currentIndex++
        if (currentIndex >= data.length) return
    
    console.log(currentIndex);
    const acc,vel,disp = data[currentIndex]

    document.querySelector("#disp").textContent = disp.toFixed(2);
    object.position.y = disp*0.07; // z for rightLeft, y for upDown

    var relativeCameraOffset = new THREE.Vector3 (5,0,0); // change camera offset
    var cameraOffset = relativeCameraOffset.applyMatrix4( object.matrixWorld );
    camera.position.x = cameraOffset.x;
    camera.position.y = cameraOffset.y;
    camera.position.z = cameraOffset.z;
    camera.lookAt( object.position );

    resizeToClient();
    renderer.render(scene, camera);
    requestAnimationFrame(render);

如何在 javascript 中实现它?

【问题讨论】:

您的运动是否限制在一个维度上,沿着其中一个轴? 是只有一个轴 我建议您查看 requestAnimationFrame 的文档,以及如何使用时间增量正确进行与帧速率无关的物理计算。 developer.mozilla.org/en-US/docs/Web/API/window/… 此外,您应该能够只保留一个可变速度,在更新位移后每帧更新一次,乘以增量。那么,就不需要表格了。 感谢您的建议,现在去看看。我还发布了一个与此相关的新线程,因为我想直接在 javascript ***.com/questions/67162136/… 中实现方程式 【参考方案1】:

通常,加速度来自力和质量。假设力由THREE.Vector3 的实例定义,加速度通过以下方式计算:

acceleration.copy( force ).divideScalar( mass );

注意accelerationTHREE.Vector3 的一个实例,因为力是一个向量(它有一个大小方向)。

给定加速度,您可以这样计算速度:

velocity.add( acceleration.multiplyScalar( delta ) );

velocity 随时间随加速度进行调制。由于您在每个模拟步骤中计算此值,因此在特定时间范围内遵守加速度量很重要(这就是您使用时间增量值的原因)。

在下一步中,计算displacement 向量,然后将其添加到 3D 对象的位置:

displacement.copy( velocity ).multiplyScalar( delta );
object.position.copy( displacement );

【讨论】:

当您说力是由 THREE.Vector3 的实例定义时,在这种情况下如何获得力和质量值?我以前从未使用过它们 好吧,mass 是你为你的对象定义的东西(例如,它可能是 1 公斤)。力的计算主要取决于对象在 3D 空间中的转向方式。假设您有一个目标位置,并且只想寻找它,请使用 github.com/Mugen87/yuka/blob/… 之类的内容。 鉴于我已经有了加速度值,我还需要力和质量吗?我可以通过velocity.add().. 如果是向量,是的。 我会试着从你的例子中找出一些东西,我仍然是 three.js 的初学者,所以事情对我来说并不是很明显,但我会更深入地挖掘

以上是关于如何在 JavaScript 中计算给定加速度的速度和位移?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算给定波的频率和时间

volatile原理

Javascript如何实现GPU加速?

如何在Javascript中找到两个日期之间的给定天数? [复制]

计算加速度给定速度

根据速度和网格计算减速度