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

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

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

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

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

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

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

最佳答案 经过大量的研究,对“我可以提高THREE.js中的矢量精度”这个问题的简短回答是肯定的,但它是一个先进的主题.

答案很长:增加矢量精度基本上意味着增加JavaScript数字精度,因为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

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

点赞