我正在使用threejs开发CAD类型系统。我在其他物体旁边有薄物体(想象一下,以米为单位的固定在建筑物上的柱子上的薄2mm金属板)。当我放大时,一切看起来都很好。对象根本不相交。随着我缩小对象变得越来越小,我最终得到了帖子对象“闪烁”的情况。当我旋转它时,金属板对象(通过显示)。
我理解我正在使用的小数字会导致这种影响。但是,有没有办法设置一个优先级,使一个对象(金属板)比另一个对象(帖子)更重要,所以它不会产生那种效果?
答案 0 :(得分:0)
这称为z-fighting,其中两个片段在给定的深度空间中如此接近,以至于它们的z值在误差范围内,它们的真实深度可能会被反转。
解决此问题的最简单方法是减小深度缓冲区的比例。这由near
上的far
和camera
属性控制。您需要使用这些值来确定哪种方法最适合您的senario。如果你可以最小化飞机之间的距离,你将有更好的运气避免z战斗。
例如,如果(作为宽松估计)整个模型的边界球体的直径为100
,则near
和far
之间的距离只需{100
1}}。但是,它们的值被设置为相机空间的距离。因此,当您缩小并且相机移动得更远时,您应该调整值以保持它们之间的最小距离。如果您的相机位于z = 100
,请设置near = 50
和far = 150
。将相机拉回z = 250
时,请更新near = 200
和far = 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)