本文介紹一種網格分割線的優化算法,該方法能夠找到網格上更精確、更光滑的分割位置,並且分割線能夠自由地合並和分裂,下面介紹算法的具體原理和過程。
曲面上的曲線可以由水平集(level set)形式表示,通常表示為φ(r) = 0,其代表曲面上具有相同函數值的等值曲線,由於函數值為零,一般稱為零水平集。當曲線在曲面上移動時,可以用如下水平集方程表示:
上式為函數φ(r)對時間t的偏導,即函數φ(r)隨時間t的變化情況,等式右邊v表示曲線移動速度,▽φ表示曲面上函數φ(r)的梯度。
驅動曲線在曲面上移動有多種方式,而測地曲率流(geodesic curvature flow)是其中最常見的形式,如果以測地曲率來驅動曲線移動,那么曲線的水平集方程可以表示為:
此時函數φ(r)就是曲面上各點到曲線的測地距離(曲線的一側為正,另一側為負),而移動速度就是曲線的測地曲率。
上述方程表示在測地曲率的作用下曲線長度不斷減小,並且本身保持光滑,同時曲面上測地曲率越大的區域曲線移動速度越快。如果在方程中加入曲面的幾何特性g(r)權重之后,那么曲線可以移向期望的目標區域,此時對應的水平集方程表達式為:
其中g(r)的范圍為[0,1],在目標區域g(r) → 0。
上述水平集方程有不同的求解方式,文章[Kaplansky et al. 2009]采用顯式積分的方式來進行求解:
其中φ(tn)代表tn時刻曲面上函數φ(r)值。
文章[Zhang et al. 2010]采用半隱式積分的方式來求解水平集方程:
其中φ(tn)代表tn時刻網格曲面上函數φ(r)值;S是一個對角矩陣,其表達式為S = diag(s1, s2, …, sn),式中si是頂點vi周圍1環鄰域三角片面積的1/3;G也是一個對角矩陣,其表達式為G = diag(|▽φ|1, |▽φ|2, …, |▽φ|n),式中|▽φ|i是頂點vi上函數φ(r)的梯度模長;H的表達式如下:
式中τ1、τ2以及αij、βij的含義如下圖所示:
對比上面兩種求解方式,半隱式積分的求解方式更加穩定,迭代步長能夠取相對較大值,但是在每次迭代過程中都需要求解線性方程組,因此計算過程相對更加耗時。

% Pseudocode 1. Initialize the level-set function U for i = 1:iter 2.1. Calculate the gradient ▽U 2.2. Normalize the gradient ▽U/|▽U| 2.3. Calculate the divergence div(g*▽U/|▽U|) 2.4. Update the level-set equation ΔU = step * |▽U| * div(g*▽U/|▽U|) 2.5. Determine the new curves as its zero level-set end
本文為原創,轉載請注明出處:http://www.cnblogs.com/shushen。
參考文獻:
[1] Kaplansky, L. and Tal, A. (2009), Mesh Segmentation Refinement. Computer Graphics Forum, 28: 1995–2003.
[2] Zhang, J., Wu, C., Cai, J., Zheng, J. and Tai, X.-c. (2010), Mesh Snapping: Robust Interactive Mesh Cutting Using Fast Geodesic Curvature Flow. Computer Graphics Forum, 29: 517–526.