一句话定义:代码建模是用编程语言描述几何——OpenSCAD 里写 difference(){ cube(); cylinder(); } 就得到一个「方块打孔」的实体,尺寸全部是变量,模型即程序。
为什么重要
- 打印圈大量需求是工具件与结构件(电池盒、支架、测试规),形状规则、尺寸敏感——代码建模「改一个数字重编译」的效率无人能敌。
- 参数的终极形态:模型可以由电子表格、传感器数据、甚至网页表单驱动(Thingiverse Customizer 就是 OpenSCAD 参数化生态)。
前置知识
流形与水密网格:可打印性的数学底线(布尔运算产出的网格同样必须流形);最好有一点编程常识,但没有也能入门(语法极简)。
核心概念
- OpenSCAD 三板斧:
- 基本体:cube()、cylinder()、sphere()、polyhedron(); - 布尔:union()(并)、difference()(差——挖孔)、intersection()(交); - 变换:translate()、rotate()、scale()、mirror()。
- 模块(module)与变量:把常用结构封装成
module battery_box(size, wall),像 CAD 的特征复用。 - 循环与条件:
for出阵列孔位、if切换版本——「系列化生成」是代码建模的杀手锏。 - 渲染两步:预览(快速 CSG)与 F6 渲染(生成网格)→ 导出 STL/3MF。
- 同类工具:CadQuery / Build123d(Python 生态,工程味更浓)、Blender Geometry Nodes(节点式程序化,偏艺术)。
原理与机制
- 代码定义的是构造过程(CSG 树)而非结果网格:
difference是数学意义上的精确相减,渲染时才离散成网格($fn控制圆的细分——这是代码建模里最关键的精度参数)。 - 与参数化 CAD 的本质差异:CAD 是「图形交互 + 求解器」,OpenSCAD 是「纯声明 + 编译」;后者没有约束求解器,但换来版本管理友好(文本 diff)与无限复用。
模型/图示
// 参数化垫片:改三个数字生成任意规格
outer_d = 20; inner_d = 5; thickness = 2;
difference() {
cylinder(h = thickness, d = outer_d, $fn = 96); // 外圆
translate([0, 0, -0.5])
cylinder(h = thickness + 1, d = inner_d, $fn = 96); // 挖孔
}直观类比
- 像乐高说明书被写成了菜谱:把「先拼 2×4 板、再扣 45° 楔形」写成步骤,谁(什么参数)来拼都能出对应版本。
- Geometry Nodes = 像素化版:拖节点连线代替写代码。
实例与案例
- 测试件工厂:温度塔、回抽塔(打印机校准与维护)很多就是 OpenSCAD 写的——每层参数递变,一行循环搞定。
- 桌面收纳系统:
module tray(w,d,h,wall)+ 网格布局循环,一套代码生成抽屉里的全部收纳盒。
常见误区
$fn太低:默认 0/低值时圆变多边形,孔装不进轴;规则:小圆$fn=32起,配合件$fn=96+。- 浮点缝隙:布尔体「刚好相切」会出非流形;惯例是给挖孔件多伸 0.5~1mm(如上例
translate z=-0.5)。 - 无脑用代码建复杂曲面:OpenSCAD 不擅长有机造型(那是雕刻的主场);扬长避短。
自测题
- CSG 的「构造过程」与「结果网格」差在哪一步?
$fn是什么?配合作业该给多大?- 为什么浮点相切要故意「过切」0.5mm?
与其他知识点的关系
- 参数化思想的交互版 → 参数化CAD与特征建模;输出的网格要过流形关 → 流形与水密网格:可打印性的数学底线;DfAM 参数化思维的高阶形态 → DfAM:为增材制造而设计。
延伸阅读
- OpenSCAD 官方 Cheat Sheet(一页纸覆盖全部语法)。