DGS
几何对齐协议而不是转换器
本文是《AI 时代的几何工作流:一个三层架构》的支撑文章 ii:中间层。
市面上已经有的东西,以及它们的问题
"把 mesh 变成 NURBS"这件事,市面上其实已经有几个方案:
- Rhino 自带的 ToNURBS 命令 — 把每个三角面变成一个小 NURBS patch。结果是几千个碎片化的小曲面,工程上完全不可用
- QuickSurface — 逆向工程插件,半自动识别。专业但门槛高,且做完就完了,不维护对应关系
- Geomagic Design X — 行业标杆,但价格几万美金一年,面向专业逆向工程师
- RhinoResurf — 用 NURBS patch 拟合 mesh。算法层面有效,但同样是"一次性翻译"
这些工具都共享一个共同的范式假设:mesh 是过程,brep 是结果;mesh 是脏的,brep 是干净的;mesh 一旦被翻译成 brep,就可以丢掉。
这个假设在逆向工程的语境里是成立的 — 你扫描一个零件,翻译成 CAD,以后就只用 CAD 那一份。但在 AI 时代,这个假设彻底崩了。因为:
- mesh 不再是脏的。AI 生成的 mesh 拓扑越来越干净,直接就是设计意图的一部分
- mesh 不会被丢掉。设计师会反复回到 mesh 上做修改、做雕刻、做生成式迭代
- brep 不是终点。brep 是中间态,是为了制造做出来的,但创作还在 mesh 那一端继续发生
这就要求一个新的范式:mesh 和 brep 必须共存,而且必须保持持续对齐。这个新范式不是"更好的转换",而是"持续的对齐"。
对齐与转换的根本区别
这两个词听起来差不多,但工程含义完全不同:
转换器 / Converter
─────────────────────
INPUT mesh → [convert] → OUTPUT brep
(mesh 退场)
对齐协议 / Alignment Protocol
─────────────────────
mesh ⇌ [alignment_map] ⇌ brep
(持续维护对应关系)
(任何一端的修改都会传播)
(误差始终被显示和追踪)
转换是一个动作,对齐是一种状态。转换有起点终点,对齐没有。转换的产物是一个新对象,对齐的产物是一组关系。
DGS 选择了对齐这条路。这意味着 DGS 的核心不是"转换算法",而是对应关系的数据结构。
核心数据结构:Hybrid Geometry Object
DGS 里的"几何对象"不是一个 mesh,也不是一个 brep,而是一个同时包含三种表示和它们对应关系的复合对象:
{
"id": "geo_001",
"name": "HybridObject",
"mesh": {
"vertices": [...],
"faces": [...],
"normals": [...]
},
"brep": {
"faces": [...],
"edges": [...],
"loops": [...],
"solids": [...]
},
"param_graph": {
"nodes": [...],
"edges": [...]
},
"alignment_map": {
"mesh_faces": { "mf_001": "brep_face_001", ... },
"mesh_edges": { "me_001": "brep_edge_003", ... },
"error": { "max": 0.012, "average": 0.003, "rms": 0.005 }
},
"tolerance": 0.001,
"status": "aligned"
}
这个结构里最重要的字段不是 mesh 也不是 brep,而是 alignment_map。它是 DGS 的"几何翻译词典" — 告诉系统 mesh 的每个面对应 brep 的哪个面、误差是多少。
三种几何表示的分工
DGS 不要求三种表示同时是"完整的" — 它们各有专长,各自负责形体的一个面向:
| 层 | 名字 | 角色 | 负责 |
|---|---|---|---|
| Layer A | Mesh Kernel | 感知几何层 | 自由形体、雕刻、AI 生成、扫描数据 |
| Layer B | B-rep / NURBS | 结构几何层 | 精确几何、连续曲面、布尔运算、制造 |
| Layer C | Param Graph | 规则几何层 | 参数、约束、生成逻辑、变体派生 |
这三层各自处理几何的一个方面,DGS 的工作不是把它们合并成一个,而是让它们之间保持持续对齐。
核心模块:Alignment Engine
DGS 的核心模块不是建模工具,而是 Alignment Engine — 三种几何之间的对齐引擎。它做四件事:
5 · 1拟合 / Fit
从 mesh 里识别出平面、圆柱、球面、自由曲面区域,然后为每个区域生成对应的 brep。这一步是半自动的 — 算法做出第一版判断,用户可以手动修正"这块应该是平面而不是自由曲面"。
5 · 2维护 / Maintain
当用户在 mesh 上推拉一下,系统不重算整个 brep,只更新对应区域的 brep。这是"局部重建" — 是 DGS 区别于一次性转换器的关键能力。
5 · 3追踪 / Track
持续记录 mesh 和 brep 之间的对应关系。这个记录是双向的 — 不仅 mesh 知道自己对应哪个 brep face,brep face 也知道自己对应哪些 mesh face。这种双向索引是局部重建能成立的前提。
5 · 4显示 / Display
把误差用热力图可视化。这一点很关键 — 误差不应该被消除,误差应该被显示。
为什么"误差应该被显示"是核心判断
这是 DGS 在哲学上和工程上最关键的一个判断,值得单独说说。
所有传统的 mesh-to-CAD 工具,都把误差当作"应该被消除的东西" — 拟合得越精确越好,误差越小越好,最好误差为零。这个目标很容易理解,但它有一个根本问题:误差不可能为零。
一个 mesh 永远不可能完美等于一组 NURBS 曲面,这是数学决定的。再精确的拟合都有偏差。当工具把"消除误差"作为目标时,实际发生的事情是:
- 工具假装误差不存在,生成一个看起来干净的 brep
- 用户拿到这个 brep,以为它和 mesh 等价,实际上不是
- 下游使用中出问题,但已经追溯不回去 — 对应关系早就丢了
DGS 选择了相反的路径:承认误差永远存在,然后把它显示出来。
用户随时能看到"这块区域偏差 0.003mm,那块区域偏差 0.012mm";系统会标出"超过 tolerance 的区域占 3.2%";关键决策 — "这个误差是否可以接受" — 交还给用户。
MVP 命题:第一块砖
DGS 是一个大体系,但它的 MVP 必须收敛到一个单一命题:
这个 MVP 的内部代号叫 DGS Region Fitter。它不解决所有问题,只验证一个问题:自由 mesh 能否被半自动结构化为可编辑 CAD 几何。
第一个 demo 的目标场景非常具体:输入一个带圆角的盒子 mesh,输出"6 个平面 + 12 个圆柱倒角"的结构化识别结果,并显示误差热力图。
这个场景之所以是好起点:
- 形状简单,人眼就能验证识别对不对
- 同时包含平面和圆柱两种原语,能验证多类型识别
- 圆角部分天然有拟合误差,能验证误差显示
- 不涉及自由曲面,避开 NURBS 拟合这个深坑
一两周可以做出来,能快速判断技术路线对不对。
它在三层架构里的位置
放回三层架构,DGS 是中间层 — 它的作用是连接入口端的 AI 生成 / 雕刻 mesh 和输出端的 CAD 制造系统,通过持续维护对齐关系,让两端不再脱节。
没有 Rhino Codex(入口层),AI 进不来 DGS;没有 DGS(中间层),AI 生成的形体进不了 CAD;没有 Param Graph(输出层),DGS 维护的对齐关系无法被复现。
三层缺一不可。但 DGS 是其中最难、也最有结构性意义的一层 — 它是真正"让两个原本不能通话的几何世界开始对话"的协议层。