来源公布的内容

Matt Keeter 发布了 Halfspace:一款实验性的实体建模(solid modeling)IDE,核心不是传统 CAD 那种曲面拼接,而是一整套摆在前台的距离场(distance fields)。它是作者自研几何内核 Fidget 的展示型应用:在界面里模型会被实时光栅化成图像,做完之后可以导出成图片,也可以导出成三角网格拿去 3D 打印。

Halfspace 界面与 Fidget 内核关系示意图:建模脚本经 Fidget 内核做光栅化与网格化
Halfspace 与 Fidget 内核的协作示意:界面里的模型实时光栅化,可导出图像或三角网格(图片:Matt Keeter 原文)

作者在开头特意声明:这不是 vibe-coded 的产物。他从 2025 年 4 月开始亲手写这个项目,而底层的 Fidget 内核可以追溯到 2022 年。Keeter 的背景是 CAD/CAM 软件,长期做 3D 打印相关的几何内核——从硕士论文起,他一直在做基于隐式曲面(implicit surfaces)的内核,因为这类内核有可能被一个人或一个小团队完整写出来、彻底理解,适合个人规模的制造软件。

他做 Halfspace 的动机来自一个观察:直接写底层隐式曲面,就像写汇编——低层、强大、折磨人。面对写汇编的痛苦,人们通常走两条路:搭高级抽象(对应到这里就是球体、立方体、平移、缩放等形状与变换的标准库),或者让汇编本身变得好写(他最喜欢的例子是 Kartik Agaram 的 Mu 项目,用模拟、追踪和时间旅行调试把 x86 汇编的子集包裹起来)。Halfspace 两条路都走:带一个虽小但在长大的标准库,同时支持增量式建模——复杂模型可以拆成小部件,每个部件可参数化、可单独可视化。

项目开源,许可证是 MPLv2。作者说它已经是个能用的东西,欢迎试用,但别用在关键任务上;遇到问题去 GitHub 提 issue 或开 discussion。他打算一直做到学不到新东西为止。

资料:[1]

跟着做:七步玩转这款距离场 IDE

  1. 用电脑浏览器打开网页版 demo(作者提醒:移动端 Safari 的 WebGPU 有问题,平移/倾斜/缩放交互还没为触屏设计,桌面体验最好)。
  2. 先别写代码,用内置标准库拼第一个模型:sphere、box 等基本形状,配合 translate、scale 等变换组合——这就是 Halfspace 版的“高级语言”。
  3. 把想做的复杂模型拆成小部件:每个部件单独参数化、单独预览,确认形状对了再组装——增量式建模是这款 IDE 的核心工作流。
  4. 想更底层时,用 Rhai 脚本直接写距离场表达式,亲手调场函数,而不是只调 CSG 的并/交/差。
  5. 打开距离场可视化:像看地形图一样看场线(等值线)——符号决定内外(蓝/橙),白线是零边界,场线疏密暴露梯度问题;看到垂直边上“蓝直接跳橙、不经过白色零线”,就是坏的 C0 跳变,赶紧修。
  6. 满意后导出:渲染成图片做展示,或导出三角网格拿去 3D 打印——实体建模保证每个点都有明确的内外,打印不翻车。
  7. 它是实验品,API 还会大改:遇到怪事别硬扛,去 GitHub 提 issue 或开 discussion,作者明说欢迎反馈。

资料:[1]

正文详解:为什么要把距离场摆到前台

先说“实体建模”在说什么:它只关心有明确内外之分的物体——空间里任取一点,都能判定它在里面还是外面。听起来理所当然,但很多建模根本不在乎这个:随便打开一个游戏模型查看器,满眼都是无限薄的贴图墙面,一片三角面扇糊个外观。Keeter 要的是能真实造出来的东西,所以内核必须保证“实心”。主流 CAD 用边界表示(B-rep)内核把一堆曲面缝成实体,这是个极难的问题——比如两张 NURBS 曲面的交线可能根本没有闭式解。隐式曲面的优势恰在于:一个人能把它从头到尾写明白。

