3D形状

目录

  1. 3D形状
    1. 基本形状 / Primitives
    2. 3D 立方体 / 3D Cubes
    3. 3D 圆柱 / 3D Cylinder
    4. 3D 球体 / 3D Spheres

基本形状 / Primitives

OpenSCAD 提供了三种内置的 3D 基本形状:cube()cylinder()sphere()
BOSL2 库对这些形状进行了扩展,并提供了替代方案,使其支持更多功能以及更简单的重新定位方式。

3D 立方体 / 3D Cubes

BOSL2 重写了内置的 cube() 模块。你仍然可以按照内置模块的方式使用它:

include <BOSL2/std.scad>
cube(100);
include <BOSL2/std.scad>
cube(100, center=true);
include <BOSL2/std.scad>
cube([50,40,20], center=true);

它还被增强,允许你对其进行锚定(anchor)、旋转(spin)、定向(orient)和附加(attach)。

你可以像在 rect()oval() 中使用 anchor= 一样使用它,不同之处在于,你还可以在 3D 中垂直锚定,从而支持锚定到面、边和角:

include <BOSL2/std.scad>
cube([50,40,20], anchor=BOTTOM);
include <BOSL2/std.scad>
cube([50,40,20], anchor=TOP+BACK);
include <BOSL2/std.scad>
cube([50,40,20], anchor=TOP+FRONT+LEFT);

你可以使用 spin= 参数在锚定后围绕 Z 轴旋转:

include <BOSL2/std.scad>
cube([50,40,20], anchor=FRONT, spin=30);

3D 对象还可以通过 orient= 参数指定一个向量,用于指向形状顶部应该旋转到的位置。

include <BOSL2/std.scad>
cube([50,40,20], orient=UP+BACK+RIGHT);

如果同时使用 anchor=spin=orient=,操作顺序是:先执行锚定(anchor),然后旋转(spin),最后定向(orient):

include <BOSL2/std.scad>
cube([50,40,20], anchor=FRONT);
include <BOSL2/std.scad>
cube([50,40,20], anchor=FRONT, spin=45);
include <BOSL2/std.scad>
cube([50,40,20], anchor=FRONT, spin=45, orient=UP+FWD+RIGHT);

BOSL2 提供了一个 cuboid() 模块,在 cube() 的基础上进行了扩展,增加了边缘圆角和斜切功能。你可以像使用 cube() 一样使用它,不同的是 cuboid() 默认是居中的。

你可以通过 rounding= 参数为边缘添加圆角:

include <BOSL2/std.scad>
cuboid([100,80,60], rounding=20);

同样地,你可以通过 chamfer= 参数对边缘进行斜切:

include <BOSL2/std.scad>
cuboid([100,80,60], chamfer=10);

你可以通过使用 edges= 参数仅对某些边进行圆角处理。该参数可以接受多种类型的值。如果传递的是指向某个面的向量,那么它将只对该面周围的边进行圆角处理:

include <BOSL2/std.scad>
cuboid([100,80,60], rounding=20, edges=TOP);
include <BOSL2/std.scad>
cuboid([100,80,60], rounding=20, edges=RIGHT);

如果你为 edges= 提供一个指向角的向量,它将对该角处交汇的所有边进行圆角处理:

include <BOSL2/std.scad>
cuboid([100,80,60], rounding=20, edges=RIGHT+FRONT+TOP);
include <BOSL2/std.scad>
cuboid([100,80,60], rounding=20, edges=LEFT+FRONT+TOP);

如果你为 edges= 提供一个指向某条边的向量,它将仅对那条边进行圆角处理:

include <BOSL2/std.scad>
cuboid([100,80,60], rounding=10, edges=FRONT+TOP);
include <BOSL2/std.scad>
cuboid([100,80,60], rounding=10, edges=RIGHT+FRONT);

如果你传递字符串 “X”、”Y” 或 “Z” 给 edges=,则所有与指定轴对齐的边都将被圆角处理:

include <BOSL2/std.scad>
cuboid([100,80,60], rounding=10, edges="X");
include <BOSL2/std.scad>
cuboid([100,80,60], rounding=10, edges="Y");
include <BOSL2/std.scad>
cuboid([100,80,60], rounding=10, edges="Z");

如果你提供一个边规格的列表给 edges=,则列表中引用的所有边都会被圆角处理:

include <BOSL2/std.scad>
cuboid([100,80,60], rounding=10, edges=[TOP,"Z",BOTTOM+RIGHT]);

edges= 的默认值是 EDGES_ALL,即对所有边进行圆角处理。你还可以使用 except_edges= 参数,指定不需要进行圆角处理的边:

include <BOSL2/std.scad>
cuboid([100,80,60], rounding=10, except_edges=BOTTOM+RIGHT);

你可以为 except_edges= 参数提供任何 edges= 参数支持的类型:

include <BOSL2/std.scad>
cuboid([100,80,60], rounding=10, except_edges=[BOTTOM,"Z",TOP+RIGHT]);

你可以同时使用 edges=except_edges=,以简化边的规格定义:

