網格簡化技術研究報告
問題及場景
超大場景環境下,為了精細、真實的塔模型,采用分級簡化鐵塔和絕緣子串模型的方法,利用PageLOD分頁細節層次的機制,在不同范圍下展現不同精細程度的外觀。
簡化模型要求速度快、質量高、文件體積小等特點。
網格簡化的算法分類
刪減法
刪減法是目前算法中采用最多的一種模型簡化操作。該方法通過重復依次刪除對模型特征影響較小的幾何元素並重新三角化來達到簡化模型的目的。根據刪除的幾何元素的不同,通常又可以分成頂點刪除(Vertex removal)法、邊折疊(Edge Collapse)法和三角面片折疊(Triangle collapse)法等。
采樣法
采樣法首先將頂點(Vertex)或體素(Voxels)添加到模型表面或模型的三維網格上,然后根據物理或幾何誤差測度進行頂點或體素的分布調整,最后在一定約束條件下,生成盡可能與這些頂點或體素相匹配的簡化模型。采樣法適合於無折邊、尖角和非連續區域的光滑曲面的簡化,對於非光滑表面模型簡化效果差。
自適應子分法
自適應子分法通過構造簡化程度最高的基網格模型(Base Model),然后根據一定的規則,反復對基網格模型的三角面片進行子分操作,依次得到細節程度更高的網格模型,直到生成的網格模型與原始模型誤差達到給定的閾值。自適應子分算法具備簡單、實現方便等特點,但只適用於容易求出基網格模型的一些應用(如地形網格模型簡化等),另外簡化模型對於具有尖角和折邊等特征的保持效果較差。
頂點聚類法
頂點聚類方法根據一定的規則,將原始網格模型中的兩個或多個頂點合並成一個頂點,並刪除合並頂點后的退化三角形,從而達到簡化網格面片數量,實現網格模型簡化的目的。下圖為頂點聚類法操作示意圖,圖中將4個頂點聚類合並為一個頂點,並刪除相應的退化三角形后,得到簡化后的網格模型。邊折疊法也可以看成是頂點聚類法中兩個頂點合並的情況。頂點聚類法能處理任意拓撲類型的網格模型,算法簡單,速度較快。但由於簡化誤差控制困難,容易丟失較小結構的細節,因此通常簡化模型質量不高。
多邊形合並(Polygon merging)
多邊形合並法通過將近似共面的三角網格面合並成一個平面,然后對形成的平面重新三角化,來實現減少頂點和面片數量的目的。也被稱為面片聚類(Face cluster)和超面(Superfaces)法。該方法在合並和三角化過程中可能改變孔洞結構,因此不能保證簡化前后模型的拓撲結構。
簡化算法的誤差測度(度量質量和誤差)
誤差測度用於度量模型簡化的質量和誤差,因此它對模型的簡化過程和最后的簡化結果都具有重要的影響。大多數簡化算法采用對象空間(Object-space)的一種或綜合幾種形式的幾何誤差(Geometric errors)作為誤差測度,一些視點相關算法通常將對象空間的誤差轉換為屏幕空間(Screen-space)的誤差值為誤差測度,有些算法也考慮模型的顏色、法向量和紋理坐標等屬性誤差(Attribute errors)。
幾何誤差
幾何誤差測度一般采用歐式空間距離表示。通常有頂點到頂點、頂點到平面和平面到平面的距離等形式。
Hausdorff距離是現有算法中常常用到度量頂點到表面、表面到表面距離的幾何誤差測度,該距離為兩個模型的頂點之間的最小距離中的最大值。
給定歐式空間的兩點集,
,Haousdorff距離就是用來衡量這兩個點集間的距離。
算法過程:
該算法的時間復雜度是O(n,m),其中n和m分別為集合A和集合B中的點數。
屏幕空間誤差計算
視點相關算法常常需要將對象空間誤差轉換為屏幕空間誤差。設對象空間幾何誤差為e,x為以像素表示的屏幕某方向的分辨率,d是視點到模型對象的距離,θ為視野夾角,則e對應的屏幕空間誤差p為:
屬性誤差(材質、紋理)
網格模型上的三角面片、、法向量、紋理坐標、頂點的顏色是其常見的屬性。
網格模型的顏色一般以(r, g, b)三元組形式來表示,各分量分別在[0, 1]中取值。最直接的方法是采用歐式空間距離求解方法來求取顏色的距離。設簡化過程的兩模型M1、M2的顏色分別表示為(r1, g1, b1)和(r2, g2, b2),則兩模型的顏色距離dc可以表示為:
兩個法向量的誤差距離dn通常采用角度值進行度量:
多邊形表面的紋理坐標用(u, v)坐標對來表示網格模型頂點到二維紋理空間的映射,其中,u,v通常在[0, 1]中取值。一般也是采用歐式空間距離求解方法來計算紋理坐標誤差:
簡化算法的約束條件或運行條件
模型簡化過程中或簡化算法運行時往往存在一些限制條件,這些條件也決定了算法采用的技術、算法運行效果和模型簡化結構等。
細節層次(LOD)
對於各種簡化細節層次的LOD模型的管理技術可以分成離散LOD(Discrete LOD)、連續LOD(Continuous LOD)和視點相關LOD技術。
早期簡化算法大多采用離散LOD技術。這種技術首先采用離線(offline)方式對原始模型進行預處理,生成一系列不同分辨率的簡化模型。在實際運行時,根據需要選擇已生成的某個簡化模型進行繪制。由於在實時顯示繪制時不需要再次進行簡化操作,因此該技術具有實時運行速度快、數據存儲結構簡單等優點。但是因為需要保存多個預處理的中間簡化模型,所以占用存儲空間大;且在簡化預處理時無法考慮視點及實時運行環境因素等要求,只能根據模型本身信息進行簡化,因而簡化效率不高;同時由於技術限制,預簡化生成LOD模型數量不可能過多,粒度不可能太細,因此實時顯示繪制時候,在不同簡化模型切換過程中會出現畫面跳躍、視覺不連續等的效果。離散LOD簡化也稱為靜態簡化。
連續LOD技術是對傳統的離散LOD技術的改進和發展。與離散LOD技術不同,連續LOD技術的各簡化模型不是在預處理中生成,而是通過構造特定的數據結構進行編碼存儲,在實時顯示運行時根據需要生成對應細節層次的簡化模型。因此連續LOD技術具有更高的LOD粒度表示,占用空間較小,運行時畫面連續性較好等優點;但由於運行時需要進行簡化模型的生成處理,因此實時顯示速度收到一定影響。連續LOD技術支持多邊形網格模型的傳輸,常被應用於網格模型的各種遞進簡化算法中。
簡化模型的拓撲結構保持
簡化過程中是否保持網格模型的拓撲結構不變也是區分不同簡化算法的一個重要依據。網格模型的拓撲結構通常指構成網格模型的各三角網格之間的連接關系。衡量模型簡化算法是否能保持拓撲結構一般是通過判斷網格表面的虧格(Genus)和流型(Manifold)是否在簡化過程中保持不變來確定。虧格采用網格表面的孔洞數量來計算。
主要成熟算法
刪減算法
最早的刪減算法是Schroeder等在1992年提出的頂點刪除算法。隨后Hoppe提出采用能量法來確定折疊順序和計算頂點新位置的邊折疊簡化算法,Schroeder等擴展了邊折疊算法,考慮了不相連的頂點對刪減問題,提出了頂點對(虛邊)折疊算法,Hamann和Gieng等提出的三角形折疊算法相當於兩次邊折疊的組合,因此效率高,但細化粒度大。邊折疊算法后來被廣泛應用於基於頂點到平面距離平方和的QEM算法、視點不相關簡化算法、視點相關簡化算法、遞進壓縮算法以及遞進傳輸算法。
QEM
QEM(Quadric Error Mactrics,二次誤差測度)模型簡化算法,具有兼顧執行效率和模型質量的優點。能在考慮顏色,紋理,拓撲等特征的條件下,對三維模型進行任意程度的簡化。
其關鍵思想是將模型中最小Q值的頂點對(Pair Contraction)進行收縮(即:將2個點收縮成1個點),不停地迭代來逐步化簡模型。
下圖為兩種類型的頂點對:
模型試驗結果:
二次誤差測度
QEM算法的基本操作基於邊折疊,誤差測度采用的是二次誤差測度。二次誤差測度最早是由Garland提出,采用點到平面距離的平方作為誤差測度。它的優點是具有較高的計算速度,較小的內存消耗,而且得到的簡化網格具有較高質量。它是在速度非常快但簡化質量很差、速度很慢但簡化質量非常好的兩類方法之間的一種折中,是一種兼顧了速度和質量的較理想的誤差測度。
在三維歐氏空間中,一個平面可以表示為:,其中時平面的單位法向量,d時常量。點到該平面的距離就可以表示為:
可以定義三元組來表示, ,Q稱作二次誤差測度或二次矩陣,Q(v)稱作二次誤差。利用二次誤差測度可以方便地實現誤差累加,其中。
二次誤差測度在幾何上可以解釋為:有Q(v) = ε 確定的等值面是橢球面(可能退化);A是一個對稱的半正定矩陣,它的特征值和特征向量決定了橢球面的主軸。
表面屬性
在計算機圖形學中,三角網格模型最常見的表面屬性有顏色、紋理和法線。為了使簡化模型同初始模型具有良好的相似性,必須在保持模型幾何信息的同時保留這些屬性特征。由於點到平面的距離考慮了簡化操作對頂點周圍區域屬性值變化的影響,可以比較准確地描述局部屬性誤差,同時又比點到表面或表面到表面的距離計算簡便快捷。因此,采用點到平面的距離作為屬性誤差測度,將二次誤差測度應用到屬性誤差的計算中。
網格模型的每個頂點除了空間坐標外,還具有描述其屬性的數值。在網格模型的三角面上,屬性值根據幾何位置插值得到。因此,三角面上的屬性值是連續的,而且兩個屬性值之間的距離用歐氏距離來度量。
比如對於顏色屬性,可以用三維矢量來表示(),所有顏色矢量構成了RGB彩色空間,在RGB彩色空間中點到平面的距離平方同樣可以用二次誤差Q(v)來計算。邊折疊后的新頂點采用子集選擇法,不用重新計算頂點的空間位置和屬性值,在計算誤差的時候不用考慮空間坐標和屬性值的相關性,只需分別建立幾何二次誤差測度和屬性二次誤差測度,並計算幾何和屬性誤差。
邊折疊操作的代價
采用帶有顏色屬性的模型應用算法,帶有其他屬性的網格模型可以同理推出。三角網格模型的每個頂點和()來表征幾何和顏色信息。為每個三角面建立幾何二次誤差測度和顏色二次誤差測度。各頂點的二次誤差測度之和:
當邊折疊(, )到頂點v的時候,總的二次誤差測度為:
故而邊折疊引起的幾何誤差,顏色屬性誤差。則總的邊折疊代價為:
其中α為顏色屬性誤差在總代價中的影響系數,可以根據實際情況進行調節。
頂點或面片的合並聚類算法
基於頂點聚類的網格簡化算法最早優Rossignac提出, 基本思想是:用一個包圍盒把原網格模型包圍起來,通過等分包圍盒的各棱邊將包圍盒等分成若干個小的長方體,這樣原模型的所有頂點就分別落在這些長方體類;掃描這些長方體,如果某個長方體內有頂點,則把該長方體內的所有頂點刪除並生成一個新頂點,這個新頂點是被刪除的原頂點的平均加權。這種方法存在着三個局限性:首先,由於原網格模型上的點在空間的分布是未知的,這種方法對包圍盒進行等分,可能導致等分后某些區域的長方體內包含很多的頂點,而某些區域的長方體內沒有或只有很少的頂點,這一方面造成空間和時間的浪費,另一方面造成模型的某些部分過分簡化;其次,生成某個長方體內新頂點時,這種方法只是取簡單的加權平均而並沒有給出一種較好的誤差控制方法;再次,當原網格模型比較特殊時,落在某些長方體內的頂點可能屬於原模型差別較大的部分,如果這些頂點聚類成一個頂點就會造成很大的變形。如下圖:
根據以上的算法思路,可以提出一種基於八叉樹的頂點聚類網格簡化算法,其主要改進的是使用八叉樹的方法對原模型包圍盒進行自適應划分,同時利用二次誤差測度控制簡化模型的變形。
算法描述
基本概念
定義1. 空間中一組三角形,沿公共邊及在頂點處相鄰接,把這樣的一組三角形定義為三角網格TM,TM可由頂點集V = (, )和三角形集合 T=(t1, t2, t3 …, tm)所組成的二元組(V, T)來表示。
定義2. 對TM中任一條邊,如果該邊只為一個三角形所享有,則稱該邊為邊界邊,該邊的兩個頂點被稱為邊界頂點,該邊所在的三角形被稱為邊界三角形。
定義3. 對TM中任一頂點vi,所有以vi為一個頂點的三角形Tik構成的集合,稱為與頂點vi相關的三角形集合Pi
定義4. 對應TM中一個頂點集V = (, ),與V中的每個頂點相關的三角形集合的並集,稱為頂點集合V相關的三角形集合T(V)。
頂點聚類的新頂點的生成和誤差的度量
首先考慮,如果一些頂點落在一個長方體內時,刪除這些頂點后,如何生成一個新頂點以及用該新頂點代替被刪除的頂點所產生的誤差是多少。這就有一個選擇誤差標准的問題,這里以點到平面的距離為誤差標准。
假設落在每個長方體頂點和邊所構成的圖是連通的,考慮一個頂點集合V落在一個長方體內時,如何求新點和簡化誤差。我們可以先得到與頂點集合V相關的三角形集合T(V),由前面的假設不難發現,這個三角形集合構成了原網格模型上的一個區域。下圖是一個簡單的例子,頂點集合為{v1, v2, v3, v4},聚類為v0。如果頂點集合V聚類為頂點,定義這個聚類帶來的誤差為到三角形集合T(V)中每個三角形所在平面的距離平方之和加上V中的頂點到每個與相關的三角形所在平面的距離平方之和,即
為了使盡可能的小,可以對上式的x, y, z求偏導,使其等於零,即
令為每個與頂點集合V相關的三角形集合T(V)中的三角形所在平面的平面方程,且有。此計算方法同QEM算法的二次誤差測度。
改進后效果
算法選型
通過上述算法原理的介紹和分析,結合OpenSceneGraph的分頁加載數據庫的機制,在網格模型的呈現上我們使用離線LOD的加載方式,預處理網格模型。使用預處理網格模型簡化的原因由幾個方面:
-
離線LOD的數據組織簡單;
-
需要利用預處理簡化模型在磁盤上的存儲作資源管理;
-
以地球為三維場景顯示時,不同簡化程度網格模型在變化過程中的跳躍感不明顯,幾乎可以忽略不記;
-
需要保證場景操作的性能,離線LOD的方式比較合適。
VTK的網格簡化算法
VTK(Visualization Toolkit)開發包中包含了基於傳統二次誤差測度的QEM和頂點聚類算法,對於VTK的QEM算法實現代碼和效果:
按上圖順序,簡化程度數據如下:
簡化目標(%) |
100% |
50% |
25% |
12.5% |
三角面數 |
675460 |
337730 |
168864 |
84431 |
頂點數 |
380869 |
212013 |
128587 |
85527 |
時間(ms) |
0ms |
2051ms |
1950ms |
1842ms |
VCG的網格簡化算法
VCGLib(Visualization and Computer Graphics Library)是一套開源的、便攜的C++模板庫,提供三維圖形和網格操作功能。VCG中提供了一系列的網格簡化算法,主要使用的有兩種,一種是基於QEM的網格簡化算法,另一種是基於CLIQUE的頂點聚類網格簡化算法。基於QEM的簡化算法效果如下:
按上圖順序,簡化程度數據如下:
簡化目標(%) |
100% |
50% |
12.5% |
1.5% |
三角面數 |
675460 |
337730 |
84432 |
6739 |
頂點數 |
380869 |
212031 |
64033 |
10554 |
時間(ms) |
0ms |
2252ms |
1530ms |
920ms |
頂點聚類算法簡化效果如下:
按上圖順序,簡化程度數據如下:
簡化目標(%) |
100% |
16% |
5% |
3% |
三角面數 |
675460 |
112058 |
35271 |
21081 |
頂點數 |
380869 |
65488 |
21690 |
13042 |
時間(ms) |
0ms |
910ms |
431ms |
389ms |
基於QEM的改進算法
來自https://github.com/lvweiwolf/Fast-Quadric-Mesh-Simplification.git的改進簡化算法,基於QEM改進。大體思路與QEM是一致的,在實現上做了優化。該算法據說是Meshlab的4倍,Meshlab使用的就是VCGLib的簡化算法,目前沒有實際測試數據,效果如下: