如何计算 JavaScript 中给定加速度的速度和位移?
How to compute velocity and displacement for a given acceleration in JavaScript?
我有一个 JSON 文件,其中包含 m/s^2 中的加速度值和时间戳。在另一端,我有一个根据输入值平移和旋转的 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 中实现它?
通常,加速度是从力和质量中推导出来的。假设力由 THREE.Vector3
的实例定义,加速度通过以下方式计算:
acceleration.copy( force ).divideScalar( mass );
请注意,acceleration
是 THREE.Vector3
的一个实例,因为力是矢量(它具有大小 和 方向)。
给定加速度,您可以像这样计算速度:
velocity.add( acceleration.multiplyScalar( delta ) );
velocity
随时间随加速度变化。由于您是按模拟步骤计算的,因此重要的是要遵守特定时间范围内的加速度(这就是您使用时间增量值的原因)。
在下一步中,计算 displacement
矢量,然后将其添加到 3D 对象的位置:
displacement.copy( velocity ).multiplyScalar( delta );
object.position.copy( displacement );
我有一个 JSON 文件,其中包含 m/s^2 中的加速度值和时间戳。在另一端,我有一个根据输入值平移和旋转的 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 中实现它?
通常,加速度是从力和质量中推导出来的。假设力由 THREE.Vector3
的实例定义,加速度通过以下方式计算:
acceleration.copy( force ).divideScalar( mass );
请注意,acceleration
是 THREE.Vector3
的一个实例,因为力是矢量(它具有大小 和 方向)。
给定加速度,您可以像这样计算速度:
velocity.add( acceleration.multiplyScalar( delta ) );
velocity
随时间随加速度变化。由于您是按模拟步骤计算的,因此重要的是要遵守特定时间范围内的加速度(这就是您使用时间增量值的原因)。
在下一步中,计算 displacement
矢量,然后将其添加到 3D 对象的位置:
displacement.copy( velocity ).multiplyScalar( delta );
object.position.copy( displacement );