OpenSCAD 第一个简单模型快速上手

关于 OpenSCAD

OpenSCAD是一个实体3D建模工具,可以使用它的脚本编程语言创建参数模型。该软件使用一种称为“构造几何”的技术来创建模型,通过转换和组合简单的对象,可以创建几乎任何复杂的模型。

教程入门

本教程假定你没有编程或者 CAD 方面的知识,循序渐进地引导你逐步完成示例和练习。这些示例和练习将帮助你快速理解 OpenSCAD,并为你提供创建自己的模型的正确工具。我们希望你把重点放在参数化设计上,这将使你能够快速修改你的创作并构建你自己的可复用及模块化的模型库。

大多数提供的示例和练习解决方案都可以在此处作为单独的 OpenSCAD 脚本获得。

本教程是一个连续的教程。当你按照示例进行操作时,你将被要求修改和扩展它们以及创建你自己的模型。要继续,请安装 OpenSCAD 并从空白模型开始。

关于 OpenSCAD 软件操作环境的一些基本信息

你应该注意到的第一件事是,OpenSCAD软件窗口分为两列。左边的一栏是文本编辑器,你将在其中键入 OpenSCAD 脚本语言来创建模型。你将要创建的任何模型都将在这个文本编辑器中进行“输入”。右边的顶部是模型将呈现的“虚拟”3D渲染空间。你现在应该能够找到的唯一内容是带有注释的参考轴 X、Y 和 Z。右边的底部是控制台,OpenSCAD将在你构建模型时打印任何错误消息或其他信息。最后,你还应该注意到在文本编辑器上方存在一个操作栏,参考轴下方存在一个操作栏。

1360px-OpenSCAD environment.png

创建你的第一个对象

示例

你的第一个对象将是一个边长为 10 的完美立方体。要创建它,你需要在文本编辑器中键入以下代码并点击参考轴下方操作栏上的预览(第一个)图标。

cube(10);

A small cube.jpg

关于 OpenSCAD 脚本语言,你应该从一开始就学习一些基本概念,尤其是在你没有编程背景的情况下。"立方体"是 OpenSCAD 脚本语言内置的一部分,用于创建立方体的函数。cube函数后跟一对括号,其中参数大小被定义为 10。函数可能需要的任何参数定义总是在命令字后面的一对匹配括号内完成。最后一个括号后面的分号表示该语句的结束,并帮助 OpenSCAD 解析你在文本编辑器中键入的脚本。因为分号用于指示每个语句的结尾,分号结尾与大多数 C 系编程语言相似。因此,你可以自由地以任何你喜欢的方式格式化你的代码,只需要注意插入适当的空格。

创建一个不同的立方体

示例

立方体不一定是完美的。立方体可以有不同的边长。使用以下语句创建边长为 20、30 和 50 的立方体。

cube([20,30,50]);

A cube with different side lengths.jpg

你应该注意到的第一件事是,与前一个相比,这个立方体相当大。事实上,它足够大,以至于它不适合当前的3D渲染界面。为了解决这个问题,你可以将鼠标移到3D渲染窗口上并向外滚动,直到可以看到整个立方体。你可以通过将鼠标移动到视口上并使用滚轮来放大和缩小。或者你可以使用3D渲染窗口下方操作栏上的放大(第四个)和缩小(第五个)图标。你可以使用同一操作栏中的查看全部(第三个)图标让 OpenSCAD 自动选择方便的缩放级别。

除了放大和缩小,你还可以移动和旋转模型的视图。为此,你需要将鼠标移动到视口上并在按住鼠标右键的同时拖动以移动或按住鼠标左键进行旋转。你可以使用3D渲染窗口下方操作栏上的重置视图(第六个)图标来重置视图。

Rotated viewing angle.jpg

你应该注意的第二件事是,为了创建具有不同边长的立方体,你需要在括号内定义一对方括号,其中包含三个值。这对括号用于表示值的向量。向量的值需要用逗号分隔并对应于立方体沿 X、Y 和 Z 轴的边长。当 cube 函数使用三个值的向量作为其输入时,OpenSCAD 会创建一个对应于向量值的具有不同边长的立方体。请记住,你之前使用 cube 函数通过定义参数 size 的值来创建一个完美的立方体。大多数 OpenSCAD 方法可以与不同的参数一起使用,甚至可以使用更多、更少或没有参数来实现不同的结果。


示例

你应该注意到每个立方体都是在第一个八分点上创建的。你可以定义一个名为 center 的附加参数并将其设置为 true 以使立方体以原点为中心。完整的声明如下。

cube([20,30,50],center=true);

A centered cube with different side lengths.jpg

请注意,当括号内定义了多个参数时,它们需要用逗号分隔。

添加更多对象和转换对象

