1. 程式人生 > >網格簡化技術研究報告

網格簡化技術研究報告

網格簡化技術研究報告

呂偉

問題及場景

超大場景環境下,為了精細、真實的塔模型,採用分級簡化鐵塔和絕緣子串模型的方法,利用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的載入方式,預處理網格模型。使用預處理網格模型簡化的原因由幾個方面:

  1. 離線LOD的資料組織簡單;
  2. 需要利用預處理簡化模型在磁碟上的儲存作資源管理;
  3. 以地球為三維場景顯示時,不同簡化程度網格模型在變化過程中的跳躍感不明顯,幾乎可以忽略不記;
  4. 需要保證場景操作的效能,離線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的簡化演算法,目前沒有實際測試資料,效果如下: