本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
点个star::github.com/Bailey-24/G…
一、实验目的
参数化,是指一个函数,把3D表面以一一对应的方式映射到2D域。网格参数化的最终目的是求出从网格上的3d坐标到参数域平面的uv坐标之间的映射,即 g:(x,y,z)→(u,v) ,如何求解3D顶点对应的参数域顶点的uv坐标,一旦每个顶点的uv坐标计算出来了,每个三角形内部的uv值可以通过重心坐标系求出来。参数化最常见的应用是纹理贴图,如下图所示,左下角是一个2D的平面,将其贴到右边的三维模型上。
二、实验内容
本实验可分为两个子实验,固定边界法和活动边界法。
第一,固定边界法对网格进行参数化的时候,首先将网格的边界顶点的参数值固定在一个凸多边形上(比如实验要求的单位圆),然后对内部顶点的参数值进行求解,本实验的固定边界法为tutte 映射。
第二,活动边界法使用最小二乘保角映射(LSCM:Least Square Conformal Maps),这是一种准保角(Quasi-Conformal)的算法。通过对柯西-黎曼方程的最小二乘逼近,定义一个使角度变形取得最小值的能量函数,相应得到一个线性方程组。LSCM方法的最优解具有存在性和唯一性,这样避免了局部最优解,且能够比较好地保持原始网格的面积,也能够得到更小的角度扭曲,在保角方面的效果更好。简单而言,保角映射的直观几何特点就是,参数域上一个圆,映射到曲面的切平面上依然是一个圆(只是进行了旋转,平移,和等比缩放)。
三、实验步骤
点个star::github.com/Bailey-24/G…
3.1 补全 tutte.cpp 文件
功能需求:给定一个具有盘(disk)拓扑结构的三维网格(V,F),根据单位圆盘内的tutte映射计算一个二维参数化。所有的边界顶点都应该被映射到单位圆上,且内部顶点被映射到圆盘内而没有局部翻转。
步骤 :a) 将边界顶点映射到单位圆上,得到uv坐标系的边界约束;
b) 根据下式构建拉普拉斯矩阵;
L i j = { w i j if i ≠ j and ∃ { i j } ∈ E , − ∑ ℓ ≠ i L i ℓ if i = j , or 0 otherwise L_{i j}=\left\{\begin{array}{ll}
w_{i j} & \text { if } i \neq j \text { and } \exists\{i j\} \in \mathbf{E}, \\
-\sum_{\ell \neq i} L_{i \ell} & \text { if } i=j, \text { or } \\
0 & \text { otherwise }
\end{array}\right. L ij = ⎩ ⎨ ⎧ w ij − ∑ ℓ = i L i ℓ 0 if i = j and ∃ { ij } ∈ E , if i = j , or otherwise
c) 最小化能量方程min U 1 2 tr ( U ⊤ L U ) \min _{\mathbf{U}} \frac{1}{2} \operatorname{tr}\left(\mathbf{U}^{\top} \mathbf{L} \mathbf{U}\right) min U 2 1 tr ( U ⊤ LU ) 得到参数域顶点的uv坐标。
3.2 补全 lscm.cpp 文件
功能需求: 给定带边界的三维网格(V,F),计算一个二维参数化,使最小二乘保角能量∫ S ∥ ∇ v − ( ∇ u ) ⊥ ∥ 2 d A \int_{\mathbf{S}}\left\|\nabla v-(\nabla u)^{\perp}\right\|^{2} d A ∫ S ∥ ∥ ∇ v − ( ∇ u ) ⊥ ∥ ∥ 2 d A 最小,其中u u u 和v v v 是参数域U U U 中的未知(输出)坐标。
步骤 :
a) 根据下式,构建离散的最小二乘保角映射的矩阵Q Q Q ;
min U ∈ R 2 n U ⊤ ( ( L 0 0 L ) − A ) ⏟ Q U \min _{\mathbf{U} \in \mathbb{R}^{2 n}} \mathbf{U}^{\top} \underbrace{\left(\left(\begin{array}{cc}
\mathbf{L} & 0 \\
0 & \mathbf{L}
\end{array}\right)-\mathbf{A}\right)}_{\mathbf{Q}} \mathbf{U} U ∈ R 2 n min U ⊤ Q ( ( L 0 0 L ) − A ) U
其中 L ∈ R n × n L\in \mathbb{R}^{n \times n} L ∈ R n × n 是余切拉普拉斯矩阵,Q ∈ R 2 n × 2 n \mathbf{Q} \in \mathbb{R}^{2 n \times 2 n} Q ∈ R 2 n × 2 n 是一个稀疏的余切拉普拉斯矩阵。
b) 根据下式,构建稀疏平方约束矩阵B ∈ R 2 n × 2 n \mathbf{B} \in \mathbb{R}^{2 n \times 2 n} B ∈ R 2 n × 2 n
U ⊤ ( M 0 0 M ) ⏟ B U = 1 , \mathbf{U}^{\top} \underbrace{\left(\begin{array}{cc}
\mathbf{M} & 0 \\
0 & \mathbf{M}
\end{array}\right)}_{\mathbf{B}} \mathbf{U}=1, U ⊤ B ( M 0 0 M ) U = 1 ,
其中M ∈ R n × n M\in \mathbb{R}^{n \times n} M ∈ R n × n 是分段线性三角网格的质量矩阵;
c) 将步骤1的优化问题看成求解广义特征值问题,特征值分解后得特征向量并赋给矩阵U U U ;
d) 然后用奇异值分解法找到一个旋转矩阵,使最小二乘保角映射后的旋转和平移保持不变。
3.3 补全 vector_area_matrix.cpp 文件
功能需求:构建一个对称的面积矩阵A A A ,其中,网格(V,F)的向量面积是[ V . c o l ( 0 ) ′ V . c o l ( 1 ) ′ ] ∗ A ∗ [ V . c o l ( 0 ) V . c o l ( 1 ) ] [V.col(0)' \ V.col(1)'] * A * [V.col(0)\ V.col(1)] [ V . co l ( 0 ) ′ V . co l ( 1 ) ′ ] ∗ A ∗ [ V . co l ( 0 ) V . co l ( 1 )] ,也就是将不对称的面积矩阵转换成对称的面积矩阵。
步骤 :a) 找到网格的边界顶点的有序列表;
b) 对于在有序列表中的每条边(i,j),A ~ [ i , j + n ] = 1 , A ~ [ i + n , j ] = 1 Ã[i, j+n] = 1,Ã[i+n, j] = 1 A ~ [ i , j + n ] = 1 , A ~ [ i + n , j ] = 1 ,根据1 / 2 ( x i y j − x j y i ) 1/2 (x_i y_j - x_j y_i) 1/2 ( x i y j − x j y i ) 计算网格的向量面积;
c) 根据下式,构建对称的向量面积矩阵A A A 。
x ⊤ A ~ x = x ⊤ 1 2 ( A ~ + A ~ ⊤ ) ⏟ A x = x ⊤ A x \mathbf{x}^{\top} \tilde{\mathbf{A}} \mathbf{x}=\mathbf{x}^{\top} \underbrace{\frac{1}{2}\left(\tilde{\mathbf{A}}+\tilde{\mathbf{A}}^{\top}\right)}_{\mathbf{A}} \mathbf{x}=\mathbf{x}^{\top} \mathbf{A} \mathbf{x} x ⊤ A ~ x = x ⊤ A 2 1 ( A ~ + A ~ ⊤ ) x = x ⊤ Ax
3.4 结果与验证
经验证,固定边界法的tutte映射和活动边界法的LSCM算法都与原作者结果相似。
tutte映射结果。
Tutte的重心映射能将曲面的边界点固定在单位圆上,而且找到内部点的uv坐标,使曲面能与平面域双射。
lscm结果。
lscm算法能够很好地满足曲面到参数域空间映射函数的保角性条件,也就是曲面的顶点之间的夹角是90°,在参数域上也是90°。
四、总结分析
本实验学到了固定边界法的tutte映射和活动边界法的LSCM 算法。
Tutte的重心映射是给定一个与圆盘拓扑同胚的三角化表面,如果它的边界顶点分布在一个凸多边形上,且内部顶点可以其邻居凸组合,则(u,v)坐标构成一个有效的参数化(无自交)。
最小二乘保角映射LSCM算法,不需要固定边界来进行网格模型参数化,最小化目标函数可以使参数化后的角度变形最小,同时最小值唯一(即解线性方程),避免局部最优解。
本文正在参加「金石计划」