构造实体建模方法使用许多基本对象以及多种方法来转换和组合这些对象以创建更复杂的模型。你在前面的示例中使用的立方体就是这样一个基本对象。基本对象也称为原语,可直接在 OpenSCAD 脚本语言中使用。例如,汽车不是 OpenSCAD 原语,因为脚本语言中没有相应的关键字。这是绝对有意义的,因为 OpenSCAD 是一组建模工具,而不是预定义模型的库。使用可用的工具,你可以组合可用的原语来创建自己的汽车。为此,你需要知道如何将多个对象添加到模型中。

示例

首先创建一个以原点为中心的边长分别为 60、20 和 10 的立方体。

cube([60,20,10],center=true);

A centered cube.jpg


示例

为了在你的模型中添加第二个立方体,请在文本编辑器的下一行中键入相同的语句,但将边长更改为 30、20 和 10。

cube([60,20,10],center=true);
cube([30,20,10],center=true);

A centered cube.jpg


示例

你应该看不到模型中的任何变化,因为第二个立方体在任何方向上都不大于第一个立方体,并且当前完全被第一个立方体覆盖。通过按以下方式修改第二个语句,你可以翻转第二个立方体,使其部分位于第一个立方体顶部的上方。

cube([60,20,10],center=true);
translate([0,0,5])
    cube([30,20,10],center=true);

Two cubes.jpg

你通过使用 translate 命令实现了这一点,该命令是可用的转换之一。translate 命令以及其他转换不会自行创建任何对象。它们更适用于现有对象以某种方式修改它们。translate 命令可用于将对象移动到空间中的任何点。translate 命令的输入参数是三个值的向量。每个值表示对象将沿 X、Y 和 Z 轴移动的单位数量。你应该注意到 translate 命令后没有分号。translate 命令后面是要转换的对象的定义。末尾加分号表示语句完成。


示例

尝试更改 translate 命令的输入参数,使立方体沿 X 轴平移 5 个单位,沿 Z 轴平移 10 个单位。如果你想以不同的方式格式化此语句,请尝试添加一些空格。尝试在 translate 命令后添加分号。

cube([60,20,10],center=true);
translate([0,0,10])
    cube([30,20,10],center=true);

Two cubes barely touching.jpg

在上面的示例中,第二个立方体正好位于第一个立方体的顶部。这是应该避免的,因为 OpenSCAD 不清楚这两个立方体是否一起形成了一个对象。这个问题可以通过始终保持相应对象之间大约 0.001 - 0.002 的小重叠来轻松解决。一种方法是将沿 Z 轴的平移量从 10 个单位减少到 9.999 个单位。

示例

cube([60,20,10],center=true);
translate([0,0,9.999])
    cube([30,20,10],center=true);

Two cubes barely touching.jpg

另一种更明确的方法是减去 0.001 个单位。

示例

cube([60,20,10],center=true);
translate([0,0,10 - 0.001])
    cube([30,20,10],center=true);

Two cubes barely touching.jpg

这是你将在整个教程中遇到的问题。当两个对象完全相互接触时,将始终通过减去或增加 0.001 个单位的容差来保证小的重叠。

圆柱体和旋转对象

你刚刚创建的模型看起来像空气动力学性能不佳的汽车车身。没关系。在接下来的章节中,你将使汽车看起来更有趣和更符合空气动力学。现在,你将使用圆柱体图元和旋转变换来为你的汽车添加轮子和车轴。你可以通过添加包含圆柱命令的第三条语句来创建轮子。你将需要定义两个输入参数 h 和 r。第一个是圆柱体的高度,第二个是它的半径。

示例

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
cylinder(h=3,r=8);

你应该注意到圆柱体被其余对象隐藏。你可以使用 translate 命令通过沿 Y 轴的负方向平移 20 个单位来使圆柱体可见。

示例

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
rotate([90,0,0])
    translate([0,-20,0])
    cylinder(h=3,r=8);

Two cubes and a cylinder.jpg

车轮现在是可见的,但如果没有正确放置,你的汽车将不会去任何地方。你可以使用旋转命令使轮子直立。为此,你需要将其绕 X 轴旋转 90 度。


示例

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
rotate([90,0,0])
    translate([0,-20,0])
    cylinder(h=3,r=8);

Two cubes and a rotated cylinder.jpg

你应该注意到的第一件事是旋转和翻译命令之间没有分号。你应该已经熟悉这个概念。分号只添加在语句的末尾。你可以以类似的方式继续添加任意数量的转换命令,但不应在它们之间包含分号。

你应该注意的第二件事是旋转命令有一个输入参数,它是一个包含三个值的向量。与 translate 命令完全类似,每个值表示对象将围绕 X、Y 和 Z 轴旋转多少度。

你应该注意的第三件事是,车轮是笔直的,但由于它围绕 x 轴旋转,它已经移动到汽车下方。发生这种情况是因为对象在旋转之前已经远离原点。将对象放置在模型中的一个好习惯是首先旋转它们,然后将它们平移到所需位置。

