本文原理参考论文: Laplacian Mesh Processing
拉普拉斯网格变形是一个相当经典的工作,本工作复现了一下基础的部分,这里记录下原理部分和结果。
复现结果演示如下:
拉普拉斯网格变形原理
可以用用一句话来解释拉普拉斯网格变形的原理: 形变前的点的拉普拉斯坐标与形变后的点的拉普拉斯坐标尽可能相等。这句话里面其实只有点的拉普拉斯坐标是我们所不清楚的,下面阐述拉普拉斯坐标为何物。
拉普拉斯坐标
拉普拉斯坐标是一个相当简单的概念,对于一个三角网格模型M=(V,E,F),V为顶点集,E为边集,F为三角面片集。V(v1,…vn)中每一个点的坐标表示都是笛卡尔坐标,下图(源自论文Laplacian Mesh Processing)和公式定义了拉普拉斯坐标的表示,点vi的笛卡尔坐标减去所有vi的相邻点vj的笛卡尔坐标的平均值,di表示vi的相邻点的个数。
δ i = ( δ i ( x ) , δ i ( y ) , δ i ( z ) ) = v i − 1 d i ∑ j ∈ N ( i ) v j \delta_{i}=\left(\delta_{i}^{(x)}, \delta_{i}^{(y)}, \delta_{i}^{(z)}\right)=\mathbf{v}_{i}-\frac{1}{d_{i}} \sum_{j \in N(i)} \mathbf{v}_{j} δi=(δi(x),δi(y),δi(z))=vi−di1j∈N(i)∑vj
拉普拉斯坐标蕴含了网格模型中的细节信息,而细节信息正是我们在网格形变后不希望改变的,拉普拉斯网格变形正是基于这一约束。
拉普拉斯矩阵
拉普拉斯坐标的计算我们可以按照上面的公式分别求解,但是为了简化计算,通常用矩阵乘法计算拉普拉斯坐标。只需要定义拉普拉斯矩阵L,便可求解拉普拉斯坐标 δ = L*V ( V表示所有点构成的笛卡尔坐标矩阵)。下面给出L的定义:
L = I − D − 1 A L=I-D^{-1} A L=I−D−1A
其中,I为单位矩阵,D矩阵是一个对角矩阵,对角线上的值Dii = di,di是第i个点的邻接点数目 ,A 矩阵是邻接矩阵。若点vi和vj相邻,Aij = 1,若不相邻,则 Aij = 0。
A i j = { 1 ( i , j ) ∈ E 0 otherwise A_{i j}=\left\{\begin{array}{ll}{1} & {(i, j) \in E} \\ {0} & {\text { otherwise }}\end{array}\right. A