【笔记】Polygon mesh processing读书笔记(2)
多邊形網格處理系列第二篇
文章目錄
- @[toc]
- 2. 網格數據結構
- 基于面的數據結構
- 基本情況
- 優(yōu)缺點
- 改進的face-based數據結構
- 基于邊的數據結構
- 基于半邊的數據結構
- 基于有向邊的數據結構
- 小結
- @[toc]
- 基于面的數據結構
- 基本情況
- 優(yōu)缺點
- 改進的face-based數據結構
- 基于邊的數據結構
- 基于半邊的數據結構
- 基于有向邊的數據結構
- 小結
2. 網格數據結構
- 判斷一種數據結構的好壞標準包括(但不限于):
- 構建它的時間
- 響應特定查找的時間
- 執(zhí)行特定操作的時間
- 存儲消耗與冗余
基于面的數據結構
基本情況
- 每個面包含3個頂點位置,不能表示網格連接關系
- 也被稱為triangle soup或者polygon soup
- 一些數據轉換格式,如stereolighography(STL)使用這種這種表示方式
- 假設使用32 bit的單精度數表示頂點坐標,則每個三角形需要3×3×4 bytes。再根據歐拉定理,面的個數大約是頂點的兩倍,因此總共可能需要72 bytes/vertex
優(yōu)缺點
-
不能顯式表示連接關系
- 一些常見的操作不方便:
- 訪問獨立的頂點、邊和面,使用非特定的順序
- 有向遍歷一個面的所有邊,找到下一條/上一條邊
- 訪問邊的相鄰面,根據朝向有左邊的面或右邊的面
- 給定一條邊,訪問它的兩個端點
- 給定一個頂點,至少一個相鄰面或者邊是可訪問的(one-ring neighborhood,1-鄰域)
- 一些常見的操作不方便:
-
頂點和對應的數據會重復多次
- 通過建立關于面的索引,可以大幅減少冗余數據,indexed face set 或shared-vertex。
indexed face se被廣泛用于OFF,OBJ,VRML;也被用于OpenGL vertex array
改進的face-based數據結構
- 頂點存儲坐標之外,還存儲一個相鄰面(incident face)
- 面存儲對應頂點之外,還存儲它的相鄰三角形(neighboring triangles)
通過增加連通信息,可以訪問到頂點的one-ring neighborhood,并執(zhí)行上述操作
- 這種改進的數據結構被用于CGAL,大約是24 bytes/face × 2 + 16 bytes/vertex = 64 bytes/vertex
- 這種數據結構也有缺陷,不能顯式存儲邊;列舉一個中心頂點的one-ring需要區(qū)分不同情況
基于邊的數據結構
泛用多邊形網格大多是基于邊的,蓋因連接關系主要與邊有關。最有名的edge-based data structure有winged-edge和quad-edge
- Winged-edge,每個邊存儲它的兩個端點,它的兩個鄰接面,它在左邊的面和右邊的面的下一條和上一條邊;每個頂點存儲它的相鄰邊(之一);每個面存儲它的相鄰邊(之一)。總開銷16 bytes/vertex + 32 bytes/edge +4 bytes/face = 120 bytes/vertex
- 基于邊的表示可以表征任意多邊形,但是one-ring遍歷依然需要判斷不同情形。最終,被半邊結構解決掉這個問題
基于半邊的數據結構
- 半邊數據結構的最大特點就是把原本不帶方向的邊分離成兩個不同方向的半邊,這種數據結構可以表征任意有向的(orientable)2-manifolds(沒有復雜邊和頂點)多邊形網格
- 半邊數據結構中,半邊之中按照逆時針(counterclockwise)順序環(huán)繞每個面和邊緣(boundary)。每個boundary可以看成是一個空的面。據此,每條半邊有唯一的角點(corner),這個角點可以存儲紋理坐標、法向等
- 每個半邊存儲:
- 它指向的頂點
- 它的鄰接面(逆時針方向)
- 這個面的下一條半邊(逆時針方向)
- 這個面的上一條半邊
- 以及它的反向邊
若半邊總是成對出現,可以不存儲;
上一條半邊也可以省略,蓋因用遍歷可以找到
- 相應的,每個面存儲它的鄰接半邊;每個頂點存儲它的出邊
- 總存儲量大約是16 bytes/vertex + 20 bytes/halfedge × 6 + 4 bytes/face × 2 = 144 bytes/vertex
- 半邊數據結構方便遍歷每種元素(頂點、邊、半邊、面)的相鄰元素,尤其方便one-ring enumeration
基于有向邊的數據結構
Directed-edge data structure是一種節(jié)約存儲的半邊數據結構的變種,專為三角形網格設計
因為每3條半邊組成一個三角形,所以一條半邊的鄰接面和它在這個鄰接面中的序號都是可以固定計算的:
f a c e ( h ) = h / 3 f a c e i n d e x ( h ) = h m o d 3 face(h) = h/3\\ face_index(h) = h \mod 3 face(h)=h/3facei?ndex(h)=hmod3
但是處理邊緣的時候比較棘手,需要使用特殊標記,如負數來表示反向半邊是不存在的
類似的,也可以設置專為四邊形網格的有向邊數據結構。但是這兩者是不能合并的。因此,除了存儲優(yōu)勢外,經典半邊適用性更廣
小結
建議使用已有的數據結構,如CGAL,OpenMesh,MeshLab等
總結
以上是生活随笔為你收集整理的【笔记】Polygon mesh processing读书笔记(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GPF项目简介
- 下一篇: 计算机毕业设计Node.js+Expre