上一篇介紹了Marching Cubes算法,Marching Cubes算法是三維重建算法中的經典算法,算法主要思想是檢測與等值面相交的體素單元並計算交點的坐標,然后對不同的相交情況利用查找表在體素單元內構建相應的網格拓撲關系。Marching Cubes算法簡單,但是存在一些缺陷:1.模型二義性問題;2.模型特征問題。
對於二義性問題,以2D情形為例,存在一個單元中同一頂點狀態而不同的連接方式(如下圖所示)。
圖:2D中Marching Cubes算法的二義性問題
那么對於上圖中兩種連接方式的不同選擇,可能會導致在同一張圖像上完全不同的結果(如下圖所示),二義性在3D中的直接后果是產生“孔洞”。如果在一個單元中,一條對角線的兩端點值大於等值面閾值,另一條對角線的兩端點值小於等值面閾值,那么通常會發生這種二義性問題。
圖:二義性問題的不同結果
對於特征問題,由於Marching Cubes算法只計算體素單元的交點坐標信息,並根據這些交點連接的三角面片來構建體素單元內的幾何模型,這樣假如體素單元內存在幾何模型的特征信息(棱邊、棱角),但是Marching Cubes算法最終構建出的幾何模型會缺少這些特征信息(如下圖所示)。
圖:左上-交點坐標和法向;右上-Marching Cubes算法;左下-Extended Marching Cubes算法;右下-Dual Contouring算法
Dual Contouring算法[Ju et al. 2002]也是經典的等值面提取算法,相比Marching Cubes算法,Dual Contouring算法利用Hermite數據(交點的位置和法向)進行等值面構建,它克服了Marching Cubes算法所出現的缺陷。具體算法分兩步:
第一步:利用二次誤差函數生成頂點坐標
對於每個與等值面相交的體素單元,通過最小化二次誤差函數來生成一個頂點坐標:
其中pi為交點的位置,ni為交點的法向。
誤差函數可以寫成矩陣形式:
其中矩陣A的行向量為交點的法向ni,向量b的每個元素為ni·pi。
極值點可以通過求解正則方程得到:
但是文章指出這種方式會存在數值不穩定,並提出一種解決方法。基於QR矩陣分解計算正交矩陣Q,使得Q與[A b]相乘為如下上三角矩陣形式:
其中A'為3*3的上三角矩陣,b'為長度為3的向量,r為標量。
那么誤差函數可以變化為:
然后再根據上式計算極值點。
第二步:生成網格面片
對於每一條等值面相交的體素邊,那么包含該體素邊的4個相鄰體素單元內必然都存在頂點,將這4個頂點連接生成1個四邊形面片。
文章[Schaefer et al. 2002]詳細介紹了Dual Contouring算法的實現細節,通過總結該文可以得到Dual Contouring算法過程如下:
對於每個與等值面相交的體素單元:
1. 創建1個4*4的零矩陣用於存放QR矩陣分解的結果;
2. 對於體素單元的每條相交邊,計算交點的位置pi和對應的法向ni;
3. 將向量[ ni.x, ni.y, ni.z, dot(pi,ni) ]添加到4*4的零矩陣底部;
4. 通過QR矩陣分解得到3*3的上三角矩陣A'和向量b';
5. 求解線性方程組A'TA'x = (A'Tb' - A'Tb'c) , 其中c是體素單元中所有交點的質心位置;
6. 將計算得到的偏移量x加上質心位置c即為體素單元中的頂點坐標;
7. 如果計算得到的頂點坐標位於體素單元之外,那么頂點坐標用質心位置c來代替;
8. 對於每一條相交的體素邊,將其周圍4個體素單元內的頂點連接生成1個四邊形面片。
圖:左- Marching Cubes算法;右-Dual Contouring算法
圖:左- Marching Cubes算法;右-Dual Contouring算法
圖:box與sphere相交模擬
本文為原創,轉載請注明出處:http://www.cnblogs.com/shushen。
相關:
水泡動畫模擬(Marching Cubes):http://www.cnblogs.com/shushen/p/5542131.html
參考文獻:
[1] Tao Ju, Frank Losasso, Scott Schaefer, and Joe Warren. 2002. Dual contouring of hermite data. ACM Trans. Graph. 21, 3 (July 2002), 339-346.
[2] Scott Schaefer and Joe Warren. Dual contouring: The secret sauce. Technical Report 02-408, Department of Computer Science, Rice University, 2002.
[3] http://users.csc.calpoly.edu/~zwood/teaching/csc572/final15/kpidding/index.html