半空间(Halfspace)是一个用于距离场实体建模的实验性集成开发环境(IDE)。它是菲吉特内核(Fidget kernel)的展示应用,该内核被用于光栅化与网格化。在图形用户界面中,图像以近乎实时的方式光栅化,而模型能够导出为图像或三角网格。
正文
简介
Halfspace 是一个实验性的 IDE,用距离场做实体建模。
(demo 在电脑上体验最好;移动端 Safari 有 WebGPU 问题,平移/倾斜/缩放交互也还没针对多点触控设计。)
Halfspace 是 Fidget 内核的展示应用,光栅化和网格化都靠它。在 GUI 里,图像以接近实时的速度光栅化;模型可以导出为图像或三角网格:

既然是 2026 年,先说明一下:这不是 vibe-coded。我从 2025 年 4 月做到现在,用的是人类大脑,原因有很多(Fidget 则要追溯到 2022 年)。
下面的内容假定你对隐式曲面有点了解;更多背景可以看以往多篇文章(或者接着读也行)。
为什么?
我花了不少时间写隐式内核,花在基于这些内核写 GUI 上的时间少一些,真正用这些工具建模的时间更少。
日常生活中我其实不需要做多少实体建模,所以我做出来的东西大多是 demo,或者是某个内核的用法示例。
不过,用隐式曲面时我注意到一种张力。直接操作低层隐式曲面有点像写汇编:底层、强大、烦人。如果只给你 x、y、z 三个变量,全靠你把它们组合成梦想中的各种形状,那体验相当痛苦。
面对写汇编的痛苦,大多数人会在上面搭抽象:高级语言和库,编译到低层表示。这里对应的是形状与变换的标准库:sphere、box、translate、scale 等等。

还有一条不那么常见的路子:让汇编本身更好写。
这类项目里我最喜欢的是 Kartik Agaram 的 Mu,它把模拟、追踪和时间旅行调试包在 x86 汇编的一个子集外面。
Halfspace 两条路都走。它自带一个(不大但在成长的)标准库,同时也让增量搭建模型变得容易:复杂模型可以拆成更小的部分,各部分能单独参数化、单独可视化。
有了这些理由,再往下拆解一下定位。
实体建模
所谓「实体建模」,就是我们关注的对象有明确的内部和外部;空间里任意一点,你都能说它是在模型内还是模型外。
这看起来理所当然,但很多建模并不在乎这一点:随便打开一个游戏模型查看器=rkL%5BgL),你会看到大量无限薄的贴图墙面,由单组三角扇构成。我的背景是 CAD/CAM 软件(侧重 3D 打印),所以我想要的是能物理制造出来的模型。

实体建模有很多做法。多数 CAD 软件里,由边界表示几何内核把一张张曲面缝合成实体。这是极其困难的问题——比如两张 NURBS 曲面的交线可能根本没有闭式解。
从我硕士论文开始,我一直在做基于隐式曲面的几何内核。它的好处是,理论上一个人或一个小团队就能写完并完全理解,很适合个人规模的制造软件。
Halfspace 延续了这条线:它是包在 Fidget 几何内核外面的 GUI。模型可以用预定义图元和手写脚本组合设计,可导出为图像或三角网格。
距离场 IDE
我们本可以只在构造实体几何(CSG)层使用 Fidget 内核,搭出形状(球、立方体、圆柱等),再用逻辑运算(并、交、差)组合。Halfspace 选择把底层的距离场放到台前。
举个例子说明为什么这重要。下面是同一个锯齿波的两个距离场,它们在空间中每一点的符号都相同,但值不同:


图中符号(定义内部与外部)由颜色表示(蓝对橙),形状边界为白色(值等于 0)。场的数值由较淡的等值线表示,间距固定,像地形图。
尽管符号处处相同,第一个场的性质非常糟。看锯齿的竖直边:从内部(蓝)过渡到外部(橙),却没有穿过零点。
这是 C0 即「跳跃」间断,是坏消息。Fidget 用自动微分算法线,所以这条边界两侧的法线方向不正确(对比上下两图的场线)。在 3D 里我们用这些法线做着色,于是 cabin 的屋顶瓦片就渲染错了:

