我可以在THREE.js中提高矢量精度吗?

时间:2014-10-28 09:44:05

标签: three.js precision shake largenumber jitter

在THREE.js中,我偶尔会发现自己希望更好地控制矢量精度,尤其是在使用大型浮标时,例如在太阳系中。有没有办法做到这一点?

在链接示例中,我正在构建一个简单的太阳系,其中包含行星大小和距离的实际数字。为了模拟轨道,整个系统在位于行星位置的枢轴上旋转。当摄像机靠近行星的地平线时,沿着边缘会出现位置抖动。

我可以增加应用于pivot对象及其子对象的旋转精度,这样这种抖动就不那么明显了吗?或者我只需要使用较小范围的数字?

http://jsfiddle.net/Angrypickle/5zs8eLoj/72/

当较小的数字用于以下向量时,抖动似乎减少了。

sun.position.set( 50000000, 0, 0 );
planet.position.set( -50000000, 0, 0 );

1 个答案:

答案 0 :(得分:2)

经过大量研究,对问题的简短回答"我可以提高THREE.js中的矢量精度吗?是的,但它是一个先进的主题。

答案很长:增加Vector精度基本上意味着增加JavaScript Number精度,因为Vector中的x,y,z和w值是常规JavaScript数。

增加数字精度需要考虑" epsilon"这是对计算中潜在错误的测量。有关说明和可能的解决方案,请参阅:http://mathjs.org/docs/datatypes/numbers.html。 Epsilon存在于JavaScript数学中,因为Numbers的存储限制为64位。

关于在不同距离处给予3D对象的精度,您可以使用对数深度缓冲区来改善对象深度(或Z索引)的处理方式。它不是人们所预期的线性。这是处理近距离和远距离需要良好分辨率的场景的好方法。

如果您决定实施此解决方案,这里有两个好的起点。参见:

stackoverflow: Logarithmic Depth Buffer OpenGL

Outerra: Maximizing Depth Buffer Range and Precision

我最初问过这个问题是因为我看到&#34;摇晃&#34;或者&#34;抖动&#34;在我的对象&#39;使用您在太阳系中找到的数字范围时的位置。由于所涉及的工作,我不想缩小我的数字,因此我将此作为解决方案进行了调查。我努力的最终结果是知道,为了我的太阳系在THREE.js中的目的,我可以在物体之间使用的距离有限制。由于我的几何形状,我不能使用大于6位有效数字的距离,这意味着例如水星的通常轨道半径为5790万公里必须缩小到57.9万公里,这意味着太阳将<强>更多更接近和更大,并且需要自我扩展,等等。基本上,为了获得可靠的定位,我的太阳系直径只有999,999公里。