1.4 隐式表面表示
来源:Mario Botsch 等人的 Polygon Mesh Processing,第 1 章 Surface Representations,1.4 小节 Implicit Surface Representations。
这一节讨论 implicit surface representations,也叫 volumetric representations。和 1.3 参数化表面表示 不同,隐式表示不是直接给出表面上的点,而是用一个三维空间中的标量函数来定义表面。
本节核心
隐式表示的基本思想是:用一个函数判断三维空间中的点在物体内部、外部,还是正好在表面上。
定义一个标量函数:
表面 是它的零水平集:
通常约定:
所以隐式表示描述的不是一张表面本身,而是整个嵌入空间的 inside / outside 分类。
隐式表示和参数化表示的差别
参数化表示是:
也就是从二维参数域生成三维表面点。
隐式表示是:
也就是给三维空间中每个点一个标量值,然后取零水平集作为表面。
可以粗略理解为:
| 表示 | 问题形式 | 表面定义 |
|---|---|---|
| 参数化 | 给定 ,表面点在哪里? | |
| 隐式 | 给定 ,它在内/外/表面? |
隐式函数的类型
隐式函数可以有多种实现方式。
常见形式包括:
- algebraic surfaces。
- radial basis functions。
- signed distance fields。
- discrete voxelizations。
- regular grids。
- adaptive octrees。
这些具体形式不同,但共同点都是:表面由某个标量场的零水平集定义。
连续隐式函数的优点
只要 是连续的,隐式表面就天然有一些好性质。
不容易出现洞
表面是零水平集:
只要标量场连续,inside 和 outside 之间的边界会形成连续分界。
这使得隐式表示在修补孔洞、构造封闭表面时很有用。
不会产生几何自交
隐式表面是一个 potential function 的 level set。
因此,同一个空间点只有一个函数值,表面不能像参数化曲面那样由不同参数点映射到同一位置而形成自交。
这一点在 mesh repair 中很重要:把有缺陷的网格转成隐式场,再提取表面,可以消除很多自交和孔洞问题。
隐式表示常用于模型修补,因为 level set 表面天然更适合处理孔洞、自交和拓扑变化。
inside / outside 查询很简单
隐式表示最大的优势之一是空间查询简单。
给定一个点 ,只需要计算:
然后看符号:
- :内部。
- :外部。
- :表面。
这比参数曲面上的 inside / outside 查询更直接。
适合 CSG 布尔运算
隐式表示很适合 constructive solid geometry,简称 CSG。
CSG 用布尔运算组合基本几何体:
- union。
- intersection。
- difference。
如果每个几何体都有自己的隐式函数,布尔运算可以用函数的 min / max 组合实现。
例如,两个实体的并集可以理解为:
交集可以理解为:
具体符号形式取决于 inside / outside 的约定,但核心思想是:布尔几何操作可以转化为标量场组合。
拓扑变化方便
隐式表示的另一个优势是拓扑变化自然。
因为标量场 的存储结构,例如 voxel grid,并不直接依赖零水平集表面的拓扑。
修改 的局部数值,可以让表面:
- 膨胀。
- 收缩。
- 合并。
- 分裂。
- 打洞。
- 补洞。
书中提到:降低局部函数值可以让表面增长,增加局部函数值可以让表面收缩。
这和参数化表面形成对比。参数化表面要改变拓扑,往往需要修改参数域和连接结构。
Signed Distance Function
给定同一个表面 ,隐式函数 不是唯一的。
例如:
和:
只要 ,它们有相同的零水平集。
最常见、最自然的隐式函数是 signed distance function,简称 SDF。
SDF 把每个点映射到它到表面的带符号距离:
其中:
表示点到表面的距离。
符号表示点在内部还是外部。
SDF 的好处
SDF 不仅能做 inside / outside 查询,还能直接给出距离。
因此它适合:
- 碰撞检测。
- 误差控制。
- 网格处理算法中的全局误差估计。
- level set 演化。
- 模型修补。
如果有一个好的 SDF,很多几何问题都会变成简单的函数求值。
SDF 可以看成隐式表示中的“最有信息量”版本:它不仅告诉你在内还是在外,还告诉你离表面多远。
隐式表示的弱点
隐式表示也有明显缺点。
表面采样困难
参数曲面可以直接取 并计算 。
但隐式表面需要找到:
这通常需要 marching cubes、ray marching 或其他 isosurface extraction 方法。
geodesic neighborhood 难以获得
隐式表示直接存储的是空间标量场,而不是表面参数域或网格连接。
因此,表面上的邻域关系不直接可得。
如果想沿表面做平滑、参数化或测地距离计算,通常需要先提取网格。
渲染不如网格直接
网格可以直接交给图形管线渲染。
隐式表面需要先采样、求交或提取等值面,渲染过程更复杂。
缺少参数化,不利于贴纹理
隐式表面没有天然的二维参数域。
因此,很难像参数曲面那样稳定地贴纹理,尤其是当隐式表面随时间演化时,纹理坐标难以保持一致。
1.4.1 Regular Grids
为了计算隐式表示,通常不会真的存储连续函数 ,而是在物体周围的 bounding box 内离散采样。
最简单的数据结构是 regular grid。
在规则网格节点上采样:
记录:
体素内部的函数值可以通过 trilinear interpolation 得到。
这种方式简单直接,但内存开销很大。
如果体素边长减半,每个方向的采样数大约翻倍,总体存储量会变成:
倍。
因此 regular grid 的内存随精度提升呈三次增长。
Uniform regular grid 的主要问题是浪费。大量远离表面的内部/外部区域也被高精度存储,但它们对表面形状贡献很小。
1.4.2 Adaptive Data Structures
为了提高内存效率,可以让采样密度适应几何重要性。
关键观察是:精确的 signed distance values 最重要的区域在表面附近。
远离表面的区域,只需要知道“大概在内部”或“大概在外部”即可。
因此可以使用 octree 这样的层级结构:
- 表面附近细分更密。
- 远离表面的内部或外部区域保持粗糙。
Three-color octree
书中提到 three-color octree。
它把空间单元分成三类:
- black:完全在物体内部。
- white:完全在物体外部。
- grey:被表面穿过。
只有 grey cells 需要继续细分,因为只有这些单元影响零水平集的位置。
这样可以把存储复杂度从接近三维体积级别,降低到更接近表面壳层级别。
直观上:
regular grid: 整个体积都高精度采样
adaptive grid: 只在表面附近高精度采样
根据误差自适应细分
还可以进一步优化:不是所有表面附近区域都需要同等精度。
如果某个单元内 trilinear interpolant 和真实距离场的偏差超过给定容差,就继续细分。
这会让采样密度同时适应:
- 表面所在位置。
- 局部形状复杂度。
- 曲率大小。
高曲率区域需要更细采样,平坦区域可以保持较粗。
这样内存消耗可以接近 mesh representation 的量级。
BSP 等其他自适应结构
除了 octree,也可以使用 adaptive binary space decomposition。
这种结构在叶子节点中使用 linear interpolants,而不是 trilinear interpolants。
书中指出,它们在渐近复杂度和逼近能力上类似,但二叉空间划分可能有更好的内存效率,代价是 cell 形状不如 octree 紧凑。
参数化 vs 隐式表示
可以把 1.3 和 1.4 放在一起比较:
| 能力 | 参数化表示 | 隐式表示 |
|---|---|---|
| 表面采样 | 直接 | 较难 |
| geodesic neighborhood | 直接或较容易 | 较难 |
| inside/outside 查询 | 较难 | 直接 |
| 距离查询 | 通常较难 | SDF 中直接 |
| 拓扑变化 | 较难 | 自然 |
| 渲染 | 网格/参数曲面较直接 | 通常需提取或求交 |
| 贴纹理 | 有参数域时方便 | 不方便 |
| 模型修补 | 不一定稳定 | 很适合 |
和后续章节的关系
隐式表示不是本书的主要操作对象,因为本书重点是 polygon mesh processing。
但隐式表示仍然很重要,因为它在后续任务中经常作为中间表示:
- mesh repair。
- signed distance field 误差控制。
- collision detection。
- CSG 建模。
- implicit-to-mesh conversion。
尤其在第 8 章模型修补中,把破损网格转为隐式场再提取新网格,是一类重要思路。
本节记忆点
- 隐式表面由标量函数的零水平集定义:
- 的符号可表示点在物体内部或外部。
- 隐式表示适合 inside/outside 查询、距离查询、CSG 和拓扑变化。
- signed distance function 是最常见、最自然的隐式表示。
- 隐式表示不擅长直接采样表面、获取 geodesic neighborhoods、渲染和贴纹理。
- regular grid 简单,但内存随精度三次增长。
- adaptive structures 只在表面附近或高曲率区域加密,能显著减少存储。
- three-color octree 将空间划分为 inside / outside / surface-crossing cells,只细分被表面穿过的 grey cells。
后续问题
进入 1.5 时可以重点关注:
- 如何从三角网格转换成 signed distance field?
- 如何从隐式场提取三角网格?
- 为什么每次表示转换都相当于一次 resampling?
- Marching cubes 如何从 voxel grid 中提取 isosurface?