一、簡單介紹
微分域變形領域最重要的兩篇論文分別是:
[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、如何通過交互修改散度
三、三角網格梯度場
首先要清楚的是三角網格本身是一個分段線性的表示,它本質上不是一個光滑的曲面,它是由很多三角形平面組合而成的。要定義網格梯度場,首先要定義實值函數。
在每個三角形內部,其實可以通過三角形三個頂點的屬性插值得到。如下所示,分別是三個頂點關聯的屬性值,可以通過 的線性插值得到,一般情況下, 分別可以表示爲三個小三角形與大三角形的面積之比。
因爲分別表示對的影響,因此這裏我們將定義爲三個函數:,和, 同時也滿足:.
爲此,三角網格上任意一點可以表示爲: (1)
接下來,可以得到梯度: (2)
因爲: (3)
所以: (4)
因此, (5)
將 (5) 代入 (2) : (6)
那麼,問題來了, 又該怎麼計算呢? 下面以爲例講解。
如上左圖所示,我們先做一條平行於的直線, 在平行線上取兩個點:. 那麼有:
我們知道:
因爲 和 同底等高, 所以:
因此,
上述符號中,表示三角形的面積。
基於這個重要的結論,實際上所有平行於的直線上的均相等。爲此,我們可以做出右側的一個關於的等值線。那麼我們就可以知道,梯度方向是垂直於等值線且指向頂點的。在長度爲底邊高的線段上從0變化到1.那麼,梯度的模長爲高的倒數。因此:
(7)
將(7)代入(6)可以得到三角面片的梯度場爲:
(8)
其中,表示方向垂直底邊指向另一個頂點,表示三角形的面積。
四、梯度場的散度
梯度場在點處的散度定義如下,它實際上是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.