跳到内容

OpenSCAD 教程/第 1 章

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

关于 OpenSCAD 的一些话

[编辑 | 编辑源代码]

OpenSCAD 用于通过构造实体几何的艺术来制作 3D 模型。它打开了创造力的世界,其中基本操作就像我们的积木。

让我们塑造一些乐趣。

开始使用本教程

[编辑 | 编辑源代码]

本教程将成为你值得信赖的指南。我们将探索示例,并揭开 OpenSCAD 的秘密。在本教程结束时,你将拥有工具来逐行打造自己独特的 3D 模型。

每一步,你都会获得信心和专业知识,磨练自己作为图像创造者的技能。你会将代码融入你的设计中,创造错综复杂的结构,并将你的设计理念变为现实。

在本教程中,我们将成为你的伴侣,提供指导,帮助你释放 OpenSCAD 的全部潜力。

你将探索、学习和创造。

用户界面

[编辑 | 编辑源代码]

启动 OpenSCAD 后,窗口应该类似于下面的图像。

窗口分为三列。

  1. 在左侧列中,可以看到内置的文本编辑器,真正的魔法在这里展开。当您输入键盘命令时,您可以看到代码转换为艺术的转变。
  2. 在中间列中,显示的 3D 视图是您的设计创作栩栩如生的地方。底部是操作顺序控制台,始终准备着伸出援助之手。它揭示了错误的奥秘,并引导你走向精通。它是你值得信赖的指导伴侣。
  3. 请注意右侧列,即 GUI 定制器。它为用户提供了一个简便的工具栏,这是一个图形界面,用于调整和调整模型的参数。

创建你的第一个物体

[编辑 | 编辑源代码]

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

代码

a_small_cube.scad

cube(10);

从一开始,您应该学习一些关于 OpenSCAD 脚本语言的基本概念,尤其是如果您没有编程背景。单词“cube”是 OpenSCAD 脚本语言的一部分,用于命令 OpenSCAD 创建一个立方体。'cube' 命令后跟一对圆括号,其中定义了参数大小为 10。任何命令可能需要的参数定义始终在命令词之后的一对匹配的圆括号内完成。最后一个括号后的分号表示该语句的结束,并帮助 OpenSCAD 解析您在文本编辑器中输入的脚本。由于分号用于指示每个语句的结束,因此您可以通过插入空格来随意格式化代码。

练习
尝试在单词“cube”和第一个括号之间添加一些空格,然后点击(选择)“预览”选项。您的立方体创建了吗?您是否收到任何错误消息?尝试在不同位置添加一些额外的空格,然后再次点击“预览”,看看在控制台中出现错误消息之前,您可以做些什么。如果在单词“cube”的“cu”和“be”之间添加空格并点击“预览”会发生什么?如果您删除分号会发生什么?

你在上一段中读了三次“点击预览”。当你点击“预览”时,OpenSCAD 会解析你的脚本并创建相应的模型。每次对脚本进行更改(例如,添加空格)或稍后添加其他语句时,都需要点击“预览”以查看这些更改的效果。

练习
尝试将立方体的大小更改为 20,看看会发生什么。您是否记得点击“预览”以查看您的更改生效?

创建一个略微不同的立方体

[编辑 | 编辑源代码]

立方体不必完美(等距)。立方体可以(是立方体)具有不同的边长。使用以下语句来创建一个边长分别为 25、35 和 55 的立方体(立方体)。

代码

a_different_cube.scad

cube([25,35,55]);


您应该注意的第一件事是,与之前的立方体相比,这个立方体相当大。事实上,它大到无法容纳在视窗中。为了解决这个问题,您可以将鼠标悬停在视窗上并向外滚动,直到您看到整个立方体。您始终可以通过将鼠标悬停在视窗上并使用滚轮来放大和缩小。或者,您可以使用视窗下方操作栏中的放大(第四个)和缩小(第五个)图标。您可以让 OpenSCAD 自动选择一个方便的缩放级别,方法是使用同一操作栏中的查看所有(第三个)图标。

练习
尝试将鼠标悬停在视窗上并使用滚轮来放大和缩小。尝试使用相应的图标来放大和缩小。让 OpenSCAD 为您选择一个缩放级别。

除了放大和缩小之外,您还可以移动和旋转模型的视图。为此,您需要将鼠标悬停在视窗上,并在按住鼠标右键的同时拖动以移动,或在按住鼠标左键的同时拖动以旋转。您可以使用视窗下方操作栏中的重置视图(第六个)图标来重置视图。

练习
尝试将鼠标悬停在视窗上,并在按住鼠标右键或左键的同时拖动以移动或旋转模型的视图。看看在您需要重置视图之前,您可以玩弄多长时间。

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

练习
尝试使用没有任何参数的 cube 命令。会发生什么?使用 cube 命令创建一个边长分别为 50、5 和 10 的立方体。使用 cube 命令创建一个边长为 17.25 的完美立方体。

您应该注意到,每个立方体都在第一个八分圆上创建。您可以定义一个名为 center 的额外参数并将其设置为 true,以使立方体以原点为中心。完整的语句如下。

代码

a_centered_cube_with_different_side_lengths.scad

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

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

练习
尝试创建一个完美的立方体或一个具有不同边长的立方体。使用适当的附加输入参数使该立方体以原点为中心。如果您愿意,可以在分隔两个参数的逗号前后添加一些空格。

添加更多物体和平移物体

[编辑 | 编辑源代码]

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

首先创建一个边长分别为 60、20 和 10 的立方体,并使其居中于原点。

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

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

代码

a_smaller_cube_covered_by_a_bigger_cube.scad

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

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

代码

two_cubes.scad

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

您通过使用 "translate" 命令实现了这一点,"translate" 命令是可用的变换之一。 "translate" 命令以及其余的变换本身不会创建任何对象。它们更像是应用于现有对象,以特定方式修改它们。 "translate" 命令可用于将对象移动到空间中的任何点。 "translate" 命令的输入参数是一个包含三个值的向量。每个值指示对象将在 X、Y 和 Z 轴上移动的单位数。您应该注意,"translate" 命令后面没有分号。紧随 "translate" 命令之后的是要平移的对象的定义。分号在末尾添加,以指示语句的完成。

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

two_cubes_barely_touching.scad

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

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

代码

two_cubes_with_small_overlap.scad

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

另一种更明确的方法是从脚本中的对应值中减去 0.001 个单位。

代码

two_cubes_with_explicit_small_overlap.scad

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

还有一种方法。为了不从顶部丢失 0.001,我们可以添加一个第三个立方体,其尺寸与较小的立方体相同,高度为 0.002 ([30, 20, 0.002])。第三个立方体将填补空隙。

代码

third_cube_close_small_gap.scad

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

这是您将在整个教程中遇到的情况。当两个对象正好接触时,您应始终通过减去或添加 0.001 个单位的公差来确保它们之间存在小重叠。

圆柱基本体和旋转对象

[edit | edit source]

您刚刚创建的模型看起来像是车身,空气动力学性能很差。没关系。在接下来的章节中,您将使汽车看起来更有趣、更具空气动力学。现在,您将使用圆柱基本体和旋转变换在汽车上添加车轮和车轴。您可以通过添加第三个语句(包含 cylinder 命令)来创建一个车轮。您需要定义两个输入参数,h 和 r。第一个是圆柱体的高度,第二个是其半径。

代码

a_cylinder_covered_by_cubes.scad

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 个单位,使其可见。

代码

two_cubes_and_a_cylinder.scad

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

车轮现在可见,但是如果车轮没有正确放置,您的汽车将无法行驶。您可以使用 "rotate" 命令使车轮直立。为此,您需要将其绕 X 轴旋转 90 度。

代码

two_cubes_and_a_rotated_cylinder.scad

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);

您应该注意到的第一件事是 "rotate" 和 "translate" 命令之间没有分号。您应该已经熟悉此概念。分号只在语句的末尾添加。您可以按类似方式添加任意多个变换命令,但不能在它们之间包含分号。

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

您应该注意到的第三件事是,车轮是直立的,但由于它绕 x 轴旋转,因此已移至汽车下方。发生这种情况是因为该对象在旋转之前已从原点移开。在模型中放置对象的最佳做法是首先将它们旋转,然后将它们平移到所需位置。请注意,OpenSCAD 生成对象,然后应用对象的变换,从紧靠对象定义之前的变换开始,然后向后工作。因此,为了旋转对象,然后通过平移移动它,请在代码中首先指定平移,然后指定旋转,最后指定对象定义。

练习
尝试先旋转车轮,然后平移车轮,方法是更改 "rotate" 和 "translate" 命令的顺序。
代码

two_cubes_and_a_rotated_and_translated_cylinder.scad

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);

它看起来比车轮上一个位置好多了。

练习
尝试修改 "translate" 命令的输入参数,使此车轮成为汽车的前左轮。
代码

car_body_and_front_left_wheel.scad

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_misaligned_front_wheels.scad

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);

您应该注意到,车轮的位置不对称。发生这种情况是因为圆柱体不是在原点居中创建的。

练习
尝试在 "cylinder" 命令中添加一个额外的输入参数,以指示 OpenSCAD 在首次创建时两个车轮都应在原点居中。您的车轮位置现在对称了吗?
代码

car_body_and_aligned_front_wheels.scad

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);

完成您的第一个模型

[edit | edit source]
练习
尝试使用您学到的知识将后部缺失的车轮添加到汽车上。尝试在前后车轮之间添加一个连接车轴。
代码

completed_car.scad

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);

您应该注意到,在上面的模型中,车轴和车轮之间存在重叠,等于车轮厚度的一半。如果模型以车轮和车轴正好接触的方式创建,则需要确保它们之间存在小重叠,就像汽车车身中的两个立方体那样。

到目前为止,您可能一直在烦恼车轮的分辨率。到目前为止,您一直在使用 OpenSCAD 的默认分辨率设置。OpenSCAD 语言中有特殊的命令,允许您完全控制模型的分辨率。提高模型的分辨率还将增加每次更新设计时所需的渲染时间。因此,建议您在构建模型时保持默认分辨率设置,只有在完成设计后才提高分辨率。由于汽车示例已完成,您可以通过在脚本中添加以下两个语句来提高分辨率。

代码
$fa = 1;
$fs = 0.4;

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

代码

completed_car_higher_resolution.scad

$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 会知道后面不是脚本语言的一部分,并简单地忽略它。

练习
尝试在每个语句的上面添加一个注释,以让您的朋友知道您的模型的哪一部分是用每个语句创建的。
解决方案代码

completed_car_commented.scad

$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 文件。

创建第二个模型

[edit | edit source]
练习
尝试使用您学到的所有知识来创建一个新的简单模型。它可以是房子、飞机或任何您喜欢的物品。不要担心让您的模型看起来完美,只需尝试使用您的新技能!在接下来的章节中,您将继续学习更多创建很棒模型的技术。
华夏公益教科书