在计算机图形学中,我们将表面参数化表示为从表面到
R
2
R^2
R2 。它通常由网格的每个顶点的一组新的 2D 坐标编码(并且可能还通过与原始曲面的面一一对应的一组新面)请注意,此定义与经典微分几何定义相反。
参数化有很多应用,从纹理映射到表面重新网格化。 已经提出了许多算法,它们可以大致分为四个分支:
- 单面片,固定边界:这些算法可以参数化表面的盘状部分,给定其边界的固定 2D 位置。 这些算法高效且简单,但由于边界固定,它们通常会产生高失真的匹配。
- 单面片,自由边界:这些算法让边界自由变形,大大减少了地图失真。 应注意防止边界自相交。
- 全局参数化:这些算法适用于具有任意属的网格。 他们最初将网格切割成多个可以单独参数化的补丁。 生成的贴图在切口(通常称为接缝)上是不连续的。
- 全局无缝参数化:这些是隐藏接缝的全局参数化算法,使参数化“连续”,具体假设我们将在后面讨论。
谐波参数化
谐波参数化是一种单面片、固定边界参数化算法,将扁平网格的 2D 坐标计算为两个谐波函数。
该算法分为3个步骤:
- 检测边界顶点
- 将边界顶点映射到圆
- 计算两个调和函数(一个用于 u,一个用于 v 坐标)。 调和函数使用圆上的固定顶点作为边界约束。
该算法可以使用 libigl 进行编码,如下所示:
Eigen::VectorXi bnd;
igl::boundary_loop(V,F,bnd);
Eigen::MatrixXd bnd_uv;
igl::map_vertices_to_circle(V,bnd,bnd_uv);
igl::harmonic(V,F,bnd,bnd_uv,1,V_uv);
其中 bnd 包含边界顶点的索引,bnd_uv 它们在 UV 平面上的位置,“1”表示我们要计算调和函数(2 表示双谐波,3 表示三谐波,等等)。
请注意,这三个函数中的每一个都被设计为可在其他参数化算法中重用。
可以通过以下方式在查看器中可视化 UV 参数化:
viewer.data().set_uv(V_uv);
然后使用 UV 坐标将程序棋盘纹理应用于网格:
最小二乘保形贴图
最小二乘保形贴图参数化最小化了参数化的保形(角度)失真。 与谐波参数化不同,它不需要有固定的边界。
LSCM 最小化以下能量:
E
L
S
C
M
(
u
,
v
)
=
∫
X
1
2
∣
∇
u
⊥
−
∇
v
∣
2
d
A
E_{LSCM}(\mathbf u,\mathbf v)=\int_X\frac{1}{2}|\nabla \mathbf u^{\perp}-\nabla \mathbf v|^2dA
ELSCM(u,v)=∫X21∣∇u⊥−∇v∣2dA
使用矩阵的形式可以改写为
E
L
S
C
M
(
u
,
v
)
=
1
2
[
u
,
v
]
t
(
L
c
−
2
A
)
[
u
,
v
]
E_{LSCM}(\mathbf u,\mathbf v)=\frac{1}{2}[\mathbf u,\mathbf v]^t(L_c-2A)[\mathbf u,\mathbf v]
ELSCM(u,v)=21[u,v]t(Lc−2A)[u,v]
其中
L
c
L_c
Lc是一个余切拉普拉斯矩阵,A是一个使得
[
u
,
v
]
t
(
L
c
−
2
A
)
[
u
,
v
]
[\mathbf u,\mathbf v]^t(L_c-2A)[\mathbf u,\mathbf v]
[u,v]t(Lc−2A)[u,v]等于网格的矢量面积的矩阵。
使用 libigl,这个矩阵能量可以用几行代码编写。 余切矩阵可以使用 igl::cotmatrix 计算:
SparseMatrix<double> L;
igl::cotmatrix(V,F,L);
请注意,我们希望将拉普拉斯矩阵同时应用于 u 和 v 坐标,因此我们需要将其扩展为具有 2x2 单位矩阵的左 Kronecker 乘积:
SparseMatrix<double> L_flat;
igl::repdiag(L,2,L_flat);
面积矩阵用 igl::vector_area_matrix 计算:
SparseMatrix<double> A;
igl::vector_area_matrix(F,A);
最终的能量矩阵是
L
f
l
a
t
−
2
A
L_{flat}-2A
Lflat−2A。请注意,在这种情况下,我们不需要修复边界。 为了去除能量的零空间并使最小值唯一,将两个任意顶点固定到两个任意位置就足够了。 示例 502 中提供了完整的源代码。
尽可能刚性的参数化
As-rigid-as-possible 参数化是一种强大的单面片非线性算法,用于计算努力保持距离(以及角度)的参数化。这个想法与 ARAP 表面变形非常相似:每个三角形都映射到试图保持其原始形状的平面,直至进行刚性旋转。
该算法可以重复使用变形章节中讨论的函数来实现:igl::arap_precomputation 和 igl::arap_solve。 唯一的区别是优化必须在 2D 而不是 3D 中完成,并且我们需要计算一个起点。虽然对于 3D 变形,优化是使用原始网格自举的,但对于 ARAP 参数化,情况并非如此,因为起点必须是 2D 网格。在示例 503 中,我们使用谐波参数化初始化优化。 与 LSCM 类似,边界可以自由变形以最小化失真。
N-旋转对称切场
切场设计是用于设计均匀四边形和六面体网格重新划分的引导场的基本工具。Libigl 包含所有最先进算法的实现,用于设计 N-RoSy 字段及其泛化。
在 libigl 中,切线单位长度向量场在三角形网格的面上是分段常数,并且它们由每个面的一个或多个向量来描述。 函数
igl::nrosy(V,F,b,bc,b_soft,b_soft_weight,bc_soft,N,0.5,
output_field,output_singularities);
从一组稀疏的约束面开始创建一个平滑的单位长度向量场 (N=1),其索引在 b 中列出,它们的约束值在 bc 中指定.这些函数支持soft_constraints(b_soft、b_soft_weight、bc_soft),并返回三角形网格每个面的插值场(output_field),加上场的奇异性(output_singularities)。
奇点是场消失的顶点(在上图中以红色突出显示)。,这是向量场的概括,其中在每个面中,向量被定义为恒定旋转
π
/
2
\pi/2
π/2。从下图中可以看出,不同N生成的场的奇点类型不同,出现的位置也不同。
我们在示例 504 中演示了如何调用和绘制 N-RoSy 字段,其中可以按数字键更改字段的程度。 igl::nrosy 实现了 26 中提出的算法.N-RoSy 字段也可以使用许多其他算法进行插值,请参阅库 libdirectional 以获得最流行算法的参考实现。有关各种应用中使用的字段的完整分类,请参见 Vaxman 等人。 2016 年。
全局无缝整数网格参数化
以前的参数化方法专注于创建表面补丁的参数化,旨在纹理映射或烘焙其他表面属性,如法线和高频细节。全局无缝参数化旨在通过参数化对复杂形状进行参数化,该参数化与给定的一组方向对齐,以用于表面重新网格化。在 libigl 中,我们提供了混合整数四边形论文中提出的管道的参考实现。
第一步涉及 4-RoSy 场(有时称为交叉场)的设计,它描述了所需四边形重新网格化的边缘的对齐方式。场约束通常是手动指定或从主曲率方向提取的。在示例 506 中,我们只是将一张脸固定在随机方向上。
梳理和切割
给定交叉场,我们现在要切割表面,使其与圆盘同胚。虽然这可以直接在交叉场上完成,但我们选择在其平分场(旋转 45 度的场的副本)上执行此操作,因为它更稳定和通用。在平分线上工作使我们能够将广义的、非正交的和非单位长度的交叉场作为输入。
因此,我们旋转场,
我们通过为每个面分配一个 u 和一个 v 方向来消除旋转歧义。 分配是通过从随机面片开始的广度优先搜索完成的。
你可以把这个过程想象成梳理一个毛茸茸的表面:你将能够梳理它的一部分,但在某些时候你将无法始终梳理整个表面(毛球定理)。 梳理中的不连续点定义了割图:
最后,我们将梳状场旋转 45 度以撤消初始旋转度数:
梳状交叉场可以看作是参数化的理想雅可比行列式,将在下一节中计算。
泊松参数化
沿着接缝切割网格并计算参数化,试图找到两个标量函数,其梯度与梳状交叉场方向相匹配。这是一个经典的泊松问题,可以通过最小化以下二次能量来解决:
E
(
u
,
v
)
=
∣
∇
u
−
X
u
∣
2
+
∣
∇
v
−
X
v
∣
2
E(\mathbf u,\mathbf v)=|\nabla \mathbf u-X_u|^2+|\nabla \mathbf v-X_v|^2
E(u,v)=∣∇u−Xu∣2+∣∇v−Xv∣2
其中
X
u
X_u
Xu和
X
v
X_v
Xv表示精梳交叉场。解决这个问题会生成一个参数化,其 u 和 v 等值线与输入交叉场对齐。
我们通过向泊松问题添加整数约束来隐藏接缝,使每个接缝两侧的等值线对齐。
请注意,此参数化只能用于重新划分网格,因为它包含许多重叠。
可以使用 libQEx(未包含在 libigl 中)从此参数化中提取四边形网格。 完整的流水线在示例 505 中实现。
各向异性重新划分网格
各向异性和非均匀四边形重新划分网格对于将元素集中在具有更多细节的区域中非常重要。可以扩展 MIQ 四边形网格划分框架以使用网格变形方法生成各向异性四边形网格。
各向异性重新划分网格算法的输入是一组稀疏的约束,这些约束定义了所需四边形的形状和比例。这可以编码为帧字段,它是一对非正交和非单位长度的向量。帧场可以通过将其分解为 4-RoSy 场和独特的仿射变换来进行插值。 然后可以分别对这两个部分进行插值,对交叉场使用 igl::nrosy,对仿射部分使用谐波插值。
插值后,曲面被扭曲以将每个帧转换为正交和单位长度的交叉(即从帧中移除缩放和偏斜)。 这种变形为表面定义了一个新的嵌入(和一个新的度量)。
可以使用上一节中介绍的 MIQ 算法对变形表面进行各向同性重新划分网格。
然后可以使用变形表面的 UV 坐标将参数化传输到原始表面,其中等值线将跟踪四边形网格,其元素与输入帧字段中规定的形状相似。
我们的实现(示例 506)使用 MIQ 生成 UV 参数化,但也可以应用其他算法:唯一的要求是生成的四边形网格应尽可能各向同性。
平面化
可以使用 Shape-Up 将四边形网格转换为平面四边形网格,这是一种局部/全局方法,使用全局步骤来强制表面连续性和局部步骤来强制平面性。
示例 507 对四边形网格进行平面化,直到其满足用户给定的平面度阈值。