<<Polygon Mesh Processing>>閱讀筆記(7) 網格的簡化與逼近(Simplification&Approximation)

網格簡化的算法大致上可以分為下面幾種:

  • Vertex clustering algorithms:頂點聚類算法擁有很高的效率和魯棒性(Robust),算法的復雜度是線性的。其缺點在于生成網格的質量不是特別令人滿意。

  • Incremental algorithms:增量算法生成的網格質量很高,并且每次迭代的過程中能夠使用任意用戶定義的標準來進行下次減化網格操作。不過其復雜度較高,為O(n log n),最差復雜度為O(n2)。

  • Resampling algorithms:重采樣算法是最常用的算法。新的采樣點被放置在網格曲面上,通過連接這些頂點,能夠構建出一個新的網格。使用重采樣算法的主要目的是在于,通過重采樣我們能夠獲得想要的網格連接結構。不過其主要的缺點在于,如果采樣模式與網格區域沒有對齊,那么就會出現走樣(Aliasing)。為了避免這個問題,我們需要手動將網格根據其特征將其分割為不同的區域。

  • Mesh approximation algorithms:網格逼近通過一系列的網格優化策略來最小化某個定義明確的錯誤量。

Vertex Clustering

Vertex Clustering的的基本思想是:給定一個逼近容忍度遍歷ε,然后將物體表面的包圍空間劃分成一些直徑小于ε的小晶胞(Cell)。對于每一個小晶胞(Cell),計算出一個坐標來代表這個小晶胞(Cell)。同一個小晶胞(Cell)內的點、面或者邊最終都會最終退化為一個頂點。簡單地說就是將一個小晶胞(Cell)內的所有頂點退化為一個頂點。

對于分屬兩個小晶胞(Cell)的聚類PQ,如果pq是最終得到的能夠代表PQ所在小晶胞(Cell)內的頂點,那么pq是連接的,當且僅當聚類PQ原來包含的一系列頂點中存在一對相連接的頂點(pi, qj)。

假設原網格是2維流形(2-Manifold),通過Vertex Clustering得到的結果并不一定是2維流形(2-Manifold)。當幾個最終退化成為一個點的曲面和圓盤(Disk)不同胚(homeomorphic)的時候,流形的拓撲結構會發生改變。

這既是缺點又是優點,正是因為可以改變模型的拓撲結構,所以Vertex Clustering能夠很有效的降低網格的復雜度。舉一個例子,如果我應用一個不能改變拓撲結構的簡化到一個海綿的模型上,考慮到海綿有很多小洞,如果不改變它的拓撲結構,它的復雜度并不會減少。

Vertex Clustering的計算效率主要由將網格上的頂點映射到一個聚類(Clustering)這個過程決定。如果將空間劃分成等大的若干小晶胞(Cell),那么這個過程的復雜度是線性的。然后對于一個小晶胞(Cell),我們用一個頂點來表示它。因為小晶胞(Cell)的數量遠遠少于頂點數,這個過程耗費的時間遠遠少于前一個過程。

Vertex Clustering的另一個優點是通過定義一個不同的聚類(Clustering),能夠保證逼近的容忍度。

然而實際操作中會發現,實際逼近的偏離度會小于的聚類(Clustering)的半徑。考慮一個最終會退化為一個頂點的很大的平面,其逼近的偏離度遠遠的小于聚類(Clustering)的半徑。所以說給定一個錯誤閾值,往往不能最優地簡化復雜度。

不同的Vertex Clustering算法的主要區別是其計算代表小晶胞(Cell)的那個點的方法不同。其中最簡單的一種方法就是直接計算小晶胞(Cell)內相關點的平均值。

一個更合理的方法是使用最小二乘逼近的方法去尋找這個點的最優位置。

記小晶胞(Cell)內的某個三角形所在的平面為

其中xi為平面上的某一點,ni為它的法向量。那么任意一點x到該平面的距離的平方為

我們可以把xn寫成其次坐標來簡化上面的式子,即x =(x,1),ni = (ni, -d),得到

使用同樣的方法計算并累加這個小晶胞(Cell)內所有的三角形,得到(稱之為二次誤差度量Quadric Error Metric)

通過解下面這個線性方程,我們能夠得到x的最優解

其中矩陣A和向量b,可以從Q中得到

針對不規則的三角剖分網格,我們可以使用三角形的面積最為權重,改寫上面的式子為下面的形式

之后使用同樣的方法進行計算即可。

Incremental Decimation

Incremental Decimation的主要思想是:通過不斷地迭代來逐漸移除掉網格上的頂點。每次迭代時根據指定的標準移除一個頂點,標準可以是二態的(Binary)(即移除或不移除),這時通常需要一個全局的逼近容忍度(Approximation Tolerance)或一些其它的全局量,如三角形的寬高比等;也可以是連續的(Continuous)(移除這個頂點后網格的整體質量),這時我們會考慮如:兩個相鄰的三角形之間法向量的變化越小越好,各項同性的三角比各項異性的三角形要好。

每一次發生移除操作的時候,曲面某些區域的幾何結構就會發生變化,所以我們需要重新的評估當前的曲面,而在整個迭代的過程中這個過程是最耗費時間的。根據給定的標準,我們可以給每一個頂點一個優先級,每次進行移除操作的時候都會選取當前優先級最高的頂點,所以這里使用堆(Heap)來組織這些頂點是比較合適的。

拓撲操作

移除頂點的方法有很多,一個準則就是——越簡單越好。即我們使用多個簡單操作的組合來代替一些復雜的操作,常用的三種操作如下圖所示:

Vertex Removal

假定與被移除相鄰的邊的數量為k,無論移除頂點和與該頂點相鄰的邊之后如何去“修復”留下的k邊形的“坑”,最終三角形的數量必定為k-2。另外邊的數量也一定會是k-3。

Edge Collapse

該操作接受兩個相鄰的頂點,然后對連接它們的邊進行Collapse操作,即我們把這兩個頂點移動到一個相同的位置r,這個位置可以選取是自由的(在灰色區域中)。在操作后,與這條邊相鄰的兩個三角形發生退化被移除,另外頂點的數量減少了1,邊的數量減少了3。

可以發現Vertex Removal操作需要我們決定k邊形“坑”的劃分方式,Edge collapse操作需要我們決定新的頂點的位置。因此在執行的它們的時候我們還需要去尋找最優解。

Halfedge Collapse

該操作基于半邊數據結構,即對于頂點pq,邊pq和邊pq是不同的。Halfedge Collapse操作可以看作是Edge Collapse的一種特殊情況——對于邊pq,我們將pq都移動到點q上。較前兩種操作不同,在進行Halfedge Collapse操作的時候,我們并不需要尋找其最優解。這樣移除操作和全局優化(待移除點的選取)完全分離,使得算法的實際更加方便。

在進行此操作的時候邊pq需要滿足下面兩個條件:

  • 如果pq都是邊界上的頂點,那么邊pq也必須位于邊界之上。

  • 與點p相鄰的頂點的集合和與q相鄰的頂點的集合的交集只能是與邊pq相對的兩個頂點。

如果不滿足上述兩個條件,則會分別出現下圖的情況

Vertex Contraction

Vertex ContractionEdge Collapse操作類似,區別是Vertex Contraction操作可以對任意的兩個點的進行操作(并不一定是要相鄰的兩個點)。經過該操作后歐拉示性數(Euler characteristic)將發生變化,并且在選取點r周圍的曲面將不再和圓盤(Disk)是同胚的。

Distance Measures

在算法執行的過程,求解距離是必不可少的。直接求解距離是比較耗時的,為了加速運算,下面提出了3種效率比較高的近似算法:

Error Accumulation

Error Accumulation是這3種中最簡單的一種方法。當我們每次執行Edge Collapse操作的時候都會移動與對應邊相鄰的兩個三角形的某個頂點的頂點的位置。而新的位置r(這兩個頂點移動到的位置)與原來三角形距離就是這個過程中的逼近產生誤差的上限。Error Accumulation即通過存儲這樣每一個三角形的誤差,并累加到每一次的簡化操作之中。誤差既可以使用標量也可以使用矢量,使用矢量的時候方向相反的誤差可以相互抵消。

Error Quadrics

Error Accumulation法通過累加與頂點p 相鄰的所有三角形來計算某個頂點p的誤差矩陣Qp。當頂點p和另一個頂點q通過Collapse操作移動到一個新的頂點r的時候,則有Qr = Qp + Qq,然后使用前面介紹的公式得到方程

通過解該方程就能得到r的最優的位置了。在這里我們使用點到平面的距離來近似點到三角形的距離,這會導致真實的誤差偏小;另外新的誤差矩陣Qr是通過累加頂點p和頂點q的誤差矩陣得到的,這之中會有一部分三角被重復計算,這回導致誤差偏大。總的來說,這兩者會相互抵消一部分。

另一方面,每一個頂點只需要存儲一個4*4的矩陣,誤差可以通過計算

得到。因為無論頂點x周圍有多少相鄰的平面(已經被累加到矩陣Q里),計算所需要的時間都是常數,所以這個方法是這三種中使用最廣泛的一種。

Hausdorff Distance

給定集合A和B,對于每一個集合A中的元素a,首先得到元素a到集合B中每一個元素距離的最小值da。集合A中所有元素對應的da的最大值即為集合A到集合B的Hausdorff距離,幾位H(A,B),通常H(A,B)≠H(B,A)。

通過計算原模型到簡化后模型的Hausdorff距離,我們能夠得到逼近誤差。為了計算Hausdorff距離,我們會不斷地追蹤整個簡化的過程。每當進行Edge Collapse操作的時候,我們都將被移動的點pq記錄到其周圍區域中離它最近的三角形中。這樣每一個三角形在任何時刻都記錄著原模型中里它最近點的列表。這樣我們是需要找到這些列表中的最大值就能夠求得Hausdorff距離。

Fairness Criteria

通過前面介紹的不同的距離計算方式,我們能夠決定某個頂點能否被移除,而對于可以被移除得頂點,我們還需要額外的標準來為每一個頂點指定一個移除優先級。

一個直接的方法就是利用距離度量的值來對待移除頂點進行排序,即每一次簡化操作我們將會移除導致誤差增大量最小的頂點。

如果想要生成的網格的三角形更接近等邊三角形,那么我可以使用三角形外接圓的半徑與三角形最短邊的長度的比值來排序。

如果想要更為平滑的網絡,我們可以使用法向量在相鄰三角形間的變化量的平均值或最大值作為標準來進行排序。

紋理顏色的變化率或者是紋理的邊形程度都可以作為排序的標準。

我們稱這些排序的標準為Fairness Criteria。通過將Fairness Criteria和其它的模塊相互分離,可以極大地提高算法的靈活度。

Shape Approximation

算法的全稱是Variational Shape Approximation (VSA) ,VSA產生具有各向異性的網格,并且質量較好。并且VSA不需要輸入模型的全局參數化信息和局部的微分量。

假設M是一個三角形網格,我們M劃分為k個區域

然后我們定義一個包含有k個“代理(Proxy)平面”的集合

每一個代理平面可以通過平面上的任意一點和它的法向量決定

在VSA中,我們通常使用下面兩種方式來衡量代理平面和三角形網格某個區域的距離:

①式的被積函數正好是三角形網格區域Ri上的點x到代理平面Pi的距離的平方。

VSA的主要思想是:給定劃分數k和一個距離衡量函數E(①或②),找到一組劃分

和一組代理平面

使得下面的全局形變量E取最小值。

最后根據得到的一組代理平面,我們能夠得到簡化后的模型。

整個算法在兩個階段——幾何劃分(Geometry Partitioning)代理平面擬合(Proxy Fitting)之間交替迭代。前者固定代理平面,調整區域劃分;后者固定區域劃分,調整代理平面。

幾何劃分(Geometry Partitioning)

在幾何劃分階段,代理平面會被固定

區域劃分會被修改以最小化全局形變量E。

首先,算法會通過遍歷選擇區域Ri的每一個三角形并分別計算E(t,Pi)的值,然后找到該值最小的三角形ti。三角形ti(所在的平面)是Ri中與代理平面Pi最為接近的。

對于每一個區域有:

對于三角形ti周圍的三角形r,我們以E(r, Pi)為優先級,插入一個優先隊列中。

之后,取出隊頭元素,如果該三角形沒有被加入集合Ri則將其加入集合Ri。然后我們選擇該三角形周圍的三角形并插入優先隊列中。算法重復上述過程直到整個隊列為空。

