参数化
参数化方法可大致分为四族:
- Single patch, fixed boundary. parametrize a disk-like part of the surface given fixed 2D positions for its boundary. 简单,高校,但是参数化后的map有很大distortion
- Single patch, free boundary. 减少了map distortion,但是可能出现self-intersection
- Global parametrization. 对任意亏格的网格均适用。初始的时候把网格切为多个patches,然后分别参数化。生成的maps在切边是不连续的(切边也称为seams,缝)
- Global seamless parametrization. 使得参数化结果”continuous“
Harmonic Parametrization
调和参数化是一种single patch,fixed boundary的算法。
算法步骤如下:
- 检测boundary vertices
- 把boundary vertices映射到一个圆上
- 计算两个harmonic functions(uv坐标)。调和函数使用固定在圆上的顶点作为边界约束
libigl实现
Eigen::VectorXi bnd;
igl::boundary_loop(V, F, bnd);
Eigen::MatrixXd bnd_uv;
igl::map_vertices_to_circal(V, bnd, bnd_uv);
igl::harmonic(V, F, bnd, bnd_uv, 1, V_uv);
bnd
是边界顶点的序列号,bnd_uv
是他们在UV平面上的位置,1表示我们使用harmonic function计算(2表示biharmonic,3表示triharmonic等等)
UV参数化结果可以展示为:
viewer.data().set_uv(V_uv);
LSCM (Least Squares Conformal Maps)
LSCM参数化是最小化conformal (angular) 失真,LSCM不需要固定边界。
LSCM最小化如下能量:
E
L
S
C
M
(
u
,
v
)
=
∫
X
1
2
∣
∇
u
⊥
−
∇
v
∣
2
d
A
E_{LSCM}(u,v)=\int_{X}\frac{1}{2}|\nabla u^{\perp }-\nabla 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}(u,v)=\frac{1}{2}[u,v]^t(L_{c}-2A)[u,v]
ELSCM(u,v)=21[u,v]t(Lc−2A)[u,v]
这里
L
c
L_c
Lc是余切Laplacian矩阵;A是面积变换矩阵,
[
u
,
v
]
t
A
[
u
,
v
]
[u,v]^tA[u,v]
[u,v]tA[u,v]和网格的vector area相等。
libigl首先使用igl::cotmatrix
计算余切矩阵
SparseMatrix<double> L;
igl::cotmatrix(V, F, L);
因为我们想同时对u和v坐标使用Laplacian matrix,把它扩展一下:
SparseMatrix<double> L_flat;
igl::repdiag(L, 2, L_flat);
面积矩阵A计算如下:
SparseMatrix<double> A;
igl::vector_area_matrix(F, A);
最终能量矩阵是 L f l a t − 2 A L_{flat}-2A Lflat−2A
ARAP (As-rigid-as-possible)
ARAP是single patch,free boundary方法。尽可能保留距离。每个三角形在映射到平面上时尽可能保留它的原始外形,顶多发生rigid rotation
首先,利用harmonic参数化计算ARAP的初始解
Eigen::VectorXi bnd;
igl::boundary_loop(F, bnd);
Eigen::MatrixXd bnd_uv;
igl::map_vertices_to_circle(V, bnd, bnd_uv);
igl::harmonic(V, F, bnd, bnd_uv, 1, initial_guess);
然后,初始化ARAP
igl::ARAPData arap_data;
arap_data.with_dynamics = true;
Eigen::VectorXi b = Eigen::VectorXi::Zero(0);
Eigen::MatrixXd bc = Eigen::MatrixXd::Zero(0, 0);
arap_data.max_iter = 100;
arap_precomputation(V, F, 2, b, arap_data);
接着,求解优化
V_uv = initial_guess;
arap_solve(bc, arap_data, V_uv);
N-rotationally Symmetric Tangent Fields
Tangent fields 这个东西是用来design guidance fields,为uniform quadrilateral 和 hexahedral remeshing服务的。Libigl提供了一些N-RoSy fields 的算法,
在libigl里,tangent unit-length vector fields 是piece-wise constant的,对三角网格的每个面片而言。每个面片上用一个或多个vectors描述。
函数igl::nrosy(V,F,b,bc,b_soft,b_soft_weight,bc_soft,N,0.5,output_field,output_singularities)
创建了一个光滑的单位长度向量场(N=1),从一个sparse set of constrained faces开始,faces的indices是b,它们的约束值定义在bc里。函数支持软约束,返回插值的场,还有场的奇异值。
所谓奇异值,是指场vanished的顶点。igl::nrosy
还能生成N-RoSy场,这是向量场的一种泛化,对每个面,向量取决去一个旋转常量
2
π
/
N
2\pi/N
2π/N。不同的N值,奇异值的样式和位置都不一样。
Global, Semless Integer-grid Parametrization
全局的,无缝的参数化,目标是把一个复杂形状参数化,使其和一个给定的set of directions对齐。目的是做surface remeshing。
Libigl提供了mixed integer quadrangulation paper的求解过程:
- 设计一个4-RoSy场(也叫cross field),描述了remeshing所需要对齐的边。这个场的约束通常是人工设置或者通过主曲率方向提取的。
- Combing and cutting。给定cross field后,需要把表面剪开,使其与圆盘拓扑同胚。这个可以直接在cross-field上做,也可以在它的bisector field(把cross-field旋转45度)上做。因为在后者上做更加stable和generic。因此我们首先旋转cross field,然后通过给每个面指定u和v方向,移除掉歧义的rotation。这个指定使用广度优先搜索,从任意一个face开始。这个过程类似梳毛,在某些点,无法一致性地区把整个表面捋顺,这些不连续边就定义了cut graph。最后,我们把combed filed旋转45度,恢复初始的角度。combed cross field可以认为是一个理想的Jacobian。
- Poisson参数化。网格沿着上述找到的缝切开,参数化通过计算试图找到两个标量函数,使其梯度和combed cross field匹配。 E ( u , v ) = ∣ ∇ u − X u ∣ 2 + ∣ ∇ v − X v ∣ 2 E(u,v)=|\nabla u-X_u|^2+|\nabla v-X_v|^2 E(u,v)=∣∇u−Xu∣2+∣∇v−Xv∣2。通过求解这个能量最小化问题,得到一个参数化表示,其中u和v等值线和输入的cross field是对齐的。我们通过增加interger constraints来对齐缝的两边。
这种参数化方法只能用于remeshing,因为它包含了很多overlaps
Anisotropic Remeshing
各项异的remeshing和非统一的quad remeshing对于concentrate the elements in the regions with more details十分重要。可以通过扩展MIQ quad meshing framework,使用一个mesh deformation方法来生成各项异的quad meshed。
输入是一个sparse set of constraints,定义了shape和所需的quads的scale。这个可以被编码成一个frame field(一对non-orthogonal和non-unit length vectors)。这个frame field可以通过分解成一个4-RoSy场和一个unique affine transformation来插值。这两部分可以分别插值。对cross field,使用igl::nrosy
,对affine part使用harmonic interpolant。
插值后,表面被warp,each frame被变形为一个正交的和单位长度的cross(移除了尺度和skewness from the frame)。这个变形定义了一个新的表面嵌入(embedding,同时一个新的metric)。
变形后的表面可以使用MIQ算法做各项异的remeshing。变形后的表面的uv坐标可以用来把参数化传递到原始表面。
Planarizatoin
一个quad mesh可以变形到一个平面quad mesh,使用Shape-Up方法。这是一种local/global方法,global step确保surface continuity,local step确保planarity。
igl::planarize