本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
点个star:github.com/Bailey-24/G…
一、实验目的
网格形变,是指交互式地改变网格。网格形变的目的是用户约束一些区域保持不变,同时预先定义一个位移区域,剩余无约束的点所在区域,需要通过算法计算决定,常见的算法分为Surface-based deformation和Space deformation,算法要求计算高效,变形结果符合直觉,保留局部细节。常见于游戏动画中编辑人物,如下图。
二、实验内容
本实验分为两个子实验,双调和形变和as rigid as possible(ARAP)形变。 双调和形变是一种基于laplacian的形变,也就是计算每个顶点的laplacian坐标,然后找到新的坐标来匹配目标laplacian坐标,最后最小化一个能量函数得到每个顶点的新坐标。 ARAP形变算法首先定义网格顶点与1-邻域的边构成刚性变形单元,所有点的变形单元重叠地覆盖网格表面。变形过程中假设变形单元仅仅发生旋转变换,形式化的表示如下式和可视化形变如下所示,变形单元的刚性变换使得网格顶点相对于1-邻域顶点的位置保持不变,从而有效地保持了模型局部的细节。
其中表示的1邻域点的索引,而和分别表示和的1邻域顶点,表示最优旋转矩阵。
三、实验步骤
点个star:github.com/Bailey-24/G…
3.1 Bi-harmonic deformation
3.1.1 补全 biharmonic_precompute.cpp 文件
功能需求: 给定网格(V,F)和对选中的顶点V的索引b,预计算求解双调和形变所需的数据,也就是输出应该是一个使用igl::min_quad_with_fixed采用的data结构体的预分解系统。
步骤 :1) 构建质量矩阵M和余切拉普拉斯矩阵L;
-
构建双拉普拉斯矩阵;
-
预计算双调和形变所需的data结构体,里面有科列斯基分解矩阵等。
3.1.2 补全 biharmonic_solve.cpp 文件
功能需求: 给定预计算的data和每个控制顶点的位移列表,最小化能量函数,确定网格中所有顶点的位移。其中是控制顶点已知的位移,是剩余顶点未知的位移,是未知位移对应的二次系数矩阵。
步骤 :首先构建求解二元优化问题所需的向量,然后最小化能量函数得到剩余顶点的位移。
3.2 As rigid as possible
3.1.1 补全 arap_precompute.cpp 文件
功能需求:预计算所需数据,以便高效地对ARAP形变进行局部-整体迭代。这包括输出igl::min_quad_with_fixed用于求解全局步骤的data结构体,以及构建未知顶点旋转和位置的双线性矩阵K,它用来准备局部步骤的协方差矩阵和全局步骤的线性项。
步骤 :1)构建余切拉普拉斯矩阵矩阵;
2)预计算ARAP算法所需的data结构体;
3)通过下式构建矩阵K。首先对所有的面进行遍历,然后遍历在这个面上的边,得到当前边上的顶点的索引,接着对边上的每个顶点的旋转进行遍历,最后将变形前后的边权重的差值组成矩阵K,也就是K的每个元素是。
3.1.2 补全 arap_single_iteration.cpp 文件
功能需求:给定预计算的数据(data和K),每个控制顶点的位置,和所有顶点U的当前位置,进行局部-全局求解的单次迭代,以最小化ARAP能量,输出网格中所有顶点的位置U。
步骤 :1)进行局部优化:固定顶点位置,求解最优旋转矩阵R。首先通过下式构建协方差矩阵C,然后为每个区域的加权协方差矩阵计算最接近的旋转矩阵。
2)进行全局优化:固定旋转矩阵,求解使能量函数最小的变形后的顶点位置。 其中是旋转顶点梯度的矩阵。
3)返回1),直到能量误差小于用户指定的阈值为止。
3.3 结果与验证
ARAP比双调和形变更好,因为在骑士走路时,虽然只控制右脚,但是左脚后跟也会跟着上提,就很真实,而双调和形变没有上提,所以ARAP比双调和形变更能保持局部细节。
四、总结分析
做了两个子实验,基于拉普拉斯的双调和形变和ARAP算法形变。双调和形变通过给定每个控制顶点的位移,求出剩余顶点的位移,适用于小变形,但没有旋转不变形,所以局部细节有可能丢失。ARAP通过局部-全局优化的方法,最小化能量函数,求解最优旋转矩阵和变形后的顶点坐标,做到在保持局部细节的情况下去编辑模型的大体形态,而且易于实现,计算量较小,并且保证会收敛。
本文正在参加「金石计划」