【传统图形学算法】游戏角色动画变形的基础Surface-based deformation和Space deformation

387 阅读4分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

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

一、实验目的

网格形变,是指交互式地改变网格。网格形变的目的是用户约束一些区域保持不变,同时预先定义一个位移区域,剩余无约束的点所在区域,需要通过算法计算决定,常见的算法分为Surface-based deformation和Space deformation,算法要求计算高效,变形结果符合直觉,保留局部细节。常见于游戏动画中编辑人物,如下图。

image.png

二、实验内容

本实验分为两个子实验,双调和形变和as rigid as possible(ARAP)形变。 双调和形变是一种基于laplacian的形变,也就是计算每个顶点的laplacian坐标,然后找到新的坐标来匹配目标laplacian坐标,最后最小化一个能量函数得到每个顶点的新坐标。 ARAP形变算法首先定义网格顶点与1-邻域的边构成刚性变形单元,所有点的变形单元重叠地覆盖网格表面。变形过程中假设变形单元仅仅发生旋转变换,形式化的表示如下式和可视化形变如下所示,变形单元的刚性变换使得网格顶点相对于1-邻域顶点的位置保持不变,从而有效地保持了模型局部的细节。

image.png

PiPj=Ri(pipj),jN(i)P_{i}^{\prime}-P_{j}^{\prime}=R_{i}\left(p_{i}-p_{j}\right), \forall j \in \mathrm{N}(i) 其中N(i)N(i)表示pip_i的1邻域点的索引,而pjp_jpjp_j^′分别表示pip_ipip_i^′的1邻域顶点,RiR_i表示最优旋转矩阵。

三、实验步骤

点个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;

  1. 构建双拉普拉斯矩阵Q=LTM1LQ=L^T M^{-1} L

  2. 预计算双调和形变所需的data结构体,里面有科列斯基分解矩阵等。

3.1.2 补全 biharmonic_solve.cpp 文件

功能需求: 给定预计算的data和每个控制顶点的位移列表,最小化能量函数minDutr(DuQu,uDu+2DuQu,hDh)\min _{\mathbf{D}_{\mathrm{u}}} \operatorname{tr}\left(\mathbf{D}_{\mathrm{u}}^{\top} \mathbf{Q}_{\mathrm{u}, \mathrm{u}} \mathbf{D}_{\mathrm{u}}+2 \mathbf{D}_{\mathrm{u}}^{\top} \mathbf{Q}_{\mathrm{u}, \mathrm{h}} \mathbf{D}_{\mathrm{h}}\right),确定网格中所有顶点的位移。其中Dh\mathbf{D}_\mathrm{h}是控制顶点已知的位移,Du\mathbf{D}_\mathrm{u}是剩余顶点未知的位移,Qu,u\mathbf{Q}_{\mathrm{u}, \mathrm{u}}是未知位移对应的二次系数矩阵。 步骤 :首先构建求解二元优化问题所需的向量,然后最小化能量函数得到剩余顶点的位移。

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的每个元素是Ki3k+β+=e~ijβ,Kj3k+β+=e~ijβK_{i 3 k+\beta}+=\tilde{e}_{i j}^{\beta}, K_{j 3 k+\beta}+=-\tilde{e}_{i j}^{\beta}

16f=1mijE(f)kijF(k)α=13β=13(viαvjα)Rkαβe~ijβ\frac{1}{6} \sum_{f=1}^{m} \sum_{i j \in E(f)} \sum_{k \mid i j \in F(k)} \sum_{\alpha=1}^{3} \sum_{\beta=1}^{3}\left(v_{i}^{\alpha}-v_{j}^{\alpha}\right) R_{k}^{\alpha \beta} \tilde{e}_{i j}^{\beta} \text {, }

3.1.2 补全 arap_single_iteration.cpp 文件

功能需求:给定预计算的数据(data和K),每个控制顶点的位置,和所有顶点U的当前位置,进行局部-全局求解的单次迭代,以最小化ARAP能量,输出网格中所有顶点的位置U。

步骤 :1)进行局部优化:固定顶点位置,求解最优旋转矩阵R。首先通过下式构建协方差矩阵C,然后为每个区域的加权协方差矩阵CkC_k计算最接近的旋转矩阵RkR_k

tr(VKCR)\operatorname{tr}(\underbrace{\mathbf{V}^{\top} \mathbf{K}}_{\mathbf{C}^{\top}} \mathbf{R})

2)进行全局优化:固定旋转矩阵,求解使能量函数最小的变形后的顶点位置。 minVtr(VLV)+tr(VB)\min _{\mathbf{V}} \operatorname{tr}\left(\mathbf{V}^{\top} \mathbf{L} \mathbf{V}\right)+\operatorname{tr}\left(\mathbf{V}^{\top} \mathbf{B}\right) 其中KR=BKR=B是旋转顶点梯度的矩阵。

3)返回1),直到能量误差小于用户指定的阈值为止。

3.3 结果与验证

ARAP比双调和形变更好,因为在骑士走路时,虽然只控制右脚,但是左脚后跟也会跟着上提,就很真实,而双调和形变没有上提,所以ARAP比双调和形变更能保持局部细节。

image.png

image.png

四、总结分析

做了两个子实验,基于拉普拉斯的双调和形变和ARAP算法形变。双调和形变通过给定每个控制顶点的位移,求出剩余顶点的位移,适用于小变形,但没有旋转不变形,所以局部细节有可能丢失。ARAP通过局部-全局优化的方法,最小化能量函数,求解最优旋转矩阵和变形后的顶点坐标,做到在保持局部细节的情况下去编辑模型的大体形态,而且易于实现,计算量较小,并且保证会收敛。

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