【传统图形学算法】游戏三维模型贴图常用技术:网格参数化 | 降维打击

884 阅读4分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。 点个star::github.com/Bailey-24/G…

一、实验目的

参数化,是指一个函数,把3D表面以一一对应的方式映射到2D域。网格参数化的最终目的是求出从网格上的3d坐标到参数域平面的uv坐标之间的映射,即 g:(x,y,z)→(u,v) ,如何求解3D顶点对应的参数域顶点的uv坐标,一旦每个顶点的uv坐标计算出来了,每个三角形内部的uv值可以通过重心坐标系求出来。参数化最常见的应用是纹理贴图,如下图所示,左下角是一个2D的平面,将其贴到右边的三维模型上。

image.png

二、实验内容

本实验可分为两个子实验,固定边界法和活动边界法。 第一,固定边界法对网格进行参数化的时候,首先将网格的边界顶点的参数值固定在一个凸多边形上(比如实验要求的单位圆),然后对内部顶点的参数值进行求解,本实验的固定边界法为tutte 映射。 第二,活动边界法使用最小二乘保角映射(LSCM:Least Square Conformal Maps),这是一种准保角(Quasi-Conformal)的算法。通过对柯西-黎曼方程的最小二乘逼近,定义一个使角度变形取得最小值的能量函数,相应得到一个线性方程组。LSCM方法的最优解具有存在性和唯一性,这样避免了局部最优解,且能够比较好地保持原始网格的面积,也能够得到更小的角度扭曲,在保角方面的效果更好。简单而言,保角映射的直观几何特点就是,参数域上一个圆,映射到曲面的切平面上依然是一个圆(只是进行了旋转,平移,和等比缩放)。

image.png

三、实验步骤

点个star::github.com/Bailey-24/G…

3.1 补全 tutte.cpp 文件

功能需求:给定一个具有盘(disk)拓扑结构的三维网格(V,F),根据单位圆盘内的tutte映射计算一个二维参数化。所有的边界顶点都应该被映射到单位圆上,且内部顶点被映射到圆盘内而没有局部翻转。 步骤 :a) 将边界顶点映射到单位圆上,得到uv坐标系的边界约束; b) 根据下式构建拉普拉斯矩阵;

Lij={wij if ij and {ij}E,iLi 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.

c) 最小化能量方程minU12tr(ULU)\min _{\mathbf{U}} \frac{1}{2} \operatorname{tr}\left(\mathbf{U}^{\top} \mathbf{L} \mathbf{U}\right)得到参数域顶点的uv坐标。

3.2 补全 lscm.cpp 文件

功能需求: 给定带边界的三维网格(V,F),计算一个二维参数化,使最小二乘保角能量Sv(u)2dA\int_{\mathbf{S}}\left\|\nabla v-(\nabla u)^{\perp}\right\|^{2} d A最小,其中uuvv是参数域UU中的未知(输出)坐标。

步骤 : a) 根据下式,构建离散的最小二乘保角映射的矩阵QQ

minUR2nU((L00L)A)QU\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}

其中 LRn×nL\in \mathbb{R}^{n \times n}是余切拉普拉斯矩阵,QR2n×2n\mathbf{Q} \in \mathbb{R}^{2 n \times 2 n}是一个稀疏的余切拉普拉斯矩阵。

b) 根据下式,构建稀疏平方约束矩阵BR2n×2n\mathbf{B} \in \mathbb{R}^{2 n \times 2 n}

U(M00M)BU=1,\mathbf{U}^{\top} \underbrace{\left(\begin{array}{cc} \mathbf{M} & 0 \\ 0 & \mathbf{M} \end{array}\right)}_{\mathbf{B}} \mathbf{U}=1,

其中MRn×nM\in \mathbb{R}^{n \times n}是分段线性三角网格的质量矩阵; c) 将步骤1的优化问题看成求解广义特征值问题,特征值分解后得特征向量并赋给矩阵UU; d) 然后用奇异值分解法找到一个旋转矩阵,使最小二乘保角映射后的旋转和平移保持不变。

3.3 补全 vector_area_matrix.cpp 文件

功能需求:构建一个对称的面积矩阵AA,其中,网格(V,F)的向量面积是[V.col(0) V.col(1)]A[V.col(0) V.col(1)][V.col(0)' \ V.col(1)'] * A * [V.col(0)\ V.col(1)],也就是将不对称的面积矩阵转换成对称的面积矩阵。 步骤 :a) 找到网格的边界顶点的有序列表; b) 对于在有序列表中的每条边(i,j),A~[i,j+n]=1,A~[i+n,j]=1Ã[i, j+n] = 1,Ã[i+n, j] = 1,根据1/2(xiyjxjyi)1/2 (x_i y_j - x_j y_i)计算网格的向量面积; c) 根据下式,构建对称的向量面积矩阵AA

xA~x=x12(A~+A~)Ax=xAx\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}

3.4 结果与验证

经验证,固定边界法的tutte映射和活动边界法的LSCM算法都与原作者结果相似。 tutte映射结果。 Tutte的重心映射能将曲面的边界点固定在单位圆上,而且找到内部点的uv坐标,使曲面能与平面域双射。 lscm结果。

image.png

lscm算法能够很好地满足曲面到参数域空间映射函数的保角性条件,也就是曲面的顶点之间的夹角是90°,在参数域上也是90°。 image.png

四、总结分析

本实验学到了固定边界法的tutte映射和活动边界法的LSCM 算法。 Tutte的重心映射是给定一个与圆盘拓扑同胚的三角化表面,如果它的边界顶点分布在一个凸多边形上,且内部顶点可以其邻居凸组合,则(u,v)坐标构成一个有效的参数化(无自交)。 最小二乘保角映射LSCM算法,不需要固定边界来进行网格模型参数化,最小化目标函数可以使参数化后的角度变形最小,同时最小值唯一(即解线性方程),避免局部最优解。

本文正在参加「金石计划」