示例

通过更改旋转和平移命令的顺序,尝试先旋转滚轮然后平移它。

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
translate([0,-20,0])
    rotate([90,0,0])
    cylinder(h=3,r=8);

Two cubes and a rotated and translated cylinder.jpg 它已经看起来比车轮之前的位置好多了。


示例

尝试修改 translate 命令的输入参数,使该轮子成为你汽车的左前轮。

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
translate([-20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8);

Car body and front left wheel.jpg

示例

尝试通过复制最后一条语句并仅更改一个值的符号来添加汽车的右前轮。

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
translate([-20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8);
translate([-20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8);

Car body and misaligned front wheels.jpg

你应该注意到轮子的位置不是对称的。发生这种情况是因为圆柱体不是以原点为中心创建的。

示例

尝试在圆柱体命令中添加一个额外的输入参数,以向 OpenSCAD 表示两个轮子在首次创建时都应以原点为中心。你的轮子的位置现在对称了吗?

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
translate([-20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([-20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);

Car body and aligned front wheels.jpg

完成你的第一个模型

示例

尝试使用你所学的知识将缺少的后轮添加到汽车上。尝试在前轮和后轮上添加连接轴。

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
translate([-20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([-20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([-20,0,0])
    rotate([90,0,0])
    cylinder(h=30,r=2,center=true);
translate([20,0,0])
    rotate([90,0,0])
    cylinder(h=30,r=2,center=true);

Completed car.jpg

你应该注意到,在上面的模型中,车轴和车轮之间的重叠部分等于车轮厚度的一半。如果模型是以车轮和车轴相互接触的方式创建的,那么就需要确保它们之间有小的重叠,就像对汽车车身的两个立方体所做的那样。

到目前为止,可能困扰你的一件事是车轮的分辨率。到目前为止,你一直在使用 OpenSCAD 的默认分辨率设置。OpenSCAD 语言中有一些特殊的命令可以让你完全控制模型的分辨率。每次更新设计时,增加模型的分辨率也会增加所需的渲染时间。因此,建议你在构建模型时保留默认分辨率设置,并仅在完成设计后增加分辨率。由于汽车示例已完成,你可以通过在脚本中添加以下两个语句来增加分辨率。


示例

$fa = 1;
$fs = 0.4;

尝试在汽车脚本的开头添加上述两个语句。你是否注意到车轮分辨率的任何变化?

示例

尝试使用你所学的知识将缺少的后轮添加到汽车上。尝试在前轮和后轮上添加连接轴。

$fa = 1;
$fs = 0.4;
cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
translate([-20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([-20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([-20,0,0])
    rotate([90,0,0])
    cylinder(h=30,r=2,center=true);
translate([20,0,0])
    rotate([90,0,0])
    cylinder(h=30,r=2,center=true);

实际上,$fa 和 $fs 是特殊变量,它们根据分配给它们的值确定模型的分辨率。它们的确切功能将在稍后解释,并且不应该打扰你。你唯一需要记住的是,你可以在任何脚本中添加这两个语句,以获得普遍适用于 3D 打印的分辨率。这两个语句将在整个教程的所有示例中使用,以便获得视觉上吸引人的渲染。

在与你的朋友分享你的脚本之前,最好包含一些评论以帮助他们理解你的脚本。你可以在行首使用双斜杠来编写你喜欢的任何内容,而不会影响你的模型。通过使用双斜线,OpenSCAD 知道后面的内容不是脚本语言的一部分,因此直接忽略它。



示例

尝试在每个语句上方添加注释,让看代码的人知道每个语句创建模型的哪个部分。

// www.666.wiki 666教程
$fa = 1;
$fs = 0.4;
// Car body base
cube([60,20,10],center=true);
// Car body top
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
// Front left wheel
translate([-20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
// Front right wheel
translate([-20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
// Rear left wheel
translate([20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
// Rear right wheel
translate([20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
// Front axle
translate([-20,0,0])
    rotate([90,0,0])
    cylinder(h=30,r=2,center=true);
// Rear axle
translate([20,0,0])
    rotate([90,0,0])
    cylinder(h=30,r=2,center=true);

是时候保存你的模型了。点击编辑器上方操作栏上的保存(第三个)图标,将脚本保存为 *.scad 文件。当你创建新模型时,请记住尽早保存,然后经常保存,以免意外丢失你的工作。

如果你想 3D 打印你的汽车,你可以将其导出为 STL 文件。你应该首先点击视口下方操作栏上的渲染(第二个)图标来生成模型的 STL 数据。然后,你应该点击编辑器上方操作栏上的导出为 STL 图标以保存模型的 STL 文件。[1]

此页面最后编辑于2023年3月18日 (星期六) 20:05。