THREE.JS:以正确的z-indicies渲染大而远的物体,并仍然可以放大小物体

时间:2015-06-29 18:18:24

标签: three.js physics zbuffer

我有一个场景,我正在绘制(缩放)地球,月球和一些太空船。当月亮被地球遮挡,而不是消失时,它仍然是可见的(通过地球)。

从我的research我发现问题的一部分是我的相机的近设置太小了,正如文章中所详述的那样,z值排序中的近似原因的小值变得混乱对于非常遥远的物体。

这里的复杂性是我需要在相机放大时获得精细的粒度z指数,以查看航天器(与地球相比,半径最多为61米的物体,称重在r =~ 6.5e+06 meters)。为了使月球和地球上的物体以正确的顺序渲染,近处必须至少有100,000米,此时我无法看到近处物体。

一种解决方案是减少使用公里数的规模,但我不能失去这种精度,并且更喜欢使用米。

关于如何制作非常大的远距离物体的任何想法都会在正确的z指数上渲染,同时保留比例和放大小物体的能力?

我的想法(我不知道如何实施):

  • 更改z-buffer以包含更多值和更高分辨率?
  • 将远处的物体添加到使用“farCamera”渲染的“farScene”,该“farCamera”由特写镜头上使用的相同控件控制?

2 个答案:

答案 0 :(得分:4)

根据@WestLangley的回答,解决方案只是将选项logarithmicDepthBuffer: true添加到渲染器:

this.renderer = new THREE.WebGLRenderer({antialias: true, logarithmicDepthBuffer: true});

答案 1 :(得分:0)

问题可能是z-test而不是z-precision。这意味着:z-test不适用(可能因为您使用alpha混合渲染透明对象)或z-test适用于非默认测试(例如覆盖远而不是近距离)。

尝试使用没有透明度的简单着色器渲染整个场景,以确保透明度不是错误的来源。 要在没有z-test的情况下解决z顺序,你应该在每一帧中自己对对象进行排序,以确定渲染的顺序(从远到近)。