本文只实现最简单Laplace形变,按照论文《Laplacian Mesh Processing》进行展开。
github:https://github.com/GaoYuanBob/LaplaceDeformation
注:内容相当容易理解、本文所有讨论都是基于三角形网格模型( triangular mesh)进行的
Laplace Deformation中最基础的两个概念就是, global Cartesian coordinates(全局笛卡尔坐标系) 和 differential representations(微分表示)。笛卡尔坐标系不用多讲,就是常见的(X, Y, Z)三个轴表示的坐标信息,而微分坐标(也叫 δ-coordinates)是和 Laplacian operator(Laplace算子) 相关的概念。
首先,M = (V,E,F) 表示一个网格模型,M 代表 Model,V 代表 Vertices,E 代表 Edges,F 代表 Faces,模型上的每一个点,我们都能得到一个世界坐标 ,接下来定义微分坐标 δ-coordinates,
点的微分坐标表示为
,它表示点的世界坐标和这个点一圈邻接点的世界坐标的加权平均( the center of mass of its immediate neighbors in the mesh),用公式表示更容易理解:
可以从公式看出来,三个轴上的微分坐标是可以单独计算的。 N(i) 就是点 的邻接点,也就是公用一条边的点,
是这个点的邻接点的个数,比如周围有5个点,那么这5个点的坐标都对中心点有1/5 的贡献,微分坐标就是点的坐标和这个中心点的坐标的差(其实就是一个向量)。
这样每个点都这么计算就能计算出每个点的微分坐标了,计算微分坐标的意义在于,Laplace形变认为这个微分坐标能够记录或者说表示模型的局部细节信息,比如鼻子,嘴巴,凸起,凹陷这样的信息,当模型形变后,我们希望模型的局部信息不要被破坏,那么换成坐标的说法就是,模型上点的世界坐标变了,但是我们希望模型上所有点的微分坐标没变,也就是点和点的相对位置关系没变。
一个一个点计算当然可以,但是不好记录和表示,所以Laplace形变用一个Laplace矩阵来记录,我们叫做L,然后用L * V = ,来得到Laplace坐标,也就是微分坐标。我们能够得到L: