4

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

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

我可以提高应用于枢轴对象及其子对象的旋转精度,以使这种抖动不会那么明显吗?还是我只需要处理较小范围的数字?

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

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

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

1 回答 1

3

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

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

增加数字精度需要考虑“epsilon”,这是对计算中潜在错误的度量。有关描述和可能的解决方案,请参见:http ://mathjs.org/docs/datatypes/numbers.html。由于数字的 64 位存储限制,Epsilon 出现在 JavaScript 数学中。

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

如果您决定实施此解决方案,这里有 2 个不错的起点。看:

stackoverflow:对数深度缓冲区 OpenGL

Outerra:最大化深度缓冲范围和精度

我最初问这个问题是因为在使用太阳系中的数字范围时,我看到我的物体位置出现“抖动”或“抖动”。由于涉及的工作,我不想缩小我的人数,所以我研究了这个作为解决方案。我努力的最终结果是,对于我在 THREE.js 中的太阳系的目的,我可以使用的对象之间的距离是有限的。由于我的几何学,我不能使用大于 6 位有效数字的距离,这意味着例如水星通常的轨道半径 5790 万公里必须缩小到 5790 万公里,这意味着太阳将越来越大,并且需要缩放自身,等等。基本上,要获得可靠的定位,我的太阳系直径只能是999,999公里。

于 2014-10-31T03:51:09.843 回答