include <BOSL2/std.scad>
cuboid([100,80,60], rounding=10, edges=[TOP,FRONT], except_edges=TOP+FRONT);

你也可以用类似的方法指定需要斜切的边:

include <BOSL2/std.scad>
cuboid([100,80,60], chamfer=10, edges=[TOP,FRONT], except_edges=TOP+FRONT);

3D 圆柱 / 3D Cylinder

BOSL2 重写了内置的 cylinder() 模块。 你仍然可以按照内置模块的方式使用它:

include <BOSL2/std.scad>
cylinder(r=50,h=50);
include <BOSL2/std.scad>
cylinder(r=50,h=50,center=true);
include <BOSL2/std.scad>
cylinder(d=100,h=50,center=true);
include <BOSL2/std.scad>
cylinder(d1=100,d2=80,h=50,center=true);

你还可以像使用 cuboid() 模块一样,对其进行锚定(anchor)、旋转(spin)、定向(orient)和附加(attach):

include <BOSL2/std.scad>
cylinder(r=50, h=50, anchor=TOP+FRONT);
include <BOSL2/std.scad>
cylinder(r=50, h=50, anchor=BOTTOM+LEFT);
include <BOSL2/std.scad>
cylinder(r=50, h=50, anchor=BOTTOM+LEFT, spin=30);
include <BOSL2/std.scad>
cylinder(r=50, h=50, anchor=BOTTOM, orient=UP+BACK+RIGHT);

BOSL2 提供了一个 cyl() 模块,在 cylinder() 的基础上进行了扩展,增加了边缘圆角和斜切功能。你可以像使用 cylinder() 一样使用它,不同的是 cyl() 默认将圆柱居中。

include <BOSL2/std.scad>
cyl(r=60, l=100);
include <BOSL2/std.scad>
cyl(d=100, l=100);
include <BOSL2/std.scad>
cyl(d=100, l=100, anchor=TOP);

你可以通过 rounding= 参数对边缘进行圆角处理:

include <BOSL2/std.scad>
cyl(d=100, l=100, rounding=20);

同样地,你可以通过 chamfer= 参数对边缘进行斜切处理:

include <BOSL2/std.scad>
cyl(d=100, l=100, chamfer=10);

你可以分别为圆柱的每个端面单独指定圆角和斜切:

include <BOSL2/std.scad>
cyl(d=100, l=100, rounding1=20);
include <BOSL2/std.scad>
cyl(d=100, l=100, rounding2=20);
include <BOSL2/std.scad>
cyl(d=100, l=100, chamfer1=10);
include <BOSL2/std.scad>
cyl(d=100, l=100, chamfer2=10);

你甚至可以将圆角和斜切混合使用:

include <BOSL2/std.scad>
cyl(d=100, l=100, rounding1=20, chamfer2=10);
include <BOSL2/std.scad>
cyl(d=100, l=100, rounding2=20, chamfer1=10);

3D 球体 / 3D Spheres

BOSL2 重写了内置的 sphere() 模块。 你仍然可以按照内置模块的方式使用它:

include <BOSL2/std.scad>
sphere(r=50);
include <BOSL2/std.scad>
sphere(d=100);

你可以像使用 cylinder()cube() 一样,对 sphere() 进行锚定(anchor)、旋转(spin)和定向(orient):

include <BOSL2/std.scad>
sphere(d=100, anchor=FRONT);
include <BOSL2/std.scad>
sphere(d=100, anchor=FRONT, spin=30);
include <BOSL2/std.scad>
sphere(d=100, anchor=BOTTOM, orient=RIGHT+TOP);

BOSL2 还提供了 spheroid() 模块,它在 sphere() 的基础上增加了一些功能,如 circum=style= 参数:

你可以使用 circum=true 参数强制让球体外接理想球体,而不是默认的内接:

include <BOSL2/std.scad>
spheroid(d=100, circum=true);

style= 参数可以选择球体的构造方式:”orig” 样式与内置的 sphere() 构造方式一致。

include <BOSL2/std.scad>
spheroid(d=100, style="orig", $fn=20);

“aligned” 样式会确保在每个坐标轴的极值点都有一个顶点,前提是 $fn 是 4 的倍数。

include <BOSL2/std.scad>
spheroid(d=100, style="aligned", $fn=20);

“stagger” 样式会使垂直行的三角化呈交错排列:

include <BOSL2/std.scad>
spheroid(d=100, style="stagger", $fn=20);

“icosa” 样式通过细分二十面体来生成整个球体表面近似等大的三角形。在构建球体时,此样式会将有效的 $fn 调整为 5 的倍数:

include <BOSL2/std.scad>
spheroid(d=100, style="icosa", $fn=20);

“octa” 样式同样会为整个球体表面生成近似等大的三角形,但它是通过细分八面体实现的。这一样式的好处是能确保顶点位于坐标轴的极值点。在构建球体时,此样式会将有效的 $fn 调整为 4 的倍数:

include <BOSL2/std.scad>
spheroid(d=100, style="octa", $fn=20);