跳到主要内容

1.3 参数化表面表示

来源:Mario Botsch 等人的 Polygon Mesh Processing,第 1 章 Surface Representations,1.3 小节 Parametric Surface Representations。

这一节讨论参数化表面表示。它的基本思想是:用一个二维参数域 Ω\Omega 上的函数,把二维点映射到三维表面。

本节核心

参数化表面用一个向量值函数定义:

f:ΩS\mathbf{f}: \Omega \rightarrow S

其中:

ΩR2,SR3\Omega \subset \mathbb{R}^2, \qquad S \subset \mathbb{R}^3

也就是说,表面上的点由二维参数坐标生成:

p=f(u,v)\mathbf{p}=\mathbf{f}(u,v)

这种表示的核心优势是:很多原本发生在三维表面 SS 上的问题,可以转化到二维参数域 Ω\Omega 中处理。

参数化表示的优势

采样方便

如果想在表面上采样点,可以先在参数域中采样:

(u,v)Ω(u,v)\in \Omega

然后计算:

p=f(u,v)\mathbf{p}=\mathbf{f}(u,v)

这样就把三维表面采样问题变成了二维域采样问题。

邻域关系清楚

在参数化表示中,geodesic neighborhood 比较容易获得。

如果两个参数点在 Ω\Omega 中相邻:

(u1,v1)(u2,v2)(u_1,v_1) \approx (u_2,v_2)

那么它们映射到表面上的点通常也是表面邻近点:

f(u1,v1)f(u2,v2)\mathbf{f}(u_1,v_1) \approx \mathbf{f}(u_2,v_2)

这比直接在三维空间中根据欧氏距离判断邻域更可靠,因为空间距离近不一定表示沿表面相邻。

变形操作直接

如果有一个三维变形函数:

d:R3R3\mathbf{d}: \mathbb{R}^3 \rightarrow \mathbb{R}^3

那么可以通过函数复合修改表面:

df\mathbf{d}\circ \mathbf{f}

也就是:

(u,v)d(f(u,v))(u,v) \mapsto \mathbf{d}(\mathbf{f}(u,v))

这让某些几何编辑和自由形变操作比较自然。

参数化表示的弱点

参数化表面并不总是方便。

最大的问题是:参数域 Ω\Omega 必须匹配表面 SS 的拓扑和度量结构。

参数化本身可能很难

复杂表面通常很难找到一个低失真的参数化。

所谓低失真,是指参数域和三维表面上的距离、角度、面积变化尽量一致。

如果表面被拉伸、扭曲、折叠得很厉害,参数化质量就会下降。

这也是为什么后续第 5 章会专门讨论 parameterization。

拓扑修改困难

如果 f\mathbf{f} 连续且单射,那么表面 SS 的拓扑基本由参数域 Ω\Omega 决定。

这意味着,如果要改变表面拓扑,例如:

  • 合并两个区域。
  • 切开一个区域。
  • 删除一块表面。
  • 打洞或补洞。

就不能只改三维表面,还要同时改参数域和参数化函数。

这通常很麻烦。

空间查询不方便

对于参数曲面,inside / outside 查询、signed distance 查询、closest point 查询通常不便宜。

例如,给定三维点 x\mathbf{x},想知道它到表面 SS 的最近点,需要求:

min(u,v)Ωxf(u,v)\min_{(u,v)\in \Omega} \|\mathbf{x}-\mathbf{f}(u,v)\|

这一般是一个非线性优化问题。

同样,自交检测也比较困难,因为需要判断参数域中不同点是否映射到同一个三维位置。

注意

参数化表示擅长采样、局部邻域和表面编辑,但不擅长拓扑变化、inside/outside 查询和自交检测。

1.3.1 Spline Surfaces

Spline surfaces,尤其是 tensor-product spline surfaces,也就是常说的 NURBS,是 CAD 系统中的标准表面表示。

它们常用于:

  • 高质量曲面建模。
  • Class A 曲面。
  • 工业设计。
  • 自由曲面编辑。

Tensor-product spline 的形式

一个双变量 tensor-product spline surface 可以写成:

f(u,v)=i=0mj=0kcijNin(u)Njn(v)\mathbf{f}(u,v) = \sum_{i=0}^{m} \sum_{j=0}^{k} \mathbf{c}_{ij}N_i^n(u)N_j^n(v)

其中:

  • cij\mathbf{c}_{ij} 是控制点。
  • Nin(u)N_i^n(u)Njn(v)N_j^n(v) 是 B-spline 基函数。
  • 控制点组成 control mesh。

如果基函数满足非负性和 partition of unity:

Nin(u)0,iNin(u)=1N_i^n(u)\geq 0, \qquad \sum_i N_i^n(u)=1

那么表面点就是控制点的凸组合。

这带来两个重要性质:

  1. 表面位于控制网格的凸包内。
  2. 控制点只在局部范围内影响曲面。

因此,设计者可以通过移动控制点比较直观地调整曲面形状。

Spline 的局限

Tensor-product surface 本质上来自矩形参数域:

[un,um]×[vn,vk][u_n,u_m]\times [v_n,v_k]

所以它天然表示的是一个矩形曲面片。

如果要表示拓扑复杂的形状,就必须把模型拆成很多 patches。

这会带来问题:

  • CAD 模型可能包含大量曲面片。
  • patch 之间必须满足光滑连接约束。
  • 全局编辑时要维护很多拓扑和几何条件。
  • 后续处理会变复杂。

此外,传统 tensor-product spline 的局部 refinement 也不方便。

如果想增加控制点,通常要切分整行或整列参数区间,这会影响一大片区域,而不是只影响局部。

书中提到 T-splines 可以缓解这个问题,因为它们支持更局部的控制网格细化。

1.3.2 Subdivision Surfaces

Subdivision surfaces 可以看作 spline surfaces 的推广。

它们同样由粗控制网格控制,但相比 tensor-product splines,它们可以表示任意拓扑的曲面。

基本过程是:

粗控制网格
-> 拓扑细分
-> 根据局部 averaging rules 更新顶点位置
-> 重复迭代
-> 极限曲面

经过精心设计的细分规则,在极限情况下可以得到具有可证明光滑性的曲面。

Subdivision 的优点

Subdivision surfaces 的优点包括:

  • 不像 tensor-product splines 那样受矩形 patch 拓扑限制。
  • 可以处理任意流形拓扑。
  • 具有天然层级结构。
  • 适合高效的多分辨率处理。

它在动画、建模和高质量曲面表示中很常见。

Subdivision 的限制

Subdivision surfaces 也有限制。

它们生成的网格具有 semiregular subdivision connectivity。

也就是说,网格连接关系必须来自某个粗网格的重复均匀细分。

但现实中的任意三角网格通常不满足这种连接结构。

如果要把任意网格变成 subdivision connectivity,就需要先 remesh。

这个过程相当于重新采样表面,可能造成:

  • 采样伪影。
  • 信息损失。
  • 特征变钝。
  • 局部细节变化。

因此,本书的目标更偏向直接处理 arbitrary triangle meshes,而不是要求输入先变成 subdivision mesh。

1.3.3 Triangle Meshes

很多几何处理算法把 triangle mesh 简单看成一堆三角形。

但从数学上看,每个三角形都可以通过 barycentric parameterization 定义一个 piecewise linear surface patch。

重心坐标

对于三角形:

[a,b,c][\mathbf{a},\mathbf{b},\mathbf{c}]

内部任意点 p\mathbf{p} 可以唯一写成:

p=αa+βb+γc\mathbf{p} = \alpha \mathbf{a} +\beta \mathbf{b} +\gamma \mathbf{c}

并满足:

α+β+γ=1,α,β,γ0\alpha+\beta+\gamma=1, \qquad \alpha,\beta,\gamma\geq 0

这里的 α,β,γ\alpha,\beta,\gamma 就是 barycentric coordinates。

如果参数域中也选一个三角形:

[u,v,w][\mathbf{u},\mathbf{v},\mathbf{w}]

那么可以定义线性映射:

αu+βv+γwαa+βb+γc\alpha\mathbf{u} +\beta\mathbf{v} +\gamma\mathbf{w} \mapsto \alpha\mathbf{a} +\beta\mathbf{b} +\gamma\mathbf{c}

这说明每个三角形本身就是一个简单的参数曲面片。

三角网格由几何和拓扑组成

一个三角网格 MM 包含两部分。

拓扑部分

拓扑部分描述哪些顶点连成哪些面。

顶点集合:

V={v1,,vV}V=\{v_1,\ldots,v_V\}

三角面集合:

F={f1,,fF},fiV×V×VF=\{f_1,\ldots,f_F\}, \qquad f_i\in V\times V\times V

有时为了高效处理,也会显式存储边集合:

E={e1,,eE},eiV×VE=\{e_1,\ldots,e_E\}, \qquad e_i\in V\times V

几何部分

几何部分给每个顶点一个三维位置:

pi=p(vi)=[x(vi)y(vi)z(vi)]R3\mathbf{p}_i = \mathbf{p}(v_i) = \begin{bmatrix} x(v_i)\\ y(v_i)\\ z(v_i) \end{bmatrix} \in \mathbb{R}^3

一旦顶点位置确定,每个三角面就嵌入到了三维空间中。

信息

即使网格只显式存了离散顶点和三角面,它表示的仍然是一个连续的 piecewise linear surface,而不只是一些离散点。

三角网格的逼近误差

如果用三角网格去逼近一个足够光滑的表面,piecewise linear approximation 的误差阶为:

O(h2)O(h^2)

其中 hh 是最大边长。

这意味着,如果把边长减半:

hh2h \mapsto \frac{h}{2}

误差大约变为:

(12)2=14\left(\frac{1}{2}\right)^2 = \frac{1}{4}

但每个三角形会被分成 4 个小三角形,因此面数大约变为:

F4FF \mapsto 4F

所以三角网格的逼近误差大致和面数成反比。

曲率决定局部采样密度

误差的实际大小和真实表面的二阶项有关,也就是和曲率有关。

因此,合理的网格不应该均匀到处加密,而应该自适应:

  • 平坦区域:低采样密度。
  • 高曲率区域:高采样密度。
  • sharp feature 附近:保留更多几何元素。

这就是很多 remeshing / simplification / adaptive sampling 方法的核心原则。

三角网格的 2-manifold 条件

一个三角网格是 2-manifold,意味着每个点附近都像二维圆盘,边界处像半圆盘。

对三角网格来说,常见的 non-manifold 问题包括:

  • non-manifold edge:一条边关联超过两个三角形。
  • non-manifold vertex:多个面片团只在一个顶点处粘在一起。
  • self-intersection:表面发生自相交。

这些结构会破坏局部 geodesic neighborhood,使得很多算法无法定义稳定邻域。

注意

非流形网格不是单纯“不好看”,而是会让邻域、法向、曲率、参数化、平滑等基本操作失去明确意义。

Euler 公式和网格规模关系

对于闭合且连通的三角网格,有 Euler 公式:

VE+F=2(1g)V-E+F=2(1-g)

其中 gg 是 genus,可以直观理解为“洞柄数量”:

  • sphere:g=0g=0
  • torus:g=1g=1
  • double torus:g=2g=2

在很多实际模型中,gg 相比顶点、边、面数量很小,因此右侧可以近似忽略。

又因为:

  • 每个三角形有 3 条边。
  • 每条内部流形边被 2 个三角形共享。

所以有近似关系:

F2VF\approx 2V E3VE\approx 3V

平均顶点 valence 约为:

66

这些关系在分析网格算法复杂度、数据结构内存占用、文件格式规模时很有用。

三类参数化表示的对比

表示优点局限
Spline / NURBS高质量光滑曲面,适合 CADpatch 管理复杂,拓扑受限,局部 refinement 不方便
Subdivision surface支持任意流形拓扑,层级结构好需要 semiregular subdivision connectivity
Triangle mesh简单、高效、适合任意离散输入只有 C0C^0 连续,光滑性需要离散估计

本书后续重点选择 triangle meshes,是因为它们灵活、直接、适合扫描和一般几何处理任务。

和 1.2 的关系

1.2 说明几何处理中更偏好:

h-refinement > p-refinement

也就是用更多简单片段逼近复杂表面。

1.3 中的 triangle mesh 正是这种思想的代表:

C0 piecewise linear surfaceC^0 \text{ piecewise linear surface}

它牺牲了一部分解析光滑性,换来了简单、局部、灵活和高效。

本节记忆点

  • 参数化表面由 f:ΩS\mathbf{f}:\Omega\rightarrow S 定义,把二维参数域映射到三维表面。
  • 参数化表示适合采样、表面邻域、纹理和某些变形操作。
  • 参数化表示不擅长拓扑修改、inside/outside 查询和自交检测。
  • NURBS 是 CAD 中常用的 tensor-product spline surface。
  • Tensor-product splines 对复杂拓扑不友好,通常需要很多 patches。
  • Subdivision surfaces 可以表示任意流形拓扑,但要求 subdivision connectivity。
  • Triangle mesh 是 piecewise linear parametric surface。
  • 三角网格包含拓扑 V,E,FV,E,F 和几何顶点位置 PP
  • 三角网格逼近光滑表面的误差为 O(h2)O(h^2)
  • 对闭合连通三角网格,近似有 F2VF\approx 2VE3VE\approx 3V、平均 valence 约为 6。

后续问题

进入 1.4 时可以重点关注:

  1. 隐式表面为什么更适合 inside/outside 查询?
  2. 为什么 signed distance function 是自然的隐式表示?
  3. 隐式表示为什么方便拓扑变化,但不方便采样和贴纹理?
  4. regular grid 和 adaptive data structures 的内存开销差别在哪里?