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
创建其所有子节点的并集。这是所有子节点的总和(逻辑或)。
可以与二维或三维对象一起使用,但不要混合使用。
//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]);
}
从第一个子节点中减去第二个(以及所有后续)子节点(逻辑且非)。
可以与二维或三维对象一起使用,但不要混合使用。
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);
}
}
创建所有子节点的交集。这保留了重叠部分(逻辑且)。
只有所有子节点共有的或共享的区域被保留。
可以与二维或三维对象一起使用,但不要混合使用。
//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 对于大多数情况应该可以正常工作。