Three.js 是否可以优先绘制三个JS中的对象?

Three.js 是否可以优先绘制三个JS中的对象?,three.js,Three.js,我正在使用threejs开发一个CAD类型的系统。我在其他物体旁边有很薄的物体(想想固定在建筑物柱子上的2毫米薄金属板,以米为单位)。当我放大时,一切看起来都很好。这些对象根本不相交。当我缩小物体时,物体变小了,当我旋转金属板物体时,柱状物体会“闪烁”(有点透光) 我知道是我处理的小数字造成了这种影响。但是,有没有办法设置优先级,使一个对象(金属板)比另一个对象(柱)更重要,这样它就不会得到那种效果?这就是所谓的,两个碎片在给定的深度空间中如此接近,以至于它们的z值在误差范围内,以至于它们的真实

我正在使用threejs开发一个CAD类型的系统。我在其他物体旁边有很薄的物体(想想固定在建筑物柱子上的2毫米薄金属板,以米为单位)。当我放大时,一切看起来都很好。这些对象根本不相交。当我缩小物体时,物体变小了,当我旋转金属板物体时,柱状物体会“闪烁”(有点透光)

我知道是我处理的小数字造成了这种影响。但是,有没有办法设置优先级,使一个对象(金属板)比另一个对象(柱)更重要,这样它就不会得到那种效果?

这就是所谓的,两个碎片在给定的深度空间中如此接近,以至于它们的z值在误差范围内,以至于它们的真实深度可能会反转

解决这个问题的最简单方法是减小深度缓冲区的比例。这由
相机上的
属性控制。你需要运用这些价值观来确定什么最适合你的senario。如果你能将飞机之间的距离减到最小,你将有更好的运气避免z-战斗

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

另一个选项是使用该选项。()

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


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

要回答标题中的问题,可以使用以下选项对绘图顺序进行优先级排序

myMesh.renderOrder = 5
myOtherMesh.renderOrder = 7
然后可以应用不同的深度效果,关闭测试等

另一种方法是使用、层对对象进行分组。在摄影机上设置适当的层遮罩,然后渲染(多次)


查看并尝试增加你的近平面的值。我确实读到了。我从近/远o 0.1/100开始。我将一个单位视为1米,并将事物精确到毫米,有效地将小数点后3位。我已将近/远更改为1/50,并且仍然具有类似的效果。我不会想到这些值需要对数深度缓冲区。我确实试过了,但没有使它变得更好。@Jeff软件结果:你使用的是正交照相机吗?对数深度缓冲区实际上只适用于透视相机。我已经添加了更多的信息,说明了是什么导致了z-fighting,即使你正确使用了对数深度缓冲区。使用透视相机。我认为问题在于我试图在大型物品(椽子)旁边画出非常薄的材料(金属板)——不是完全共面的,而是很近的。当我缩小时,细的部分几乎是透明的,而大的物体“发光”通过。我已经尝试过将挡板对象从椽子对象偏移,这只是一种帮助。我不能太多地抵消它们,因为当我放大时,它看起来不正确,使床单从椽子上漂走。如果有机会,我会尝试使用polygonOffset,看看它是否有帮助。0.1 as near仍然会将大部分精度拉向近平面。即使试着用像1这样的东西也会有帮助。@pailhead我想我没有把这一点讲清楚。我会添加更多细节。渲染器我已经尝试过了,没有任何区别。第一层我得试试。以前从未见过这种方法。只是重新安排事情实际上不会有帮助。但是,您可以尝试在没有深度测试的情况下绘制某些东西,例如。不看场景很难判断。抱歉,这实际上并不能解决您的问题,但如果您找到一个依赖于特定渲染顺序的解决方案,您可以使用three.js控制它
myMesh.layers.set(5)

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