1

在此处输入图像描述

我知道 javascript 舍入错误相当棘手,但我想要一些建议。

减轻我的应用程序舍入误差的最佳方法是什么?我有一个立方体,应该是围绕一个大质量的轨道。立方体在每个轨道上都会获得大量的轨道动量,并且最终将在没有任何干预的情况下达到逃逸速度。

我需要一种轻量级的方法来防止这种情况发生。

我最好的选择是尝试找到一种方法来修复我的数字,还是我会更好地使用基于逻辑假设的错误纠正,即应该在哪里捏造它并将其放回它所属的位置?

我的物理功能在这里:

function physPosition(object, delta){
// Update Position
object.position.x += (object.velocity.x * delta) + (0.5*object.acceleration.x*   (Math.pow(delta,2)));
object.position.y += (object.velocity.y * delta) + (0.5*object.acceleration.y*(Math.pow(delta,2)));
object.position.z += (object.velocity.z * delta) + (0.5*object.acceleration.z*(Math.pow(delta,2)));

// Update Velocity (acceleration)
object.velocity.x += object.acceleration.x * delta;
object.velocity.y += object.acceleration.y * delta;
object.velocity.z += object.acceleration.z * delta;

// Update Velocity (gravity)
object.velocity.x += object.gravity.x * delta;
object.velocity.y += object.gravity.y * delta;
object.velocity.z += object.gravity.z * delta;

// Update Rotation
object.rotation.x += object.spin.x * delta; 
object.rotation.y += object.spin.y * delta; 
object.rotation.z += object.spin.z * delta; 
}

function physGravity(a, b){ var grav = new THREE.Vector3(0, 0, 0); grav = grav.subVectors(a.position, b.position); var r = grav.lengthSq(); var A = (G)*(b.mass)/(r); grav = grav.normalize(); grav.multiplyScalar(-A); a.gravity = grav; }

4

2 回答 2

2

您正在尝试对运动方程进行数值积分。这是一个有效的解决方案——另一个是计算运动方程的解析解,正如 Derek 所建议的那样。问题是,您需要一个比您现在使用的解决方案更好的集成器。你应该尝试学习数值积分。特别是,我会推荐Runge-Kutta 方法,因为它们易于实现和使用。

您还可以找到一个包含数值积分方法的 JavaScript 库,并使用这些方法而不是自己实现。这里有一个带有四阶 Runge-Kutta 方法的示例,并且Numeric JavaScript 库包含一个名为dopri.

于 2014-08-29T06:56:32.907 回答
0

虽然 Derek 的评论是有道理的——如果可以的话,让所有函数参数化而不是微分——有时你不能真正做到这一点,或者不容易做到这一点。使用您的代码,另一种可能性(不确定有多现实)是尝试自己使用分数来降低错误,而不是依赖浮点算术,因为您没有任何不利于分数的公式(如平方根) .

实现自己的分数运算,始终保持分子和分母分开,并且仅在绝对需要时才除以计算点的坐标。这应该:提高精度,因为你有双倍的可用位数;此外,浮点错误主要来自无法以基数 2 表示的事物,但您可以拥有与 JavaScript 允许的整数一样多的事物。您可能需要不时对分子和分母进行归一化,因为它们可能会超出范围,这将重新引入一些错误,但不像使用普通浮点算术那样在每个除法时那样频繁。

显然,它也会让你慢一点,但 JavaScript 的计算速度相当快。

于 2014-08-29T08:31:49.907 回答