跳转到内容

OpenSCAD 用户手册/CSG 建模

来自维基教科书,开放世界中的开放书籍

布尔运算概述

[编辑 | 编辑源代码]
二维示例
[编辑 | 编辑源代码]
 union()       {square(10);circle(10);} // square or  circle
 difference()  {square(10);circle(10);} // square and not circle
 difference()  {circle(10);square(10);} // circle and not square
 intersection(){square(10);circle(10);} // square and circle
三维示例
[编辑 | 编辑源代码]
 union()       {cube(12, center=true); sphere(8);} // cube or  sphere
 difference()  {cube(12, center=true); sphere(8);} // cube and not sphere
 difference()  {sphere(8); cube(12, center=true);} // sphere and not cube
 intersection(){cube(12, center=true); sphere(8);} // cube and sphere

创建其所有子节点的并集。这是所有子节点的总和(逻辑)。
可以与二维或三维对象一起使用,但不要混合使用。

Union

 //Usage example:
 union() {
 	cylinder (h = 4, r=1, center = true, $fn=100);
 	rotate ([90,0,0]) cylinder (h = 4, r=0.9, center = true, $fn=100);
 }

注意:当不使用时,并集是隐式的。但是,例如,在差集中,它必须存在以将第一个子节点分组为一个。

注意:对于所有并集,无论是显式还是隐式,都必须保证要合并的外部面不重合。如果不遵循此规则,会导致设计行为不确定,并且可能导致渲染结果不是流形(具有零体积部分或部分朝内),通常会导致警告,有时会从渲染输出中删除设计的一部分。(这也可能导致 预览期间的闪烁效应。)此要求不是错误,而是浮点数比较的固有属性,以及无法精确表示诸如大多数旋转产生的无理数之类的基本属性。例如,这是一个无效的 OpenSCAD 程序,至少会导致大多数平台上的警告

 // Invalid!
 size = 10;
 rotation = 17;
 union() {
    rotate([rotation, 0, 0])
       cube(size);
    rotate([rotation, 0, 0])
       translate([0, 0, size])
       cube([2, 3, 4]);
 }

解决方案是在合并相邻面时始终使用一个小值,称为 epsilon,以保证重叠。请注意,在两个位置使用的 0.01 eps 值,因此外部结果等效于预期结果

 // Correct!
 size = 10;
 rotation = 17;
 eps = 0.01;
 union() {
    rotate([rotation, 0, 0])
       cube(size);
    rotate([rotation, 0, 0])
       translate([0, 0, size-eps])
       cube([2, 3, 4+eps]);
 }

从第一个子节点中减去第二个(以及所有后续)子节点(逻辑且非)。
可以与二维或三维对象一起使用,但不要混合使用。

Difference

Usage example:
difference() {
	cylinder (h = 4, r=1, center = true, $fn=100);
	rotate ([90,0,0]) cylinder (h = 4, r=0.9, center = true, $fn=100);
}

注意:差集操作中要删除的表面必须重叠,并且要删除的负面部分必须完全延伸到要删除该表面的体积之外。如果不遵循此规则,可能会导致 预览伪影,并且可能导致非流形渲染警告或从渲染输出中删除部分。有关此要求的原因以及如何通过使用一个小 epsilon 值来实现此要求的示例,请参阅上述并集部分中的描述。

具有多个子节点的差集
[编辑 | 编辑源代码]

注意,在第二个示例中,添加第一个和第二个子节点的并集的结果。

// Usage example for difference of multiple children:
$fn=90;
difference(){
                                            cylinder(r=5,h=20,center=true);
    rotate([00,140,-45]) color("LightBlue") cylinder(r=2,h=25,center=true);
    rotate([00,40,-50])                     cylinder(r=2,h=30,center=true);
    translate([0,0,-10])rotate([00,40,-50]) cylinder(r=1.4,h=30,center=true);
}
   
// second instance with added union
translate([10,10,0]){
    difference(){
      union(){        // combine 1st and 2nd children
                                                cylinder(r=5,h=20,center=true);
        rotate([00,140,-45]) color("LightBlue") cylinder(r=2,h=25,center=true);
      }
      rotate([00,40,-50])                       cylinder(r=2,h=30,center=true);
      translate([0,0,-10])rotate([00,40,-50])   cylinder(r=1.4,h=30,center=true);
    }
}

创建所有子节点的交集。这保留了重叠部分(逻辑)。
只有所有子节点共有的或共享的区域被保留。
可以与二维或三维对象一起使用,但不要混合使用。

Intersection

//Usage example:
intersection() {
	cylinder (h = 4, r=1, center = true, $fn=100);
	rotate ([90,0,0]) cylinder (h = 4, r=0.9, center = true, $fn=100);
}


警告:使用渲染,始终计算此树的 CSG 模型(即使在 OpenCSG 预览模式下)。这会使预览速度非常慢,并且 OpenSCAD 似乎会挂起/冻结。

Usage example:
render(convexity = 1) { ... }
凸性 整数。凸性参数指定与对象相交的光线可能穿过的前后面的最大数量。此参数仅用于在 OpenCSG 预览模式下正确显示对象,对多面体渲染没有影响。


此图像显示了一个凸性为 4 的二维形状,因为以红色表示的光线最多与二维形状相交 4 次。三维形状的凸性将以类似的方式确定。将其设置为 10 对于大多数情况应该可以正常工作。

华夏公益教科书