从图片生成 3D 模型并不新鲜——各种神经渲染和生成模型已经能输出网格、点云,甚至看起来还不错的体素重建。但拿到一个 .stl 文件后,你想修改一个孔的直径、调整法兰厚度,就得回到建模软件里手动重画。生成模型和工程设计之间,始终隔着一道"不可编辑"的墙。
MIT 的 Md Ferdous Alam 和 Faez Ahmed 发布的 GenCAD,试图直接拆掉这堵墙:输入一张图片,输出不是静态网格,而是完整的 CAD 命令序列——一段可以在 OpenSCAD 里直接执行、参数可调、结构可改的程序。
从网格到命令序列:生成目标的根本转变
传统 3D 生成模型的工作路径大致是:
图片 → 神经网络 → 点云 / 网格 / 体素 → (手动) CAD 重建
终点是几何数据,没有"怎么画出来"的信息。工程师拿到结果后,要么直接用(无法参数化修改),要么对照着手工重建 CAD 模型(耗时且易出错)。
GenCAD 把终点往前推了一步:
图片 → GenCAD → CAD 命令序列 + 3D 实体模型
命令序列本身就是建模过程:拉伸、旋转、布尔运算、孔特征……每一步操作都有对应指令,参数可以读取和修改。这相当于神经网络不仅学会了"长什么样",还学会了"怎么一步步画出来"。
技术路线:为什么是命令序列而不是网格
GenCAD 的核心设计选择是把 CAD 建模过程视为一种序列生成问题,而非几何回归问题。这带来几个关键差异:
- 输出是程序,不是数据——命令序列天然可编辑、可版本管理、可 diff。
- 参数化是内置的——孔径、壁厚、倒角半径都体现在命令参数里,改一个数字就能更新整个模型。
- 布尔运算结构保留——你能看到"先拉伸基体,再挖孔"的逻辑,而不是一团融合后的三角面片。
从实现角度看,GenCAD 需要解决两个子问题:从图片推断宏观几何意图(什么形状、什么特征),以及把意图翻译成合法的 CAD 命令流。论文中采用了基于 Transformer 的序列生成架构,训练数据来自大规模 CAD 命令语料库,每条样本包含图片输入和对应的命令序列标注。
实际跑一遍:从图片到 OpenSCAD 程序
GenCAD 已开源,下面演示如何安装并用它生成一段可在 OpenSCAD 中直接运行的参数化程序。
安装 GenCAD
# 克隆仓库
git clone https://github.com/Ferdousi/GenCAD.git
cd GenCAD
# 创建虚拟环境并安装依赖
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
用预训练模型生成 CAD 命令序列
假设你有一张机械零件的图片 bracket.png,想生成对应的参数化程序:
from gencad.inference import GenCADPredictor
# 加载预训练权重(需从仓库 release 页下载)
predictor = GenCADPredictor(
checkpoint="checkpoints/gencad_pretrained.pt",
device="cuda" # 无 GPU 时改为 "cpu"
)
# 从图片生成 CAD 命令序列
commands = predictor.predict_from_image("bracket.png")
# 导出为 OpenSCAD 脚本
scad_code = predictor.export_to_openscad(commands)
print(scad_code)
生成的 OpenSCAD 脚本示例
输出可能是这样的(具体内容取决于输入图片):
// GenCAD 自动生成 — 基于输入图片推断的参数化模型
// 可直接在 OpenSCAD 中渲染和修改
$fn = 48; // 全局曲面精度
// 参数区 — 修改这里即可调整模型
base_width = 60;
base_depth = 40;
base_height = 8;
hole_dia = 6;
hole_pos_x = 15;
hole_pos_y = 10;
module bracket() {
// 基体:长方体
cube([base_width, base_depth, base_height], center=false);
// 两个安装孔
translate([hole_pos_x, hole_pos_y, -1])
cylinder(h=base_height + 2, d=hole_dia);
translate([base_width - hole_pos_x, hole_pos_y, -1])
cylinder(h=base_height + 2, d=hole_dia);
}
// 最终模型:基体减去孔
difference() {
bracket();
}
在 OpenSCAD 中打开这段代码,按 F5 预览、F6 渲染,即可得到 3D 实体。想改孔径?把 hole_dia = 6 改成 8,重新渲染即可——这正是参数化建模的价值。
批量推理与导出
如果你有一组图片需要批量处理:
# 批量推理脚本(仓库自带)
python scripts/batch_inference.py \
--input_dir ./test_images/ \
--output_dir ./generated_scad/ \
--checkpoint checkpoints/gencad_pretrained.pt \
--format openscad
每张图片会在 generated_scad/ 下生成一个 .scad 文件,可直接用 OpenSCAD 命令行渲染为 STL:
openscad -o generated_scad/bracket.stl generated_scad/bracket.scad
还有什么边界和风险需要知道
GenCAD 的思路很清晰,但当前版本有几条现实约束:
- 训练数据覆盖范围有限——主要面向常见机械零件(法兰、支架、壳体等),对自由曲面、复杂装配体或非常规拓扑的推断准确率会明显下降。
- 命令序列长度有上限——Transformer 序列生成受 token 长度限制,极复杂零件可能被截断或简化。
- 图片质量敏感——遮挡、模糊、非标准视角的输入会降低推断质量。建议输入尽量是正交视图、轮廓清晰的工程图或实物照片。
- 生成结果需要人工校验——命令序列在语法上合法,但几何意图可能偏差(孔偏移、壁厚不足等),生产使用前务必在 OpenSCAD 中检查关键尺寸。
什么时候值得试,什么时候先等等
适合尝试的场景:
- 你有大量标准件图片需要快速建立参数化模型库,且人工重建成本高。
- 你需要从旧图纸或实物照片恢复可编辑 CAD 源文件,原始模型文件已丢失。
- 你在做设计自动化流水线,需要"图片 → 可编辑程序"这一环。
暂时观望的场景:
- 零件涉及大量自由曲面(如消费电子外壳、汽车覆盖件),当前生成精度不够。
- 安全关键件,尺寸偏差不可接受——生成结果必须经过完整工程校核。
- 你的团队没有 OpenSCAD 使用经验,且现有工具链深度绑定 SolidWorks / Fusion 360——GenCAD 当前只输出 OpenSCAD 格式,转译到商业 CAD 需额外工作。
快速上手清单:
- 从 GenCAD GitHub 克隆仓库并下载预训练权重。
- 准备 1-2 张正交视角的零件图片做首次测试。
- 运行推理,在 OpenSCAD 中打开生成的
.scad文件,检查几何是否与图片一致。 - 尝试修改参数(尺寸、孔径),确认参数化响应正确。
- 评估准确率是否满足你的场景,再决定是否扩大使用范围。
GenCAD 把"从图片生成 3D"这件事从终点(网格)推到了起点(可编辑程序)。程序比网格多出来的那层信息——"怎么画"——正是工程设计最需要的部分。