介面重建——Marching cubes演算法

blogzzt發表於2023-04-16

一、引子

對於一個標量場資料,我們可以描繪輪廓(Contouring),包括2D和3D。2D的情況稱為輪廓線(contour lines),3D的情況稱為表面(surface)。他們都是等值線或等值面。

以下是一個2D例子:

 為了生成輪廓,必須使用某種形式的插值。這是因為我們只在資料集中的一個有限點集上有標量值,而我們的等高線值可能位於這兩個點的值之間。由於最常見的插值技術是線性插值,我們透過沿邊緣的線性插值在輪廓表面上生成。如果一條邊在其兩個端點上有標量值10和0,如果我們試圖生成一條值為5的等高線,則邊緣插值計算該等高線透過邊緣的中點

 

二、Marching cubes演算法——從2D理解

運用了分治思想,對每個單元格(cell)獨立地進行處理。該技術的基本假設是,一個輪廓只能以有限數量的方式透過一個單元格。我們可以構造一個案例表(case table),它列舉一個單元的所有可能的拓撲狀態(topological state)。拓撲狀態的數量取決於單元格頂點的數量,以及一個頂點相對於輪廓值可以具有的內部/外部關係的數量。標量值大於輪廓值的頂點被稱為在輪廓之內。標量值小於輪廓值的頂點被稱為在輪廓之外。例如,如果一個單元格有四個頂點,並且每個頂點可以在輪廓內部或外部,則有2^4 = 16種可能的方式透過單元格(在實現時可以用bit來實現)。在案例表中,我們不感興趣的是輪廓透過單元格的位置(例如,geometrical intersection),感興趣的只是它如何透過單元格(即單元格中輪廓的topology)。

一旦我們選擇好屬於哪一種case之後,就可以使用插值來計算contour line與cell edge相交的位置。該演算法處理一個單元格,然後移動,或行進到下一個單元格。在訪問所有單元格後,將完成輪廓。因此稱為marching cubes。


演算法的步驟如下:

1. Select a cell.
2. Calculate the inside / outside state of each vertex of the cell.
3. Create an index by storing the binary state of each vertex in a separate bit.
4. Use the index to look up the topological state of the cell in a case table.
5. Calculate the contour location (via interpolation) for each edge in the case table.
 
 這個過程將在每個單元格中構造獨立的幾何原元。在單元格邊界處,可以建立重複的頂點和邊。這些重複項可以透過使用一個特殊的重合點合併(point merging)操作來消除。請注意,沿著每條邊的插值都應該在相同的方向上進行。若不這樣,數值舍入很可能導致生成的點不完全一致(not precisely coincident),並且不能正確合併(merge)。這一步驟稱為merge coincident points。
 
三、Marching cubes演算法——3D情況
對於6面體,有8個頂點,因此有2^8 = 256中情況,又由於對稱性,最後只保留15種情況,如下圖:

 四、演算法需要注意的事項

在2D中,輪廓模糊(ambiguos cases,如Fig6.5中的Case 5和Case 10)很容易處理:對於每個模糊的情況,我們選擇實現兩種可能的情況中的一種。根據選擇的不同,輪廓可以延伸或打破當前的輪廓,如Fig 6.9所示。任何一種選擇都是可以接受的,因為產生的等高線(contour line)將是連續的和封閉的(或將在資料集(data set)邊界結束)。

 在3D中,這個問題更為複雜。我們不能簡單地選擇一個獨立於所有其他模糊案例的模糊案例。例如,Fig 6.9顯示瞭如果我們不小心實現了兩個相互獨立的情況,會發生什麼。在這個圖中,我們使用了通常的情況3,但用它的互補情況替換了情況6。互補的情況是透過將“暗”頂點與“光”頂點交換而形成的。(這相當於將頂點標量值從等值面值以上切換到等值面值以下,反之亦然。)將這兩種情況配對的結果是在等值面上留下了一個孔(hole)。

一個簡單而有效的解決方案透過新增額外的互補案例(complementary cases),擴充套件了原來的15個marching cubes案例。這些情況被設計成與鄰近的情況相容,並防止在等值面上產生孔。需要6個互補的情況,分別對應於行進立方體的情況3、6、7、10、12和13。互補的行進立方體案例如Fig 6.10所示。

 此外,儘管我們說該演算法用於規則型別,如四邊形和立方體,但marching cubes可以應用於任何拓撲上等同於立方體的單元型別(例如,六面體或非立方體體素)。

五、應用


Fig 6.11d是由marching cubes建立的等值面。圖6.11b是一個來自計算機斷層掃描(CT)x射線成像系統的恆定影像強度(image intensity)的表面。(圖6.11a是該資料的二維子集。)其強度水平對應於人的骨骼。圖6.11c為恆定流密度(flow density)的等值面。圖6.11d為鐵蛋白分子的電子勢等值面。由於我們熟悉人體解剖學,圖6.11b中所示的影像可以立即被識別出來。然而,對於計算流體動力學和分子生物學領域的從業者來說,圖6.11c和圖6.11d同樣熟悉。正如這些例子所顯示的,輪廓形成的方法是各領域視覺化資料的強大而又通用的技術。

 

參考文件:VTKTextBook Scalar Algorithms

相關文章