算法的偽代碼是:

算法初始化的時候會在輸入的網格上隨機的選擇k個三角形,按照

的方式初始化每一個劃分區域,然后使用三角形的法向量和其上的任意一點來初始化對應的代理平面。通過上面的算法,每一個劃分區域都會慢慢的變大。

代理平面擬合(Proxy Fitting)

在這個階段中,區域劃分R會被固定,代理平面P會被調整以最小化全局形變量E

如果我們使用①式作為距離衡量函數,假設Ri內的三角形上,d1, d2, d3是三角形三個頂點到代理平面Pi = (Xi, Ni)的垂直距離,那么此時①式可以寫為

為了使得全局型變量E最小,則調整后的代理平面中,Xi為

Ni為下面的矩陣的最小特征值所對應的特征向量

如果我們使用的是②式,假設Ri內的三角形為Ti = (v1, v2, v3),其代理平面為Pi = (Xi, Ni)的垂直距離,那么此時②式可以寫為

那么調整后,Ni為(注意單位化)

并且②的最小化與Xi的值無關,Xi通常取取該區域Ri的重心坐標。

提取網格(Mesh Extraction)

得到最優解之后,我們就能從中提取出新的網格結構。首先我們標記出原網格上與三個以上劃分區域相鄰的頂點,然后將它們投影到每一個代理平面上,然后計算出位置的平均值。這些點被稱為是錨點(Anchor Vertex),通過追蹤劃分區域的邊界,我們將這些錨點連接起來,然后再每一個面上進行三角分割操作即可得到結果網格。

Greedy Shape Approximation

Greedy Shape Approximation是上述算法的改進形式,相較于前者它具有以下兩個優點:

  • 算法能夠自然地生成一些列不同逼近程度的網格。
  • 輸出網格能夠避免重影(Fold-Over)和退化的面(Degenerate Face)。

不過由于該算法使用貪心法來最小化下面的全局型變量所以其結果可能會陷入到局部最優解中。

并且該算法還涉及到了德洛內三角剖分的相關計算。

除了區域劃分R、代理平面P之外,該算法還用到了一個多邊形面的集合F = {f1, ..., fk}。集合F內的元素可以是任意連接的多邊形(由外邊界和內邊界)。

初始化的時候,R的每一個區域都只包含一個三角形

Ri對應的代理平面Pi為

其中xi為三角形ti上的任意一點,ni為三角形的法向量。

F的元素為

由于算法要保證生成的網格沒有重影(Fold-Over)和退化的面,所以整個算法要保證:從fi到Pi的映射是單射

由于算法在運行的任意時刻始終滿足上述的單射限制(Injectivity Constraint)條件,在算法執行的任意時候我們都能夠提取出正確的網格。

為了在面fi上生成三角剖分,我們先將fi投影到Pi上,然后在Pi上進行三角剖分,然后將三角形重新還原到fi上。

該算法同樣是迭代算法,在滿足定義的條件之前(誤差或者區域數)。每次我們選取兩個區域Ri和Rj,讓那和將它們合并為一個新的區域

新的區域R' = (x', n')的x', n'是由原區域的對應值以面積為權重加和得到,其中ai是Ri的面積

新的邊f'是原來兩個面fi和fj相交并去掉公共邊之后得到。然后算法檢查所有相鄰邊只有2條的頂點,如果該頂點是內部的頂點則移除它,如果它是邊界上的頂點,只有當其到代理平面的距離小于用戶定義的閾值的時候才將其移除。

需要注意在進行上述操作,要注意始終滿足單射限制(Injectivity Constraint)條件。

為了加速算法,在計算誤差的時候我們并不重新計算E(R’, P'),而是使用下面的方式進行近似計算

其中Di是Ri三角形的某個子集,由于包含了更少的三角形,所以計算效率會更高。

最后我們將這兩種距離衡量函數合并,得到


總體上看,VSA算法能夠通過設定較低的誤差閾值得到高質量的網格,但是得到的網格中可能會包含重影(Fold-Over)或者退化的三角形。而改進后的基于貪心的VSA算法能夠一些列不同質量的網格,并且不會產生重影(Fold-Over)。由于改進算法是基于貪心的思想,所以可能求解出來的是局部最優解。

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

推薦閱讀更多精彩內容