在阅读与3D模型生成相关的论文时,SDF是非常常见的关键词,因此笔者在此向大家介绍有向距离场(Signed Distance Field)。
推荐阅读:3D Gaussian Splatting高斯泼溅技术简单介绍
在计算机图形学中,3D物体表面的表示有显式 和隐式 两种方式。显式表示法如我们常见的网格、点云这些直接呈现几何信息的方式。而隐式表示法则是一种间接表示法,例如我们可以用以下数学式表示一个单位球:

而SDF(有向距离场 )则可用于对3D物体表面进行隐式表示。
SDF 是一种空间描述方法,用于定义空间中每个点到距离该点最近的3D物体表面的有向距离 :在物体表面之外 为正值 ,在表面之内 为负值。下图以二维轮廓为例进行图示:

从上述例子可以看出,即使我们并未直接给定轮廓线的具体信息,仅凭整个空间的SDF信息,就足以间接表达该二维轮廓。而3D物体表面的表示正是这一概念在三维空间中的延伸。
推荐阅读:对占用网络(Occupancy Networks)的简单介绍
应用场景
SDF的应用非常广泛,例如在下图所示游戏引擎的粒子系统中,我们可以基于SDF构建方向贴图,使运动中的粒子能够感知到自身正在接近建筑物表面,从而防止其穿透进入。

光线行进(Ray Marching) 可作为判断光线与3D表面相交情况的一种算法。其原理主要基于SDF的应用。以下图为例,假设一束射线从左下方向右上方移动,而右下角的绿色球体是通过SDF信息隐式表示的球面。利用SDF信息,我们可以在每个步进之后,计算出下一步可安全前进的距离。

这是因为SDF提供的有向距离值 本质上是一个保守的安全步长。
在下图的例子中,左上相机向各方向发射射线时,SDF能告诉我们当前位置到最近物体表面的最短距离 。这个距离值保证:以当前位置为球心、该距离为半径的球体空间内不存在任何物体表面。
因此,射线每一步都推进不超过该距离的长度,就能确保不会因步长过大而穿透或错过表面。这种"步步为营"的方式,既安全又高效,是Ray Marching算法的核心基础。

跨出第一步后,在每个新位置仍可通过SDF获取到球面的最短距离(青色箭头所示),因此可以安全地继续沿射线方向推进与青色箭头等长的步距(如下图所示)。

继续前述步骤,接下来会出现两种情况。第一种情况如下图所示,红色射线迟早会与球面相交或相切。

第二种情况如下图所示,若射线在后续每一步进中与球面的距离持续增大,则可推断该射线与球面永不相交。

判定射线与球面是否相交存在多种计算方法,例如可直接通过向量运算结合线性代数进行求解。当然,Ray Marching 的应用远不止于此,其在渲染领域的应用或许更为人们所熟知。但通过这个示例,可以帮助大家更直观地理解 Ray Marching 算法的核心原理。