在 2026 年坚持手工拼装建模底层
「既然现在是 2026 年,我必须在开头声明,这不是靠 AI 自动生成的项目。」开发者 Matt Keeter 在公开 Halfspace 时写下了这句话。在这个大语言模型接管大量样板代码编写的年份,他从 2025 年 4 月起,单枪匹马手工敲出了一个面向距离场的实验性实体建模 IDE。支撑这个图形界面的核心是 Fidget 几何底层,其架构代码与设计思路最早可以追溯到 2022 年。
一个人尝试写出工业级别的 CAD 引擎听起来像天方夜谭。市面上统治地位的工程软件,其底层几乎全被基于边界表示(B-rep)的结构垄断。边界表示试图把成千上万个曲面精确缝合起来,组合成一个没有漏洞的三维实体。这是一个充斥着无尽边界情况的工程黑洞。即使是计算两个常规曲面的交线,数学上往往也没有完美的闭式解,需要堆砌规模庞大的容差处理逻辑。这就是大型 CAD 厂商需要几千人团队维护千万行代码的原因。
隐式曲面内核走了一条高度收敛的路径。实体不再由表面拼接而成,而是由一个覆盖全空间的数学函数定义。这种机制的简洁性,让单人独立开发并掌控一个几何内核具备了操作可能。它规避了复杂的拓扑缝合难题,非常适合个人尺度的制造软件开发,尤其是那些以 3D 打印和快速原型验证为重心的工作流。Halfspace 提供了一个稀缺的工程样本,证明了只要抛弃沉重的工业界历史包袱,单兵作战也能构建出一套从数学运算到上层交互逻辑自洽的工具链。
| 维度 | 边界表示(B-rep) | 隐式距离场 |
|---|---|---|
| 实体怎么来 | 大量曲面缝合成封闭壳体 | 一个覆盖全空间的数学函数 |
| 曲面求交 | 可能没有闭式解,靠容差兜 | 只需对函数求值 |
| 内核复杂度 | 集中在拓扑缝合 | 单人可完整理解 |
| 定位 | 工业级 CAD 的主力 | 个人尺度制造、3D 打印 |
撕开底层黑盒,直接把数学病态画出来
隐式内核的理论足够优雅,但在实际的开发中,编写代码的体验却经常像是在手写硬件指令。当一套复杂的数学组合函数生成了几何体后,一旦表面出现扭曲、断裂或非预期的错误着色,开发者很难弄清楚是长串公式里的哪一步出了问题。Halfspace 的工程贡献,就是把距离场这个原本藏在内存里的计算过程,直接推到了 IDE 的前台。
图:界面上是一个 cabin 模型的 IDE 截图,左侧为代码与控制树。来源:mattkeeter.com
在传统的黑盒隐式建模中,场本身的病态是看不见的。以两个 sawtooth 波构建的距离场为例,它们在空间的每一个点上符号都相同,但具体的场值存在差异。其中一个场在竖直的边界上,数值直接从代表内部的蓝色跳到代表外部的橙色,不经过代表表面的零等值线。在数学定义上,这种现象构成了 C0 不连续跳变。
图:有 C0 断跳的 sawtooth 距离场,场值在中心边界处发生无过渡突变。来源:mattkeeter.com
Fidget 依赖自动微分算法来计算空间中各点的表面法线。当底层的距离场发生上述的数值断跳时,边界两侧计算出的法线方向就会崩溃。放到具体的 3D 模型渲染里,这就直接导致了 cabin 模型屋瓦上出现了错误的阴影着色。如果在纯文本代码里寻找这种微小的几何定义错误,无异于大海捞针。
Halfspace 选择把场值以彩色等高线的形式平铺在界面上。数学公式里的跳变,立刻变成了视觉上的等高线断层。隐藏极深的数值病态,仅凭肉眼扫视就能被抓取出来。为了让后续系统运行得更稳定,开发者修改了数学组合,将梯度强行调成空间处处为 1。Fidget 的渲染并不绝对依赖这一步,但这为后续提升三角网格的导出质量留出了调整空间。
图:经过调整后梯度处处为 1 的 sawtooth 距离场,空间过渡变得均匀平滑。来源:mattkeeter.com
拆散工程积木,拒绝向上堆叠抽象层
在解决了几何底层的可视化问题之后,接下来的挑战是如何让艰涩的距离场函数变得容易编写。软件工程的常规做法是不断向外提供高级 API 来封装复杂性,而 Halfspace 拒绝了这种堆叠抽象层的诱惑。
它的解法是让系统底层本身变得更好写。平台提供了一个体积小但持续演进的标准库,包含了球体、盒子、平移和缩放等基础几何算子。用户构建复杂 3D 模型的过程,被拆解成多个小模块的组合,每个独立模块都能单独被参数化定义,并且单独放在小窗口里进行可视化验证。这套架构思路受到了 Kartik Agaram 发起的 Mu 项目启发:不要试图掩盖底层的繁琐,而是把组装底层的过程变得透明。
整个 Halfspace 的技术栈也是这种透明理念的延伸。应用逻辑使用 Rust 语言编写,通过手动配置 wasm-bindgen 来构建适用于 Web 的目标产物。开源库 egui 负责搭建所有的图形面板交互,而 wgpu 则同时包揽了界面重绘与几何体的计算任务。系统采用 Rhai 作为脚本解释引擎,Rayon 则在处理并行计算任务的同时,充当了 Web 浏览器环境下无法直接启动系统线程时的短命后台任务池。没有引入庞大且不可控的商业闭源框架,所有技术积木都直接铺在桌面上,随时可以被替换和重组。
跌破交互底线逼出全 GPU 渲染管线
除了本地运行,Halfspace 还提供了一个可以直接在浏览器里跑的 WebGPU 演示版本。但在早期的工程迭代中,跨平台渲染遭遇了严重的性能阻力。使用 WebAssembly 编译的纯 CPU 光栅化模块运行帧率大幅下降,界面反馈速度远低于实时编辑所需的下限标准。
这道性能难关最终催生了对底层渲染流程的大规模改造,也就是模块 fidget-wgpu 的诞生。开发者把光栅化和后处理的着色步骤强行从 CPU 剥离,全部交给 GPU 完成。系统无需再把算好的像素阵列从显存读回内存,规避了最耗时的总线通信环节。
图:Fidget 与 Halfspace 的分层与渲染管线示意,界限分明。来源:mattkeeter.com
改造的收益贯穿了整个系统架构。Fidget 正式成为唯一主导渲染逻辑的核心。Halfspace 作为一个上层的 IDE 壳子,被削薄到只剩下一个轻量级的着色器脚本,专门负责把最终的 RGBA 纹理贴到屏幕上。这种果断的职责切割,避免了应用层代码在反复的性能救火中变得臃肿。
抛弃向下兼容,底层保留掀翻重来的权力
站在行业生态的角度,Matt Keeter 对 Halfspace 的当前定位表现克制。他明确表示,如果有人现在就把这款实验工具用在必须保证不出错的承重生产环境里,那是一次轻率的决策。
商业 CAD 巨头普遍背负着海量的历史数据债务。如果西门子或达索修改了一行底层的求交算法,客户库里十年前建立的飞机发动机模型在重新计算时就可能发生变形。这种强制的向下兼容要求,直接锁死了传统工具进行底层重构的空间。而在编写 Fidget 和 Halfspace 之初,开发者就把找到隐式计算的正确 API,并保留做出重大破坏性更新的可能列为首要目标。
图:用这套工具建模并 3D 打印出来的 Menger 海绵实物。来源:mattkeeter.com
个人开发的工业软件免疫这种企业级的历史包袱。因为重心直接锚定在 3D 打印和实体输出上,它不需要兼容古老的工程图纸规范,可以激进地推翻过去。一旦能把隐蔽的距离场当作直观的实体去组装验证,单人开发者就能重新获得对复杂三维物体的定义权。把几何验证的控制权交给具体的建造者,这种工程实践本身就是对传统范式最直接的回应。
参考链接:
- Halfspace 官方项目文档
- Hacker News 社区讨论