Javascript精确缓解

时间:2014-08-29 06:04:38

标签: javascript three.js game-physics orbital-mechanics

enter image description here

据我所知,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; }

2 个答案:

答案 0 :(得分:2)

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

您还可以找到包含数字集成方法的JavaScript库,并使用它们而不是实现自己的方法。有一个带有四阶Runge-Kutta方法的here示例,而Numeric JavaScript library包含一个名为dopri的Dormand-Prince积分器。

答案 1 :(得分:0)

虽然德里克的评论是有道理的 - 如果你可以而不是差别,那么所有功能都是参数化的 - 有时候你可以做到这一点,或者不容易。使用您的代码,另一种可能性(不确定多么现实)是尝试使用分数来保持错误,而不是依赖浮点运算,因为您没有任何对分数有害的公式(如square根)。

实现自己的分数算术,始终将分子和分母分开,并且只在绝对需要时才进行除法,以便计算点的坐标。这应该:增加精度,因为你有两倍的可用位数;另外,浮点错误主要来自基数2中无法表示的事物,但是你可以像JavaScript一样拥有整数。你可能需要不时地对分子和分母进行归一化,因为它们有可能超出范围,这将重新引入一些错误,但是比使用普通浮点运算的每个除法频率更低。

显然,它也会减慢你的速度,但JavaScript的计算速度非常快。