<<Polygon Mesh Processing>>閱讀筆記(2) 網格數據結構

選擇網格數據結構的時候一般考慮下面兩個因素:

  1. 拓撲需求(Topological Requirements) :需要表示什么樣的網格?是二維流形,還是其它更復雜的網格?是單純的三角形網格,或者其它任意的多邊形網格?是需要給當前的網格附加上其它的網格?

  2. 算法需求(Algorithmic Requirements):使用什么樣的算法?是簡單的渲染還是需要頻繁的訪問相鄰的點邊面?是靜態網格還是動態網格?對于網格是否需要附加一些其它的屬性?對內存的消耗是否特別在意?

評估一個數據結構的好壞有下面幾個標準:

  1. 建立數據結構所需要預處理的時間
  2. 查詢操作的響應時間
  3. 執行某項具體操作的時間
  4. 內存消耗和冗余

Faced-Based Data Structures

這種數據結構最直觀的優點是簡單,這種數據結構由網格所有面的集合構成,而對于每一個面則使用組成面多邊形的的點來表示。

以三角形網格為例,假設使用32位的單精度浮點數來表示坐標則,那么使用頂點的數據來表示一個三角形則需要36個字節(3 vertex * 3 dimension * 4 byte = 36 byte)。

通過上一部分的學習可以知道頂點的鄰邊的平均數量為6,即在這種數據結構中一個頂點平均會被存儲6次,所以可以估算使用這種數據結構平均每一個頂點要使用72個字節(3 dimension * 4 byte * 6 time = 72 byte)

可以發現,一個頂點的數據被多次存儲,一種可以改進這種空間冗余的方法是,使用數組來存儲所有的頂點數據,而對于每一個三角形面只需要存儲組成其的三個頂點的索引號即可。

這樣存儲一個三角形或一個頂點只需要12個字節(3個4字節的浮點數或3個整數)

這樣平均一個頂點只需要36個字節(3 dimension * 4 byte + 6 time * 4 byte = 36 byte,一份頂點數據,6個索引號)

但是這種數據結構存在一個問題,它缺陷顯式的連通性信息,在大多數算法中都會用到下面的操作:

  • 迭代訪問所有的點、邊和面
  • 有方向地遍歷一個面周圍的邊,這需要通過一條邊找到它的下一條或者上一條邊,可能還需要順帶的使用到對應頂點的數據
  • 通過一條邊找到與它相鄰的面或者它的兩個端點
  • 通過一個頂點迭代訪問它周圍的邊和面(one-ring
    neighborhood
    )

要通過上面的數據結構完成這些操作,可以把向當前的數據結構中添加一部分信息。

添加了附加信息后,存儲一個面需要24個字節,存儲一個頂點需要16個字節,平均一個頂點需要64個字節。

Edge-Based Data Structures

這種數據結構改進Faced-Based Data Structures中沒有顯式存儲邊地問題,并附加存儲了很多其它信息到邊上(兩個端點、相鄰地面、邊)。

這種數據結構存儲一個面需要4個字節,存儲一個頂點需要16個字節,存儲一條邊需要32個字節,平均一個頂點需要120個字節。

Halfedge-Based Data Structure

在Halfedge-Based Data Structure(半邊數據結構)中,一個重要的概念就是Halfedge(半邊),半邊即一條邊的一半,等于是把一條邊保持長度不變,形式上分為兩條半邊。這兩條半邊組合在一起稱為一條邊,也就是一條邊等于一對半邊。半邊是有方向的,并且一條邊的一對半邊有相反的方向。

對于每一條半邊,我們存儲下面的信息:

  1. 半邊指向的頂點
  2. 半邊相鄰的面(當半邊為網格邊界的時候沒有相鄰的面)
  3. 一個面中的上/下一條半邊
  4. 與它配對的另一條半邊

存儲一個面需要4個字節,存儲一個頂點需要16個字節,存儲一條半邊需要20個字節,平均一個頂點需要144個字節。

這里可以優化使用數組的索引號而不是指針來存儲具體的信息,這樣在需要附加額外信息的時候會更加方便,同時由于數組在內存中是連續排布的,在進行內存管理的時候也會更加簡單高效。

Directed-Edge Data Structure

這種數據結構是Halfedge-Based Data Structure(半邊數據結構)的一種特殊形式,只能夠用于三角形網格。這種數據結構將連通性信息隱藏在了數組索引號的關系中。

假設f是面的索引號,那么這個面3條半邊的索引號分別為:

假設h為半邊的索引,那么其相鄰面的索引以及該半邊在該面中的索引號為:

假設要求該半邊指向的下一個半邊的索引號,那么只需要計算(h + 1) mod 3即可。

每一個頂點存儲其位置信息和從該點射出的半邊的索引號;每一個半邊存儲與其配對的另一條反向的半邊以及該半邊對應的頂點(射出該半邊的)的索引號。

這樣存儲一個頂點需要16個字節,存儲一條半邊需要8個字節,平均一個頂點需要64個字節。

該數據結構在網格的邊界部分需要特殊處理索引號。另外該數據結構只能單純的表示某種類型的網格,例如三角形網格或者四邊形網格,而不能表示混合了三角形和四邊形的網格。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容