(如果眼熟,是因为它取自早前一篇博客)
把距离场放到台前,这类问题就容易诊断了。事实上它还能带来进一步改进:可以把梯度调成处处为 1,而不是挤在对角线上。下面是前后对比:

梯度均匀会让各种算法表现更好;Fidget 的正确性不依赖这一点,但例如网格质量可能因此提升。
Halfspace 是实验性的、跨平台的
现在把 Halfspace 用在任何承重场合都是极冒险的决定。在 Fidget 那篇写up里,有一条项目目标是:
为隐式内核找到「正确」的 API,并保留做出重大兼容性破坏的可能
Halfspace 类似:它不向最终用户暴露 API,但我在借它锻炼软件架构能力——做一个完整的跨平台应用,并愿意一路激进迭代、破坏东西。
说到跨平台,我让自己更累了:同时面向 web 和原生平台。在供应链攻击频发的年代,能直接分享一个网页链接、而不是让人编译运行代码,对上手和随手使用都很友好。
为此我攒出了一套「Halfspace stack」:一组库和模式,让我用最少的痛苦同时发布原生 + web 应用。核心部分目前是:
应用(及其全部依赖)用 Rust
GUI 用
egui- 窗口与标签页的核心抽象用
egui_dock
- 窗口与标签页的核心抽象用
渲染 UI 以及 GPU 计算都用
wgpu(!)- 脚本用 Rhai
Rayon 和
wasm-bindgen-rayon,有两个用途:- 把工作分给多个 worker 来加速并行算法,这是该库的「典型」用法
- 给短命的后台任务做线程池;这个用法不太寻常,但 web 上没法随便生成线程
……还有一长串其他库和折腾
web-time做跨平台时间支持- 一个自制 worker 池,用于脱离主线程(
async)做 GPU 渲染
这些都值得单独写一篇;这一栈的每一层我都有抱怨,但总体上它们能 Just Works™ 实在不可思议。
推动 Fidget 改进
Halfspace 的另一个目标,是通过在一个不那么简单的应用里使用 Fidget,来推动内核改进。
这方面最大的成果是 fidget-wgpu 的持续开发。起因是 web 上的性能:原生构建快得让人愉快,但在 CPU 上做光栅化、再经过一层 WebAssembly,就慢得「无法交互」。
在 Fidget 侧做了大量工作后,光栅化和后处理(例如着色)现在都能完全跑在 GPU 上,不再需要往 CPU 回传。

这在性能和架构上都是胜利:
- 原生和 web 目标上都有了原生的渲染速度
- 渲染逻辑不再分散在 Fidget(CPU)和 Halfspace(CPU 与 GPU 混合)之间:
- Fidget 实现规范的渲染逻辑
- Halfspace 只有很薄的着色器,画一张 RGBA 纹理
(2D 渲染管线现在也完全 GPU 加速了,只是 Halfspace 里的着色器稍微花哨一些,原因嘛……)
收尾
Halfspace 确实存在了!
你应该试试,但大概不该把它用在关键应用上!遇到问题请在 GitHub 上提 issue 或开 discussion。
评论
社区对展示的项目创意普遍表示喜爱与期待,并自发补充了作者在相关领域的长期工作及类似工具,未见明显分歧。
喜爱该项目创意
- 多位读者简短表达对项目的喜爱,认为点子很酷值得关注(较多人)
期待 Halfspace 3 后续版本
- 有用户留言等待 Halfspace 3,折射出社区对作者系列工具的持续兴趣(少数人) > 我在等 Halfspace 3。(@SirFatty)
赞赏 Matt Keeter 长期研究分享
- 读者指出 Matt Keeter 在此领域钻研良久且慷慨公开成果,其论文颇具阅读价值(少数人) > Matt Keeter 在这方面做了很久,非常慷慨地分享努力和研究,他的论文很值得读。(@WillAdams)
推荐或分享类似编辑与计算项目
- 有人引荐 Mu 项目,作为从机器码构建的安全可黑客计算栈,具备仿真与调试特性(少数人) > 这类项目里我最喜欢 Kartik Agaram 的 Mu,它围绕 x86 汇编子集实现了仿真、追踪和时间旅行调试。(@mncharity)
- 另有开发者介绍自己做的 WebGL 版 SDF 编辑器,可粘贴 ShaderToy 代码导出 STL 用于 3D 打印,目标不同(少数人)


