据我所知,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;
}
答案 0 :(得分:2)
您正在尝试对运动方程进行数值积分。这是一个有效的解决方案 - 另一个是计算运动方程的解析解,正如Derek所建议的那样。问题是,您需要一个比现在使用的解决方案更好的集成商。您应该尝试了解numerical integration。特别是,我建议使用Runge-Kutta methods,因为它们易于实现和使用。
您还可以找到包含数字集成方法的JavaScript库,并使用它们而不是实现自己的方法。有一个带有四阶Runge-Kutta方法的here示例,而Numeric JavaScript library包含一个名为dopri
的Dormand-Prince积分器。
答案 1 :(得分:0)
虽然德里克的评论是有道理的 - 如果你可以而不是差别,那么所有功能都是参数化的 - 有时候你可以做到这一点,或者不容易。使用您的代码,另一种可能性(不确定多么现实)是尝试使用分数来保持错误,而不是依赖浮点运算,因为您没有任何对分数有害的公式(如square根)。
实现自己的分数算术,始终将分子和分母分开,并且只在绝对需要时才进行除法,以便计算点的坐标。这应该:增加精度,因为你有两倍的可用位数;另外,浮点错误主要来自基数2中无法表示的事物,但是你可以像JavaScript一样拥有整数。你可能需要不时地对分子和分母进行归一化,因为它们有可能超出范围,这将重新引入一些错误,但是比使用普通浮点运算的每个除法频率更低。
显然,它也会减慢你的速度,但JavaScript的计算速度非常快。