基於Centroidal Voronoi Tessellation (CVT)算法的點雲三角網格化方法

在之前的博客中,老甘已經跟大家提到過Centroidal Voronoi Tessellation(CVT)算法的實現與可視化。

鏈接:https://blog.csdn.net/aliexken/article/details/106555993

基於CVT算法的一個非常重要的應用就是針對於點雲數據的三角網格化[1][2]。基本的步驟就是首先對點雲數據進行均勻重採樣,得到一個被優化過的點雲。基於優化點雲,利用與Voronoi圖對偶的Delaunay三角化結果,生成一個近似全局同構的三角網格。這個三角網格因爲是基於被優化的點雲而生成的,因此該三角化的同構性非常好,網格質量比傳統方法要高很多。

基於之前的CVT實現,我實現了該功能,對比傳統的Poisson曲面重建方法,結果如下:

 

左圖爲原始的點雲數據,取自Bunny的obj文件。中圖爲利用Poisson算法對點雲數據進行重建,生成網格數據。右圖爲基於CVT算法生成的三角網格。可以看到,右圖的三角網格中,三角形的同構性質更好。同構性好的三角網格,在計算曲面特徵的時候更便利,如測地線測算等。

那麼我們具體來看一下CVT算法在點雲三角網格化這件工作中是如何運行的。首先,我們利用CVT算法對一個不規則的點雲數據進行同構優化,最終得到一個同構的點雲重採樣。在每一步的更新迭代後,點雲數據就會更加趨向與同構。下圖中展示不同的更新階段,點雲數據的三角網格重建結果:

 

從左到右,CVT更新次數對應爲:1,5,10,100。可以看到,整個三角網格的質量隨着迭代次數的增加而改善。

這裏有三點需要注意:

第一, 相關的參考文獻中,聲稱基於CVT算法的網格重建能夠利用並行結構而實現加速。對於CVT更新來說,每次更新都需要對上一次定位的點簡歷搜索結構來提高緊鄰查找效率,那麼實際上這個並行結構是要在一次迭代後重新整合的,因此按照我目前的理解,還不能建立全程並行的實現方法。所以隨着迭代次數的增加,時間開銷必然會顯著增加

第二,這裏的三角網格是對每一個點與緊鄰計算Voronoi圖,進而得到其對偶的Delaunay三角化結果。最後的結果是將所有的點的Delaunay三角化組合起來,進而得到一個三角網格數據。這種三角化難免會出現局部丟失面片的情況,因此在實際使用中的時候,需要去修補面片丟失的區域。

第三,在對每一點進行最近鄰查找的時候,在曲率變化sharp的地方,可能會發生錯誤的連接情況(下圖中左圖爲例)。原因是,最近鄰是根據歐氏距離來做的,而不是測地線。一個解決的辦法是將法線約束引入緊鄰查找,以防止相鄰點的錯誤連接(下圖中中圖爲例)。可以看到錯誤連接的情況有一定的改善,剩餘的孔洞可以通過對邊界探查並修補來填充。

有興趣的各位可以利用我提供的Voronoi圖代碼,或者CGAL庫的功能函數實現看看。

參考文獻:

[1] Yan et al. Isotropic Remeshing with Fast and Exact Computation of Restricted Voronoi Diagram, 2009.

[2] Bruno et al. Variational Anisotropic Surface Meshing with Voronoi Parallel Linear Enumeration, 2012.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章