一句话定义:符号距离场(Signed Distance Field,SDF)是一个函数——给它三维空间里任意一个坐标,它返回这个点到物体表面的最近距离,并用正负号标明这个点在物体外面还是里面。
想象一张海岛的海拔图:海平面以上为正、以下为负,海拔为零的那条线正好勾出海岸线。SDF 就是这个海拔场,只不过「零」那一圈是物体表面,正值在外部、负值在内部。换句话说,它不记录表面上的顶点,而是让空间中每一个点都回答一句「我离表面还有多远」。
这样表示有两个好处。一是连续:任意两点之间可以插值,不会像体素那样一放大就成马赛克。二是可导:对位置求梯度,方向正好指向表面,长度就是到表面的距离——法线白送。
它在 AI 里成为 3D 的「通用中间语言」,原因很直接:
- 神经网络天生适合回归连续数值。让它对每个坐标输出一个距离值,比让它输出顶点或三角形自然得多。把形状编码进网络权重,就是所谓的神经隐式表示;再挂一个潜码(latent code),同一个网络就能表示许多不同形状。
- 从场里取表面很便宜:找值为零的等值面(zero level set),用 Marching Cubes 一类的算法就能转成网格。表面天然光滑,不需要像密度场那样反复挑阈值。
- 布尔运算变成逐点算术:并集取最小值,交集取最大值,差集是 max(a, −b)。不必处理网格求交那一大堆退化情况。
- 渲染可以直接用光线步进:沿光线前进时,当前点的距离值告诉你前方至少还有多远是空的,可以整步跳过去,不会穿透。
你可能早就用过它:字体渲染里的距离场字体,把字形预先算成一张距离图,同一个字形放大到任意字号都保持清晰锐利。
和相邻概念的区别:网格(mesh)只存表面那一层皮,没有内外信息;点云(point cloud)是采样出来的稀疏表面点,噪声大;体素(voxel)占用网格是把距离粗暴换成 0/1;NeRF 一类的辐射场学的是密度加颜色,为渲染而生,表面容易发糊。SDF 学的是几何本身,表面干净,但拿不到颜色——所以常见的做法是用 SDF 提供几何、另配一个分支输出颜色。
| 表示 | 存什么 | 特点 |
|---|---|---|
| 网格 | 顶点与三角面 | 渲染友好,布尔运算与修复麻烦 |
| 体素占用 | 每个格子的 0/1 | 简单,分辨率与显存互相拉扯 |
| SDF | 每个点到表面的带符号距离 | 连续可导、易做布尔运算,但不含外观 |
| 辐射场 | 密度与颜色 | 渲染质量高,表面提取偏糊 |
对从业者:凡是任务要和三维形状打交道——重建、生成、编辑、碰撞检测、路径规划、3D 打印——用 SDF 做内部统一表示,往往能把整条链路简化。代价是它只描述几何、不描述材质,而且要让网络学出严格意义的距离场(梯度模长处处为 1,即 Eikonal 条件),通常要加专门的约束项。具体实现细节以各项目官方文档为准。
对普通人:把模型和文字放大不糊、3D 打印前自动修补和合并模型,背后常常就是这个「离表面多远」的小函数在干活。
