跳到主要内容

1.2 逼近能力

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

这一节讨论一个很实际的问题:真实物体的表面通常无法被数字模型精确表达,因此我们关心的是一种表示方法能以多高精度、用多低代价去逼近真实表面。

本节核心

真实物体或真实边界的精确数学模型通常不可得。

因此,数字表面表示一般只能是近似:

ShSS_h \approx S

其中:

  • SS 是理想真实表面。
  • ShS_h 是数字表示得到的近似表面。
  • hh 可以理解为分片大小、网格尺度或 voxel 尺寸。

为了让逼近问题更容易处理,通常会把整体表示域切成许多小片段,然后在每个小片段上用一个简单函数局部逼近真实形状。

这就是 piecewise representation 的基本思想。

为什么要分片逼近

复杂形状很难用一个全局函数表示。

例如,一个真实扫描模型可能包含:

  • 大尺度弯曲。
  • 局部细节。
  • 尖锐特征。
  • 噪声。
  • 拓扑复杂区域。

如果强行用一个全局函数去拟合,函数会非常复杂,计算和维护都困难。

更常见的做法是:

复杂整体形状
-> 切成很多局部片段
-> 每个片段用简单函数逼近
-> 拼成整体表面

对于参数曲面,常见片段是三角形或四边形参数域。

对于隐式表示,常见片段是体素 hexahedral cells 或 tetrahedral cells。

为什么常用多项式

数字几何处理需要高效计算。

多项式函数是自然选择,因为它们可以用基本算术运算快速求值:

+,,×,÷+,\quad -,\quad \times,\quad \div

此外,Weierstrass 逼近定理保证:足够光滑的函数可以被多项式逼近到任意精度。

因此,多项式既有理论保证,也有工程效率。

不过这并不意味着实际中总是使用高阶多项式。网格处理里更常见的是反方向:使用大量简单的低阶片。

误差和 h、p 的关系

设真实函数 gg 足够光滑,并且导数有界。

在长度为 hh 的区间上,用 pp 次多项式逼近它时,误差通常可以写成:

O(hp+1)O(h^{p+1})

直观解释:

  • hh 越小,局部片段越细,逼近越准确。
  • pp 越大,多项式阶数越高,单个片段的表达能力越强。

因此提高精度有两条路线。

p-refinement:提高阶数

p-refinement 指的是保持片段数量大致不变,但提高每个片段上的函数阶数。

例如:

线性片 -> 二次片 -> 三次片 -> 更高阶片

优点是单个 patch 的表达能力更强。

缺点是:

  • 高阶函数计算更复杂。
  • patch 之间的 CkC^k 连续条件更难满足。
  • 对离散采样数据来说,很难可靠估计高阶导数。
  • 高阶拟合容易受到噪声影响。

所以在真实扫描数据和网格处理中,p-refinement 并不总是最合适。

h-refinement:减小片段尺寸

h-refinement 指的是降低每个片段的尺寸,使用更多片段逼近表面。

例如:

粗网格 -> 细网格
大三角形 -> 小三角形
大 voxel -> 小 voxel

优点是:

  • 每个局部函数可以保持简单。
  • 更适合离散采样数据。
  • 更容易处理复杂拓扑和局部细节。
  • 现代硬件更擅长处理大量简单元素。

这也是 polygon mesh 在几何处理中流行的重要原因。

信息

几何处理中通常更偏爱 h-refinement,而不是 p-refinement。也就是宁愿用更多简单片段,也不轻易依赖少量高阶复杂片段。

为什么多边形网格成为主流

多边形网格可以看成一种极端但有效的选择:

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

也就是:

  • 每个面片是线性的。
  • 面片之间只要求位置连续。
  • 通常不要求切向或曲率连续。

这种表示看起来“低阶”,但非常实用。

原因是:

  • 面片简单,求交、渲染、遍历都高效。
  • 拓扑结构可以通过顶点、边、面直接表示。
  • 局部编辑和细分容易。
  • 扫描数据天然是离散的,很适合转成网格。
  • 大量简单元素在现代计算架构上通常比少量复杂元素更容易并行处理。

因此,虽然 polygon mesh 在光滑性上不如高阶曲面优雅,但它在几何处理任务中非常稳健。

