这个系列是GAMES301-曲面参数化(GAMES 301: Surface Parameterization)的同步课程笔记。课程内容涉及曲面参数化的基本理论与问题描述、面向离散网格的参数化、基于基函数表示的连续参数化、共形参数化、曲面参数化的应用等。本节课主要介绍网格上的无翻转光滑映射。
网格的坐标可以看做是关于顶点的函数(映射),而对于三角网格来说这个映射则是一个分片线性函数。我们可以在网格每个顶点上定义一个仅在当前顶点取1,在其它顶点上取0的函数作为基函数:
\[b_j (x_i) = \delta_{ij} = \begin{cases} 1, & i = j \\ 0, & i \neq j \\ \end{cases}\]这样整个网格上的坐标就可以表达为基函数的线性组合,组合系数为每个顶点上的坐标值:
\[f(x_i) = \sum_{j} y_j b_j(x_i)\]而对于三角形内部,我们则可以利用三个顶点上的函数值来进行线性插值。

显然这样定义的函数是不光滑的,而且在相邻三角形上的导数也往往是不连续的。而在很多几何处理任务中我们都希望网格上定义的函数尽可能光滑,这就需要使用一些更加光滑的基函数。

光滑映射构造
网格上常用的光滑映射包括RBF函数、广义中心坐标、调和映射以及样条函数等。
RBF
RBF函数使用输入点\(x\)关于参考点\(p_i\)的距离来构造出光滑基函数。在图像处理中的图像变形就可以使用RBF基函数来实现。需要注意的是尽管RBF函数非常光滑,但是它无法张成多项式函数空间。

广义重心坐标
广义重心坐标(generalized barycentric coordinate, GBC)是对重心坐标的推广。回忆三角形内部的任一点的坐标都可以通过三个顶点坐标进行插值来得到,且它们的权重之和为1。如果我们放宽权重为正的限制,中心坐标还可以表示三角形外的点。

可以证明三角形上重心坐标的不同形式之间最多只相差一个缩放因子,而最常用的重心坐标是使用内部点\(v\)与对边所定义的小三角形与整个三角形面积的比值来定义。如此定义的中心坐标具有归一性、重现性、非负性等优良性质。

对于多边形,我们可以把三角形重心坐标的概念进行推广从而得到广义重心坐标GBC。此时多边形内部的点同样可以由顶点坐标通过加权来得到,不过这种情况下的权重一般没有非负性。

多边形上的GBC的形式是不唯一的。均值坐标(mean value coordinate)是由到内部点\(v\)到顶点\(v_i\)的边长以及两边的夹角来定义,而且对于星形的多边形均值坐标是非负的。

其它常用的GBC还有Wachspress坐标、离散调和坐标等。


除了上面提到的GBC外,还有一类GBC不是通过显式构造而是通过求解方程来获得的,比如说调和坐标(harmonic coordinate)就是通过求解Laplace方程来确定的。

GBC的基本功能是进行插值,在插值的基础上像网格动画、着色、图像编辑以及计算向量场等高级任务也可以利用GBC来实现。

使用GBC来计算光滑映射时首先需要选择多边形内部的一点\(v\),利用重现性可以将其坐标表示为顶点坐标的加权和:
\[v = \sum_i b_i (v) v_i\]对多边形进行变形相当于在顶点上构造了一个函数\(f\),将原始坐标\(v_i\)映射为\(x_i\)。此时我们保持权重系数不变,\(v\)则会映射为:
\[f(v)= \sum_i b_i (v) x_i\]这样只需要调整多边形控制点的坐标就实现了一个多边形到另一个多边形的映射。

如果再将权重系数拓展为复数还可以得到柯西复重心坐标,它可以保证构造出的映射是全纯(holomorphic)的,也可以用它来构造调和映射(harmonic mapping)。

调和映射
调和映射在数学上是指满足Laplace方程的映射,可以证明调和映射无穷阶可导、满足极值原理(极大值或极小值位于边界上)、而且在给定边界条件下调和映射是唯一的。

调和映射\(f\)可以分解为全纯映射\(\Phi\)以及反全纯映射\(\bar{\Psi}\)两部分,它们都可以通过前面介绍过的柯西复重心坐标来得到。

这样在构造调和映射时只需要先利用柯西坐标构造两个全纯映射\(\Phi\)和\(\Psi\),然后对\(\Psi\)求共轭并加上\(\Phi\)就得到了所需的调和映射。

样条
介绍样条基之前首先来回顾一下Bezier曲线。在工业设计中Bezier曲线只需要用户选取一系列控制点就可以生成光滑的曲线。

在此基础上人们还提出了B-样条(B-spline)。



除了曲线之外,样条的思想还可以拓展到曲面上。

利用张量积可以将两个一维变量组合成一个二维变量,这样就可以构造出Bezier曲面。







无翻转光滑映射
回到参数化的问题,利用光滑映射可以将原始参数化的分片线性映射提升为光滑映射。回忆参数化的过程可以建模为一个约束优化问题:网格上的能量等于每个三角形能量按照面积进行加权的和,同时每个三角形的Jacobian矩阵行列式必须为正。由于映射在每个三角形上都是线性的,Jacobian矩阵在三角形内部为常数。而对于光滑映射来说Jacobian矩阵在三角形上每一点都是不同的,我们要求任意位置上Jacobian矩阵的行列式恒为正,这就给求解带来了困难。

为了使整个优化问题是可解的,我们需要在三角形上进行采样并保证采样点上满足相应的约束。当然这种方法只能保证采样点上没有翻转,理论上无法保证整个网格上没有翻转。

基于Lipschitz连续性的无翻转光滑映射
如果我们假设映射满足Lipschitz连续,那么在任意点\(p\)的邻域上Jacobian矩阵的范数有界。这样只需要要求\(p\)点上的Jacobian矩阵满足\(J(p) > Lr\)就可以保证邻域上没有翻转。更进一步,我们可以要求映射在所有采样点上都满足这样的条件且采样点的邻域覆盖整个区域,此时可以保证全局没有翻转。

基于样条基凸包性质的无翻转光滑映射
另一种保证全局无翻转的思路是利用样条基的凸包性质。回忆Bezier曲线的凸包性质,曲线会位于控制点构成的凸包内部。我们可以把内部点的Jacobian矩阵行列式表示为控制点上行列式的线性(凸)组合,这样只要保证控制点上的行列式值非负即可。
