如何防止 OpenSCAD 中的 z-fighting?

3D打印 opencad
2021-05-16 06:07:09

Z-fighting是共面表面的 3D 渲染工件(意思是,三角形位于完全相同的平面上并相互重叠)。

在 OpenSCAD 的预览模式下执行difference()union()操作时可能会发生这种情况在 的情况下difference(),渲染伪像可以防止看到对象中的孔。OpenSCAD 中的“编译和渲染”模式没有 z-fighting 问题。但是由于在该模式下渲染对象可能需要一些时间,因此在开发过程中这不是一个实用的解决方案。

如何最好地避免 z-fighting?

如果答案涉及更改我的 OpenSCAD 代码,我很乐意看到 OpenSCAD 编码器的惯用答案/既定约定(如果存在)。

1个回答

OpenSCAD 社区的一般建议是“扩展您的切割并嵌入您的连接”(来源)。渲染工件是一回事,而只是一种烦恼;然而,z-fighting 也会在 STL 导出期间导致意外错误(我自己到目前为止还没有遇到过,只是在某处阅读)。

因此,您可以非常轻微地更改对象的尺寸(0.01mm 工作正常),以便:

  • 对于 a union(),零件之间存在重叠量
  • 对于 a difference(),相交部分在相交部分的内部和外部都有体积

现在,您可以调整零件的尺寸位置,以保持最终零件的数学精确尺寸。但我发现对于 3D 打印而言,这样的精度并不值得,因为它使公式变得如此复杂。

相反,我调整或者部分的位置或大小,这取决于在每种情况下简单。最终设计中的测量值将偏离 0.01 毫米,这无关紧要。

我将 0.01 毫米的偏移量保存在一个名为nothing(在某处找到并喜欢它......)的变量中这样可以直观地理解计算。

例子

要创建一个圆柱体并将孔切到其深度的一半,我会这样做:

//!OpenSCAD
nothing=0.01;
height=40;

difference(){
    cylinder(h=height, r=20, center=true);

    translate([0, 0, height/4 + nothing]) 
        cylinder(h=height/2, r=15, center=true);
}

现在这个孔nothing=0.01比圆柱体的一半浅——这是我接受的不准确之处。

(注意:如果您没有安装 OpenSCAD,您也可以通过复制粘贴到OpenJSCAD在线尝试上面的代码。在第一行包含魔术注释以将其切换为 OpenSCAD 语法。)