Halfspace 的关键设计决策是:不把 Fidget 只当 CSG 层用(搭球体立方体、做并交差),而是把底层的距离场放到前台。作者用一个锯齿波的例子说明为什么这很重要:两个距离场在空间每一点的符号(正负、即内外)完全相同,但数值分布不同。第一个场很“坏”:在锯齿的垂直边上,场值从里面(蓝)直接跳到外面(橙),中间没有经过零——这叫 C0 跳跃间断。Fidget 用自动微分求法线,坏场算出的法线方向是错的。

有问题的锯齿波距离场:垂直边上场值从内直接跳到外,存在 C0 跳跃间断
坏的距离场:锯齿垂直边上蓝(内)直接跳到橙(外),没经过白色零线——C0 跳变会让法线算错(图片:Matt Keeter 原文)

法线一错,3D 渲染的明暗就全错:作者贴了一张木屋渲染图,屋顶瓦片的着色明显不对——而这张图正是从他早年一篇博客里抽出来的真实翻车案例。把距离场可视化摆在前台,这类问题一眼就能定位。

木屋渲染图:瓦片着色错误,是距离场坏掉导致的真实翻车案例
坏距离场的真实后果:木屋瓦片明暗全错(图片:Matt Keeter 原文)

更进一步,既然看得见,就能修:作者把锯齿场的梯度调成处处为 1(原来梯度都挤在对角线上),场线变得均匀。虽然 Fidget 不要求梯度为 1 也能算对,但均匀的梯度让各种算法更良态,比如能直接提升网格化质量。

修好的锯齿波距离场:梯度均匀,不再有跳变
修好的距离场:梯度调成处处为 1,场线均匀,算法更良态、网格质量更好(图片:Matt Keeter 原文)

另一大看点是跨平台工程:作者故意同时做网页版和原生版。在供应链攻击频发的年代,能甩一个链接给人直接玩,比让人编译运行友好得多。他攒了一套“Halfspace 技术栈”:Rust 写应用、手工调 wasm-bindgen 打包网页、egui 做界面、egui_dock 做窗口页签、wgpu 既渲染 UI 又做 GPU 计算、Rhai 做脚本、Rayon 加 wasm-bindgen-rayon 做并行(Web 上不能直接起线程,所以还搭了个后台任务线程池),外加 web-time 和自研的异步 GPU 渲染 worker 池。他说每一层都有槽要吐,但整体“居然就跑起来了”。

资料:[1]

如何解读

2026 年还坚持手写几何内核、并在开头声明“not vibe-coded”,本身就是一种表态:有些软件的价值恰恰在于作者能把它彻底装进脑子里。AI 写代码擅长的是把已知模式快速拼出来,而 Halfspace 这类项目的乐趣和难度在于探索未知——“距离场前台化”“让汇编好写”都不是能 prompt 出来的设计,它需要作者在隐式曲面里泡上几年才想得到。这和前阵子那篇“vibecoding 不好玩”的讨论是同一个硬币的两面:亲手写的快乐,来自对问题本质的掌控感。

第二个启示是“把隐式状态显式化”:距离场平时藏在内核里,Halfspace 把它画成地形图,调试就从玄学变成看图说话。这个思路可以迁移——凡是内部状态复杂、出错难定位的系统(物理仿真、排版引擎、甚至 AI 智能体的中间推理),先想办法把它画出来,再谈优化。对做 3D 打印和创客类副业的人更直接:实体建模保证“可打印”,比外观好看重要得多,这是选工具时的一票否决项。

资料:[1]

阅读要点

  • Halfspace = 实验性实体建模 IDE + 距离场前台化 + Fidget 几何内核展示应用,实时光栅化、可导出图片或三角网格。
  • 作者 Matt Keeter:CAD/CAM 背景,从 2025 年 4 月亲手写起,声明非 AI 生成;Fidget 内核始于 2022 年。
  • 设计哲学:写隐式曲面像写汇编;Halfspace 同时给标准库(高级语言路线)和增量可视化建模(让汇编好写路线)。
  • 核心案例:锯齿波距离场的 C0 跳变导致法线算错、木屋瓦片着色翻车;把梯度调成处处为 1 后算法更良态。
  • 技术栈:Rust + wasm-bindgen + egui + wgpu(UI 与 GPU 计算)+ Rhai 脚本 + Rayon,网页与原生同源双发。
  • 实验性质:别用在关键任务,API 还会大改;开源 MPLv2,GitHub 欢迎 issue。

资料:[1]