可能在Threejs中优先绘制对象?

时间:2018-05-23 06:03:52

标签: three.js

我正在使用threejs开发CAD类型系统。我在其他物体旁边有薄物体(想象一下,以米为单位的固定在建筑物上的柱子上的薄2mm金属板)。当我放大时,一切看起来都很好。对象根本不相交。随着我缩小对象变得越来越小,我最终得到了帖子对象“闪烁”的情况。当我旋转它时,金属板对象(通过显示)。

我理解我正在使用的小数字会导致这种影响。但是,有没有办法设置一个优先级,使一个对象(金属板)比另一个对象(帖子)更重要,所以它不会产生那种效果?

2 个答案:

答案 0 :(得分:0)

这称为z-fighting,其中两个片段在给定的深度空间中如此接近,以至于它们的z值在误差范围内,它们的真实深度可能会被反转。

解决此问题的最简单方法是减小深度缓冲区的比例。这由near上的farcamera属性控制。您需要使用这些值来确定哪种方法最适合您的senario。如果你可以最小化飞机之间的距离,你将有更好的运气避免z战斗。

例如,如果(作为宽松估计)整个模型的边界球体的直径为100,则nearfar之间的距离只需{100 1}}。但是,它们的值被设置为相机空间的距离。因此,当您缩小并且相机移动得更远时,您应该调整值以保持它们之间的最小距离。如果您的相机位于z = 100,请设置near = 50far = 150。将相机拉回z = 250时,请更新near = 200far = 300

另一种选择是使用WebGLRenderer.logarithmicDepthBuffer选项。 (example

编辑:还有另一个原因:形状的面实际上是共面的。如果两个三角形占据相同的空间,那么你几乎可以保证z战斗。

简单的解决方案是移动其中一个组件,使面不再是共面的。您还可以将polygonOffset应用于钣金材料,但您的用例听起来并不合适。

答案 1 :(得分:0)

要回答标题中的问题,可以优先使用。

绘制订单
myMesh.renderOrder = 5
myOtherMesh.renderOrder = 7

然后可以应用不同的深度效果,关闭测试等。

另一种方法是使用图层对象进行分组。在相机上设置适当的图层蒙版,然后渲染(多次)。

myMesh.layers.set(5)

camera.layers.set(1)
renderer.render(scene,camera)
camera.layers.set(5)
renderer.render(scene,camera)