3D三角形網格補洞演算法及原始碼(轉)
在逆向工程中,由於裝置或模型的原因,我們獲取得到的三維模型資料往往並不完整,從而使得生成的網格模型存在孔洞,這對後續的模型分析會造成影響。下面介紹一種基於徑向基函式(RBF:Radial Basis Function)的三角網格補洞方法。
Step 1:檢測孔洞邊界
三角網格是由一系列頂點(V)以及由這些頂點所構成的三角面片(F)所組成,由三角面片可以得到網格的邊(E)。通常一條邊連線兩個三角面片,這種邊稱為網格內部邊,而如果某條邊僅連線一個三角面片,那麼稱這條邊為網格邊界邊,所有的邊界邊按順序連線之後就形成了網格的孔洞。
Step 2:初始化網格
為了使孔洞填充簡單、健壯,可以採用最小角度法進行網格修補,具體步驟如下:
(1)得到孔洞邊界點資訊,計算邊界邊長度的平均值l。
(2)計算每個邊界點的兩條相鄰邊的夾角大小。
(3)找出具有最小夾角的邊界點,計算它的兩個相鄰邊界點的距離s,判斷s < 2×l是否成立:若成立,則按下圖所示增加一個三角形,若不成立則增加兩個三角形。
(4)更新邊界點資訊。
(5)判斷孔洞是否修補完整,若未完整,轉(2),否則結束。
Step 3:最小二乘網格
初始化補洞得到的網格質量不是很好,我們需要優化網格頂點的位置,優化的條件是:
其中di為頂點vi的1環鄰域頂點數。
上式可以用一個線性方程組來描述:LV = 0,其中L是Laplace矩陣,具體形式為:
矩陣L的秩等於n – k,n為網格頂點的數目,k為網格連通區域的個數,如果網格是全連通的,那麼矩陣L的秩是n – 1。因此如果我們要使方程有解,需要加入m(m ≥ k)個控制頂點座標vs作為方程的邊界條件,在實際中我們將初始化網格的邊界頂點作為控制頂點。
其實上述線性方程組的求解等價於如下能量函式最小化的求解:
能量函式的第一部分是使得網格頂點儘量光滑,即每個頂點位於其1環鄰域頂點的中心,第二部分是為了控制頂點的位置滿足要求。
最小二乘網格的優勢是能夠生成高質量的光滑網格,生成過程僅需要網格的拓撲連線關係和少數控制點的座標資訊。
Step 4:徑向基函式(RBF)隱式曲面
徑向基函式是一個僅依賴於離控制點c距離的函式,即h(x,c) = h(||x - c||),距離通常是歐式距離,也可以是其他形式距離。徑向基函式網路是一個三層BP網路,其可以表示為多個基函式的線性組合:
;
下面列出2個最常用的基函式形式:
(1)Gaussian:h(r) = e-(εr)2
(2)Polyharmonic spline:h(r) = rk,k = 1、3、5、… 或h(r) = rkln(r),k = 2、4、6、…
利用徑向基函式網路並通過給定控制點xi和對應的值fi之後,可以求解得到網路中的係數λi,因此徑向基函式網路能夠解決空間散亂資料點的平滑插值問題,函式的零等值面就是我們要求的曲面。
在實際求解時函式f(x)表示式中通常會增加一個一次多項式P(x),如下:
;
其中:
;
將控制點位置xi和值fi代入函式f(x)可以得到如下方程,求解之後即可確定隱式曲面f(x)。
控制點xi可分為三類:
(1)邊界控制點:曲面通過的點,f(xi) = 0
(2)外部控制點:將邊界控制點沿法向正方向移動一小段距離而得到的控制點,取f(xi) = -1
(3)內部控制點:將邊界控制點沿法向負方向移動一小段距離而得到的控制點,取f(xi) = 1
計算時我們選擇的基函式為h(r) = r3,其實此時隱式曲面函式滿足Δ3f = 0,將基函式代入後得到隱式曲面的表示式如下:
Step 5:牛頓插值
為了得到插值隱式曲面的網格,我們需要把最小二乘網格的頂點投射到隱式曲面上,這裡我們採用牛頓迭代法:
最小二乘網格的頂點位置作為迭代初始條件,當||xk+1 – xk|| < ε時,迭代停止,ε為設定的誤差。上式中梯度表示式如下:
效果:
參考文獻:
[1] Olga Sorkine and Daniel Cohen-Or. 2004. Least-Squares Meshes. In Proceedings of the Shape Modeling International 2004 (SMI '04). IEEE Computer Society, Washington, DC, USA, 191-199.
[2] Greg Turk and James F. O'Brien. 1999. Shape transformation using variational implicit functions. In Proceedings of the 26th annual conference on Computer graphics and interactive techniques (SIGGRAPH '99). ACM Press/Addison-Wesley Publishing Co., New York, NY, USA, 335-342.
[3] 袁天然. 三角網格模型光順簡化和縫補技術的研究及應用[D]. 南京航空航天大學, 2007.
以上演算法大神已經說得很明白了,就不在此多嘴了,下面找來該演算法實現的開原始碼,感興趣的讀者可自行下載編譯執行,由於使用了C++11新特性,Windows下編譯需使用Visual Studio 2013以上版本。
本人將原始碼下載後經Visual Studio 2015編譯工程,可通過VS直接開啟編譯執行
以下為本人測試效果: