ChipCode 的 OpenSCAD 闭环:为什么要先渲染三个视角
结构件的代码有个特点:它能完美运行,同时完全错误。
一段 .scad 编译不报错、渲染出实体、导出的 STL 也能切片——但开口开在了盒子的内侧,装不进去。
这个问题在打印之前看不出来,打印之后才发现,代价是一次四小时的打印和一卷料。
我们在 OpenSCAD 插件里加的那个“渲染三视角”就在解决这件事。这篇讲讲它到底是什么,以及为什么不是“截个图看看”。
先看一段正确的代码
这是典型的结构件生成逻辑:
difference() {
rrect(W, D, H, 3); // 外壳
translate([wall, wall, floor])
rrect(W - wall*2, D - wall*2, H, 2.5); // 掏空
translate([wall + usbX, D - 1, floor + usbZ])
cube([usbW, wall + 2, usbH]); // USB 开口
}
difference() 减法是布尔运算:从第一个实体里减掉后面的。语法上完全没有问题。
问题在于 usbX 的值。如果它偏大,那个 cube 会落在壳体外面,减法什么也没减掉——代码照常执行,模型照常生成,只是没有开口。
openscad 命令行不会对此发出任何警告。它做的事情就是“按你说的算”,而你说的东西本身是自洽的。
所以要看三个方向
我们把渲染做成固定三个视角:
- 正视(前视)——看开口位置对不对
- 俯视——看内部空间、螺丝柱位置
- 等轴测——看整体比例,以及那种“开口在但方向错了”的问题
为什么是这三个而不是更多?因为每个视角都能回答一个具体问题,且这三个问题覆盖了结构件最容易犯的错。加第四个视角的收益递减,而每一次渲染都要时间。
渲染用的是 openscad 的命令行模式:
openscad -o preview.png \
--imgsize=800,600 \
--camera=0,0,0,55,0,25,300 \
--projection=p \
model.scad
--camera 的七个参数是:transX,transY,transZ,rotX,rotY,rotZ,dist。等轴测那版我们把 rotX 调到 55、rotZ 调到 25,这是试出来的角度——能同时看到两个侧面和顶面,且不会被透视拉变形。
--projection=p 是透视投影。正交投影(o)在工程上更准确,但人的直觉更适应透视。我们的取舍是:给人看的图用透视,如果哪天要做尺寸核对再上正交。
渲染完不只是“看一眼”
图出来之后要做一次最基本的检查:它是不是空的。
判断方法很朴素——统计非背景色像素的比例。如果低于某个阈值(我们用 2%),说明模型可能是空的,或者相机位置不对。
这一步能拦下两类问题:
difference()把所有东西都减没了(掏空参数写大了)- 模型生成在原点之外,相机没对准
第二种尤其常见。AI 写 translate 的时候很容易算错偏移量,模型跑到坐标 (500, 500, 0) 去了,相机还在原点。
把结果写进证据
这一步是它跟“截个图”的本质区别。
三张图渲染完,会连同模型文件的哈希一起写进项目的证据记录:
{
"kind":"render","stage":"model","file":"case.scad",
"sha256":"9f2c...","views":["front","top","iso"],
"nonEmpty":[0.34,0.28,0.41],"result":"pass"}
为什么要记哈希?因为下次改完 .scad 再渲染,如果哈希没变,就说明模型没动,这三张图可以直接复用,不用再跑一遍。
为什么要记 nonEmpty 比例?因为它是可量化的。0.34 和 0.03 的差别,比“我看了一眼觉得还行”可靠。
它还是拦不住什么
说清楚边界。
拦不住“开口在正确的位置但尺寸不对”。 USB 口开了,位置也对,但窄了两毫米,插不进去。这个三视角图上看起来完全正常。
拦不住装配关系。 盒子做对了,板子也做对了,但装一起发现螺丝柱顶到了电容。这需要把两个模型放在一起看,我们现在没做。
拦不住打印工艺。 壁太薄、悬空太多、公差不够——这些只有切片软件和打印机知道。
所以这套东西的定位很明确:它只负责把“肉眼可见的低级错误”挡在打印之前。 剩下的部分仍然要靠经验、靠试打、靠卡尺。
我们没打算让它替代人。它替代的是“打印四小时之后才发现开口开反了”这种冤枉路。
为什么值得做
因为这类错误的成本结构很怪。
它的发生率不低(AI 生成的结构件几乎必然犯一两次),发现成本很高(要打印),修复成本很低(改两个数字)。
在成本曲线上,最划算的干预点是“打印之前”。
这就是我们加这一步的全部理由。不是为了炫技,是因为不这么做,用户就要用一卷料和半天时间去发现自己漏了个小数点。