一、简单介绍
微分域变形领域最重要的两篇论文分别是:
[1] Yu Y , Zhou K , Xu D , et al. Mesh editing with poisson-based gradient field manipulation[J]. ACM Transactions on Graphics, 2004, 23(3):644. [ciation:679]
[2] Olga Sorkine-Hornung, Daniel Cohen-Or, Yaron Lipman, Marc Alexa, Christian Rössl, Hans-Peter Seidel . Laplacian surface editing[C]. SGP// 2004. [citation:1231]
两篇文章分别以经典的泊松方程和拉普拉斯方程为出发点很好的解决网格编辑的问题,形式上非常漂亮。两篇论文的作者也都是图形学领域非常著名的学者,按Hu老师上课的说法,那是一个风云变幻的时代。图形学界公认最好的期刊是TOG,但你会发现发在SGP上的laplace几乎是发在TOG上poisson的2倍!为什么呢? 那是因为poisson方法在理论上相对于laplace方法过于抽象,因此对于很多人难以理解和实现。
这篇博客重点讲述泊松变形技术,也希望通过开源代码可以帮助到更多的初学者。(如果对你有帮助,请给我star!)
代码地址:https://github.com/Zhengjun-Du/PoissonDeformation
首先我们看一下泊松变形的效果,其中白色部分为固定不动的部分,红色部分为手动交互的部分。
泊松变形交互展示,原地址:(https://www.bilibili.com/video/BV1H54y1Q7dF/)
二、背景工作
泊松变形的背景工作实际上是poisson image editing:
简单回顾一下,这篇论文主要实现图像克隆,把一张图像的某个区域拷贝到另一张图像中,实现完美的融合。方法分别利用待求解像素的(上图g区域)laplace算子和源图像梯度场(上图v区域)的散度构建了一个拉普拉斯方程,并以目标图像的边界为约束条件,通过求解线性方程组实现光滑的过渡。
具体过程可以参考:图像的泊松(Poisson)编辑、泊松融合, 文章很详细,通俗易懂。
图像空间,无论是梯度、散度还是laplace算子的计算都非常直观。但拓展到三维空间却不是那么的直观和简明。
因此难点主要体现在三方面:
1、如何定义三角网格上的梯度场和散度?
2、如何定义三角网格的laplace算子?
3、如何通过交互修改散度
三、三角网格梯度场
首先要清楚的是三角网格本身是一个分段线性的表示,它本质上不是一个光滑的曲面,它是由很多三角形平面组合而成的。要定义网格梯度场,首先要定义实值函数。
在每个三角形内部,其实可以通过三角形三个顶点的属性插值得到。如下所示,分别是三个顶点关联的属性值,可以通过 的线性插值得到,一般情况下, 分别可以表示为三个小三角形与大三角形的面积之比。
因为分别表示对的影响,因此这里我们将定义为三个函数:,和, 同时也满足:.
为此,三角网格上任意一点可以表示为:
接下来,可以得到梯度:
因为:
所以:
因此,
将 (5) 代入 (2) :
那么,问题来了, 下面以为例讲解。
如上左图所示,我们先做一条平行于的直线, 在平行线上取两个点:. 那么有:
我们知道:
其中,表示三角形的面积。 因为 和 同底等高, 所以:,因此:
基于这个重要的结论,实际上所有平行于的直线上的均相等。为此,我们可以做出右侧的一个关于的等值线。那么我们就可以知道,梯度方向是垂直于等值线且指向顶点的。在长度为底边高的线段上从0变化到1.那么,梯度的模长为高的倒数。因此:
将(7)代入(4)可以得到三角面片的梯度场为:
其中,表示方向垂直底边指向另一个顶点,表示三角形的面积。
四、梯度场的散度
梯度场在点处的散度定义如下,它实际上是1-邻域的求和。
其中,如(7)所示,如(8)所示, 为三角形的面积,为关联的三角面片。
五、顶点的laplace算子及线性系统
顶点的laplace算子定义如下左图所示,那么可以写成矩阵的形势,则权重矩阵A定义为:
可以证明:三角网格顶点的laplace算子等于散度。为此,可以构建如下右图所示的线性方程组。表示三角网格在任意顶点的laplace算子,为顶点的散度。
在实际的变形过程中,用户通过交互间接修改三角网格的散度,而左侧权重矩阵保持不变,通过求解上述线性方程组求解变形后顶点的坐标。我们注意到:无论是laplace算子还是散度,都只刻画了顶点与one-ring结点的局部关系,因此泊松变形可以保持局部细节。
六、如何修改散度
实际变形中,如下图所示,我们只需要对(局部控制点)进行旋转、平移等简单的操作来驱动网格变形。那么上面我们提到,变形过程通过修改散度来求解变形后网格顶点的坐标。那么,这里的核心问题就是如何通过操作局部的控制点来修改其它地方三角网格的散度。
其实方法有很多,我是对每个点设置了形变系数(0,1)之间,红色控制点处设置为1,然后求解调和方程将形变系数光滑过渡到网格的所有顶点。形变系数的核心意义就是,离控制点越近形变越大,离控制点越远,形变越小。然后利用四元数插值,得到所有点的变形矩阵。任意三角面片的三个顶点一旦改变,那么就可以求解新的散度。然后就可以求解线性方程组了。
参考文献
[1] Yu Y , Zhou K , Xu D , et al. Mesh editing with poisson-based gradient field manipulation[J]. ACM Transactions on Graphics, 2004, 23(3):644.
[2] Press C. Polygon Mesh Processing[J]. Crc Press, 2010.
[3] Pérez, Patrick, Gangnet, Michel, Blake, Andrew. Poisson image editing[J]. Acm Transactions on Graphics, 22(3):313
[4] Tong Y , Lombeyda S , Hirani A N , et al. Discrete Multiscale Vector Field Decomposition[J]. ACM Transactions on Graphics, 2003, 22(3):445-452.
[5] Cohenor D. Laplacian surface editing[C]// 2004.