参数曲面的误差理解

对于参数曲面,误差估计相对直接。

如果参数域被切成小片,每个小片尺寸约为 hh,并用 pp 次多项式逼近,那么误差可以按照函数值误差理解:

fg=O(hp+1)\|\mathbf{f} - \mathbf{g}\| = O(h^{p+1})

这里的重点是:参数函数本身直接给出表面点的位置,所以函数值误差自然对应几何位置误差。

隐式曲面的误差更微妙

隐式曲面不是由函数值直接给出位置,而是由零水平集定义:

S={xR3G(x)=0}S = \{\mathbf{x}\in \mathbb{R}^3 \mid G(\mathbf{x}) = 0\}

如果用另一个函数 FF 逼近 GG,近似曲面是:

SF={xR3F(x)=0}S_F = \{\mathbf{x}\in \mathbb{R}^3 \mid F(\mathbf{x}) = 0\}

问题是:函数值误差小,不自动等于零水平集的位置误差小。

需要把函数值误差转化成表面几何位置误差。

x\mathbf{x} 在近似隐式曲面 F=0F=0 上,真实曲面上对应点为:

x+d\mathbf{x}+\mathbf{d}

其中 d\mathbf{d} 沿着 FF 的法向方向。局部近似下有:

F(x+d)dF(x)|F(\mathbf{x}+\mathbf{d})| \approx \|\mathbf{d}\|\,\|\nabla F(\mathbf{x})\|

所以:

dF(x+d)F(x)\|\mathbf{d}\| \approx \frac{|F(\mathbf{x}+\mathbf{d})|}{\|\nabla F(\mathbf{x})\|}

如果函数逼近误差是:

FG=O(hp+1)|F-G| = O(h^{p+1})

并且梯度大小有下界:

Fε>0\|\nabla F\| \geq \varepsilon > 0

那么几何位置误差也能得到:

d=O(hp+1)\|\mathbf{d}\| = O(h^{p+1})
注意

对于隐式表示,梯度不能太小。若 F\|\nabla F\| 接近 0,函数值上的小误差可能被放大成很大的表面位置误差。

梯度大小为什么重要

隐式曲面的法向由梯度给出:

n=FF\mathbf{n} = \frac{\nabla F}{\|\nabla F\|}

如果 F\|\nabla F\| 很小,曲面局部会接近退化,零水平集的位置对函数值扰动非常敏感。

因此在实际隐式逼近中,往往希望构造一个梯度幅值变化较小的 FF

这样误差不会在某些区域被过度放大,表面逼近误差也会更均匀。

和 1.1 的关系

1.1 讲的是表面应该满足什么性质:

  • manifold
  • orientable
  • smooth
  • fair
  • 可由离散样本建立合理邻域

1.2 接着说明:即使有了表面定义,数字表示仍然只是近似。

所以后续算法必须同时考虑两件事:

  1. 表示是否拓扑和几何上合理。
  2. 表示的逼近误差是否可控。

这也是为什么 polygon mesh processing 既关心数据结构,也关心误差、光滑、采样和细分。

本节记忆点

  • 真实物体的精确数学模型通常不可得,数字表面一般只能近似。
  • 复杂表面通常通过 piecewise representation 分片逼近。
  • 多项式常用于局部逼近,因为计算简单且有逼近理论支持。
  • 误差通常随片段大小和多项式阶数满足:
O(hp+1)O(h^{p+1})
  • 提高精度有两条路:
    • p-refinement:提高多项式阶数。
    • h-refinement:减小片段尺寸、增加片段数量。
  • 几何处理中通常更偏爱 h-refinement。
  • polygon mesh 是 C0C^0 piecewise linear surface,因此简单、高效、适合离散采样输入。
  • 对隐式曲面,函数值误差需要通过梯度转换成几何位置误差。
  • F\|\nabla F\| 太小,隐式曲面的零水平集位置会变得不稳定。

后续问题

进入 1.3 时可以重点关注:

  1. 参数曲面为什么能把表面上的 3D 问题转到 2D 参数域中?
  2. 参数化表示在哪些操作上高效?
  3. 为什么参数曲面对拓扑修改和 inside/outside 查询不友好?
  4. spline / NURBS 和 polygon mesh 的取舍在哪里?