專(zhuān)利名稱(chēng):利用半邊數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)三維網(wǎng)格模型的簡(jiǎn)化方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)結(jié)構(gòu),特別涉及結(jié)合半邊結(jié)構(gòu)和二次誤差準(zhǔn)則來(lái)進(jìn)行面片化簡(jiǎn)的方法。
然而在實(shí)際應(yīng)用中,很多情況下并不需要十分精細(xì)的高分辨率模型。例如在虛擬現(xiàn)實(shí)中,背景以及比較遠(yuǎn)的物體,可以用比較粗糙的分辨率來(lái)表示;而對(duì)于較近的物體,則可用精細(xì)的模型來(lái)表達(dá)。由于處理模型所要耗費(fèi)的時(shí)間與該模型的精確程度是一對(duì)矛盾,因而為了獲得可接受的運(yùn)算時(shí)間,我們必須用一些相對(duì)簡(jiǎn)單的模型來(lái)代替原始模型,也就是對(duì)模型進(jìn)行簡(jiǎn)化。這種簡(jiǎn)化不是簡(jiǎn)單的刪除模型中的三角形,而是根據(jù)實(shí)際要求,刪除那些對(duì)模型影響相對(duì)較小的三角形,保留那些能反映模型幾何特征的三角形。網(wǎng)格簡(jiǎn)化對(duì)于三維幾何模型的存儲(chǔ)、傳輸、計(jì)算和顯示有著重要的意義。它可以減少磁盤(pán)和內(nèi)存的需求,加速網(wǎng)絡(luò)的傳輸,加速形狀信息的計(jì)算如有限元分析,碰撞檢測(cè)、可見(jiàn)性判斷、形狀識(shí)別,和實(shí)時(shí)顯示等,同時(shí)也是多分辨率分析、層次細(xì)節(jié)模型LOD的基礎(chǔ)。
最近幾年,面片化簡(jiǎn)包括多分辨率模型的問(wèn)題得到了廣泛的重視,也陸續(xù)提出了一些典型的算法,主要可分為頂點(diǎn)刪除、頂點(diǎn)聚類(lèi)和邊折疊三類(lèi)。
Schroeder采用頂點(diǎn)刪除然后再重新三角化的方法進(jìn)行網(wǎng)格簡(jiǎn)化,這是首次提出通過(guò)幾何元素刪除來(lái)實(shí)現(xiàn)網(wǎng)格簡(jiǎn)化的方法。在三角網(wǎng)格中,若一點(diǎn)與其周?chē)敲嫫木嚯x小于某個(gè)設(shè)定的閾值,且這一點(diǎn)的刪除不會(huì)帶來(lái)拓?fù)浣Y(jié)構(gòu)的改變,那么就可將這點(diǎn)刪除,同時(shí)所有與該頂點(diǎn)相連的面均被從原始模型中刪除,然后對(duì)其鄰域重新三角化來(lái)填補(bǔ)由于這一點(diǎn)被刪除所帶來(lái)的空洞。這種算法只適用于流體結(jié)構(gòu),速度較快,也不需要占用太多的內(nèi)存,但在保持表面的光滑性方面存在困難。隨后又陸續(xù)提出了一些更精確的誤差測(cè)度。但這些算法在生成較高質(zhì)量模型的同時(shí),也需要花費(fèi)更多的時(shí)間。
Rossignac提出了頂點(diǎn)聚類(lèi)的化簡(jiǎn)方法。該算法首先用一個(gè)包圍盒將原始模型包圍起來(lái),再把包圍盒劃分為若干區(qū)域,將同一區(qū)域內(nèi)的點(diǎn)合并為一個(gè)頂點(diǎn),然后根據(jù)原始網(wǎng)格的拓?fù)潢P(guān)系對(duì)新頂點(diǎn)重新三角化,從而得到簡(jiǎn)化模型。這是一種通用的不保持拓?fù)浣Y(jié)構(gòu)的化簡(jiǎn)方法,而且速度較快。但它沒(méi)有較好的誤差控制,所以生成模型的質(zhì)量不高。后來(lái)PeterLindstrom又拓展了此方法,使它能夠簡(jiǎn)化無(wú)法一次調(diào)入內(nèi)存的超大規(guī)模網(wǎng)格模型。
Hoppe在Siggraph’93上提出了一種基于邊折疊的面片化簡(jiǎn)方法,采用能量?jī)?yōu)化的方式來(lái)確定折疊次序和新頂點(diǎn)的位置,將網(wǎng)格簡(jiǎn)化問(wèn)題歸結(jié)為通過(guò)邊折疊、邊交換使能量函數(shù)最小的問(wèn)題。后來(lái)Hoppe在1996年對(duì)此能量函數(shù)加以了改進(jìn),并且通過(guò)邊折疊和點(diǎn)分裂構(gòu)造了多分辨率的LoD模型。此方法計(jì)算復(fù)雜,所需時(shí)間較長(zhǎng),但是生成模型的效果卻是在所有化簡(jiǎn)方法中最好的。Garland和Heckbert在97年提出了一種基于二次誤差測(cè)度的化簡(jiǎn)算法(Quadric Error Metric,簡(jiǎn)稱(chēng)QEM),它以點(diǎn)到平面距離的平方和作為誤差測(cè)度。該算法首先為原始網(wǎng)格中的每個(gè)頂點(diǎn)分配一個(gè)4×4的誤差矩陣,根據(jù)誤差矩陣計(jì)算網(wǎng)格中邊折疊的代價(jià)和新頂點(diǎn)的位置;然后按照折疊代價(jià)從小到大的順序進(jìn)行折疊操作,折疊生成的新點(diǎn)的誤差矩陣為折疊邊的兩個(gè)頂點(diǎn)的誤差矩陣之和。QEM算法速度快,簡(jiǎn)化生成的模型質(zhì)量也比較高,是一種非常有效的化簡(jiǎn)算法。后來(lái)Hoppe又對(duì)QEM進(jìn)行了改進(jìn),將法向量、顏色及紋理等信息加入到誤差矩陣中,采用翼邊(Wedge-based)的數(shù)據(jù)結(jié)構(gòu),也得到了較好的效果。
除了這三類(lèi)以外,還有其他一些網(wǎng)格簡(jiǎn)化的方法。Greg Turk在1992年的Siggraph年會(huì)上提出了重采樣方法(Re-Tiling)。Hinker和Hansen于下一年提出了一種區(qū)域合并的算法,即首先將法向差異較小的平面合并為一個(gè)大的平面,然后再重新三角化;后來(lái)Kalvin和Taylor又提出了基于區(qū)域生長(zhǎng)的簡(jiǎn)化方法(超面法),這也是一個(gè)比較典型的區(qū)域合并方法;Michael Lounsbery和Tony DeRose將小波技術(shù)用于模型簡(jiǎn)化;Lindstrom在98年用化簡(jiǎn)前后體積的變化以及面積的變化作為誤差測(cè)度,提高了化簡(jiǎn)速度并減少了內(nèi)存占用。
在網(wǎng)格簡(jiǎn)化這一類(lèi)問(wèn)題的研究中,不僅要考慮簡(jiǎn)化后的精度,還要盡可能的提高化簡(jiǎn)速度。原因在于如果簡(jiǎn)化速度過(guò)慢,將不能彌補(bǔ)直接繪制高分辨率模型所帶來(lái)的時(shí)間損失,從而簡(jiǎn)化也就失去了意義,特別是在多分辨率分析及LOD模型中,這點(diǎn)顯得尤為重要。
為實(shí)現(xiàn)上述目的,一種利用半邊數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)三維網(wǎng)格模型的簡(jiǎn)化方法,包括步驟(1)獲取三維模型的網(wǎng)格信息并構(gòu)建半邊結(jié)構(gòu);(2)初始化計(jì)算每條邊的折疊代價(jià);(3)化簡(jiǎn)。
本發(fā)明利用半邊結(jié)構(gòu)與二次誤差準(zhǔn)則進(jìn)行網(wǎng)格簡(jiǎn)化的算法,不僅能夠提高化簡(jiǎn)的速度,同時(shí)還具有廣泛的適應(yīng)性,是一種快速高效的面片化簡(jiǎn)算法。在計(jì)算機(jī)輔助設(shè)計(jì),醫(yī)學(xué)圖像系統(tǒng)等領(lǐng)域有著重要的應(yīng)用價(jià)值。
下面結(jié)合附圖詳細(xì)描述本發(fā)明的網(wǎng)格簡(jiǎn)化算法。作為一種具體的實(shí)現(xiàn)方案,結(jié)構(gòu)框圖見(jiàn)
圖1。主要包括三個(gè)步驟構(gòu)建半邊結(jié)構(gòu),初始化和化簡(jiǎn)。其中第三步還包括合法性檢查、邊界處理等方面。下面對(duì)其逐一介紹。
構(gòu)建半邊結(jié)構(gòu)圖2給出了半邊結(jié)構(gòu)的基本概念以及用其表示的網(wǎng)格模型。如圖中所示,邊e被分為兩個(gè)具有相同端點(diǎn)但方向相反的邊e1、e2,e1、e2就稱(chēng)為邊e的兩個(gè)半邊,同時(shí)e1、e2構(gòu)成一組鄰居半邊。發(fā)出半邊的頂點(diǎn)稱(chēng)為半邊的起點(diǎn),半邊指向的頂點(diǎn)稱(chēng)為半邊的終點(diǎn)。如半邊e1的起點(diǎn)為v2,終點(diǎn)為v1。邊e兩側(cè)為它的兩個(gè)鄰面,每個(gè)鄰面包含三條半邊。采用半邊數(shù)據(jù)結(jié)構(gòu)時(shí),我們將模型中邊的信息存儲(chǔ)在半邊表中,而不是邊表中。
由圖2可以看出,模型中每個(gè)面的三條半邊構(gòu)成了一組循環(huán),其方向既可以是順時(shí)針也可以是逆時(shí)針,但所有的面中半邊循環(huán)的方向必須一致。顯然,半邊結(jié)構(gòu)只適用于流體結(jié)構(gòu),因?yàn)榉橇黧w結(jié)構(gòu)中會(huì)出現(xiàn)一條邊的鄰面超過(guò)兩個(gè)的情況,這時(shí)其半邊的鄰居半邊不唯一。
半邊數(shù)據(jù)結(jié)構(gòu)的靈活性很強(qiáng),可以根據(jù)不同的需要構(gòu)建不同的頂點(diǎn)表、面表和半邊表。事實(shí)上,半邊結(jié)構(gòu)的優(yōu)點(diǎn)就在于它能方便的進(jìn)行點(diǎn)、線(xiàn)、面之間鄰接關(guān)系的查詢(xún)而無(wú)需記錄太多的信息。在我們將半邊結(jié)構(gòu)應(yīng)用于面片化簡(jiǎn)當(dāng)中時(shí),采用下面幾個(gè)簡(jiǎn)單的結(jié)構(gòu)即可得到所需要的一切信息,同時(shí)邊折疊后點(diǎn)、線(xiàn)、面之間鄰接關(guān)系的更新也相當(dāng)簡(jiǎn)單。
在半邊表中,每條半邊所要記錄的信息可用如下的結(jié)構(gòu)來(lái)表示Struct HalfEdge{Vertex*vert;∥該半邊的起始點(diǎn)HalfEdge*pair;∥該半邊的鄰居半邊HalfEdge*next;∥該半邊的下一半邊(在同一面內(nèi))Face*face;∥該半邊所在的面};在頂點(diǎn)表中,無(wú)需記錄頂點(diǎn)的鄰邊、鄰面。除了必不可少的頂點(diǎn)坐標(biāo)和法向量外,只需要記錄由該頂點(diǎn)發(fā)出的所有半邊中的任意一條即可。頂點(diǎn)結(jié)構(gòu)如下所示Struct Vertex{float vcoord[3];∥頂點(diǎn)坐標(biāo)float ncoord[3];∥頂點(diǎn)法向量HalfEdge*he;∥由該頂點(diǎn)發(fā)出的任意一條半邊
};在面表中,每個(gè)面只需記錄其所包含的半邊循環(huán)中的任意一條半邊。面結(jié)構(gòu)如下所示Struct Face{HalfEdge*he;∥該面所包含半邊循環(huán)中任意一條半邊};采用上述結(jié)構(gòu),我們可以很方便的查詢(xún)點(diǎn)、邊和面之間的鄰接關(guān)系。如某條邊的兩個(gè)端點(diǎn)及兩個(gè)鄰接面可用如下方式得到Vertex*vert1=he->vert; ∥端點(diǎn)1Vertex*vert2=he->pair->vert;∥端點(diǎn)2Face*face1=he->face; ∥鄰接面1Face*face2=he->pair->face; ∥鄰接面2由于一個(gè)面內(nèi)的三條半邊構(gòu)成一組循環(huán),因而在對(duì)一個(gè)面的邊進(jìn)行操作時(shí)可用如下簡(jiǎn)單的循環(huán)來(lái)完成HalfEdge*the=face->he;do{∥對(duì)半邊進(jìn)行操作the=the->next;}while(the!=face->he);由圖2還可知,由一個(gè)頂點(diǎn)發(fā)出的半邊也能夠構(gòu)成一組循環(huán),因而與該頂點(diǎn)有關(guān)的信息可用與上類(lèi)似的方法來(lái)得到。如通過(guò)下面的循環(huán)就可得到該點(diǎn)的鄰接邊、鄰接點(diǎn)和鄰接面。
HalfEdge*the=Vert->he;Vertex*VertNb;Face*face;do{the=the->pair->next;∥the為頂點(diǎn)Vert的一個(gè)鄰接邊VertNb=the->next->vert;∥VertNb為頂點(diǎn)Vert的一個(gè)相鄰點(diǎn)face=the->face;∥face為頂點(diǎn)Vert的一個(gè)鄰接面
}while(the!=vert->he);三維網(wǎng)格模型一般只包含頂點(diǎn)表和面表,頂點(diǎn)表反映模型的幾何信息,面表反映模型的拓?fù)湫畔?。我們可以很方便的在讀入數(shù)據(jù)的同時(shí)構(gòu)建半邊數(shù)據(jù)結(jié)構(gòu)。需要說(shuō)明的一點(diǎn)是半邊表中鄰居半邊pair的查詢(xún),通過(guò)整個(gè)半邊表進(jìn)行查詢(xún)顯然會(huì)耗費(fèi)太多的時(shí)間。這里我們首先為每個(gè)頂點(diǎn)開(kāi)辟一塊內(nèi)存用于存放該頂點(diǎn)的鄰接面,在查詢(xún)pair時(shí)只在該鄰域范圍內(nèi)進(jìn)行查詢(xún),等整個(gè)半邊結(jié)構(gòu)構(gòu)建完畢后再將這些內(nèi)存釋放掉以為后面的處理節(jié)省內(nèi)存空間。
初始化初始化的目的一是計(jì)算每條邊折疊后的代價(jià),二是計(jì)算邊折疊后新點(diǎn)的位置。對(duì)于第一點(diǎn),下面有詳細(xì)的描述;而對(duì)于第二點(diǎn),由于我們采用無(wú)需計(jì)算新點(diǎn)位置的半邊折疊作為拓?fù)洳僮?,因而這一步可以忽略。圖3為半邊折疊的示意圖。由圖可知,半邊折疊類(lèi)似于邊折疊,所不同的只是在半邊折疊中,終點(diǎn)即是新點(diǎn),起點(diǎn)被“拉”到終點(diǎn)的位置。它可以看成是無(wú)需計(jì)算新點(diǎn)位置的邊折疊操作,同時(shí)也可以看成是不用重新三角化的頂點(diǎn)刪除操作。
為了計(jì)算邊折疊的代價(jià),我們采用Garland于1997年提出的二次誤差準(zhǔn)則并對(duì)其進(jìn)行了一些改進(jìn)。在讀入網(wǎng)格數(shù)據(jù)時(shí),我們首先判斷原始數(shù)據(jù)中有無(wú)法向量信息。如果沒(méi)有,則直接采用Garland提出的二次誤差準(zhǔn)則;如果有,則采用我們改進(jìn)的二次誤差準(zhǔn)則。下面分別對(duì)其進(jìn)行描述。1.二次誤差準(zhǔn)則根據(jù)解析幾何理論,平面方程可表示為nTv+d=0,其中n=[abc]T為平面的法向量。如果n為歸一化的法向量(a2+b2+c2=1),則空間中任意點(diǎn)v=[xyz]T到該平面的距離平方可表示為D2(v)=(nTv+d)2=vT(nnT)v+2(dn)Tv+d2(1)定義一個(gè)4×4的誤差矩陣Q=bTc,]]>其中A=nnT為一3×3矩陣,b=dn為一3維列矢量,c=d2為常數(shù)。如果點(diǎn)的坐標(biāo)采用齊次表示v=[xyz1]T,則(1)式等價(jià)為D2(v)=vTQv=Q(v)
這種表示方法可以很容易推廣到點(diǎn)到一組平面的距離EQ(v)=ΣiDi2(v)=ΣiQi(v)=Q(v)---(2)]]>由于Qi(v)+Qj(v)=(Qi+Qj)(v),其中Qi+Qj=Ai+Ajbi+bjbiT+bjTci+cj]]>,因而(2)式中最右端的Q可表示為Q=ΣiQi]]>。也就是說(shuō),如果要計(jì)算某個(gè)點(diǎn)到一組平面的距離,只需要先計(jì)算出每個(gè)平面的誤差矩陣Q,相加得到該點(diǎn)的誤差矩陣Q,再代入(2)式即可。對(duì)于要折疊的邊(vi,vj),可先通過(guò)vi、vj各自周?chē)泥徝嬗?jì)算出Qi、Qj,而折疊后新點(diǎn)vnew對(duì)應(yīng)的Qnew只需將Qi與Qj相加,即Qnew=Qi+Qj。Qnew(vnew)就是將邊(vi,vj)折疊到點(diǎn)vnew的代價(jià)。2.改進(jìn)的二次誤差準(zhǔn)則我們對(duì)二次誤差準(zhǔn)則進(jìn)行改進(jìn)主要是針對(duì)一類(lèi)已知精確法向量信息的三維模型。這類(lèi)模型中頂點(diǎn)法向量的方向通常對(duì)模型的視覺(jué)效果起著重要的作用,且一般不是通過(guò)計(jì)算頂點(diǎn)周?chē)徝娣ㄏ蛄康募訖?quán)和來(lái)得到。例如通過(guò)Marching Cubes重建出的三維醫(yī)學(xué)模型,其法向量是在重建過(guò)程中通過(guò)計(jì)算體素梯度來(lái)得到。在我們將QEM算法直接應(yīng)用到這類(lèi)模型時(shí),效果不是太好。為此我們進(jìn)行了下面的改進(jìn)假設(shè)v=(x,y,z)T是模型中的一個(gè)頂點(diǎn),n=(a,b,c)T是頂點(diǎn)v歸一化的法向量。我們可以假想有一個(gè)平面P,它過(guò)頂點(diǎn)v且以n為法向量。也就是說(shuō),P是最能代表頂點(diǎn)v方向的平面。在構(gòu)造頂點(diǎn)v的誤差矩陣Qv時(shí),我們不僅僅要考慮頂點(diǎn)v周?chē)泥徝妫€要將最能代表其方向的虛擬平面P所提供的信息考慮進(jìn)去,即Qv=ΣiQi+wQP]]>其中Qi為頂點(diǎn)v周?chē)趇個(gè)鄰面所對(duì)應(yīng)的誤差矩陣,Qp為虛擬平面P對(duì)應(yīng)的誤差矩陣,w為加權(quán)系數(shù)。
由公式(1)可知,一個(gè)平面的誤差矩陣只和其平面方程有關(guān)(法向量必須歸一化)。對(duì)于虛擬平面P,我們知道其歸一化的法向量n以及該平面上的一個(gè)頂點(diǎn)v,因而很容易求出其平面方程中的第四個(gè)系數(shù)d=-ax-by-cz。然后就能構(gòu)建出虛擬平面P對(duì)應(yīng)的誤差矩陣Qp,既而得到頂點(diǎn)v的誤差矩陣Qv。這種方法雖然簡(jiǎn)單,但卻能較好的提高這一類(lèi)三維醫(yī)學(xué)模型在簡(jiǎn)化后的質(zhì)量。圖9(c)說(shuō)明了這一點(diǎn)。
在這種方法中,加權(quán)系數(shù)w可以由用戶(hù)自己調(diào)節(jié),實(shí)驗(yàn)證明w取得過(guò)小,對(duì)結(jié)果很難有影響;過(guò)大,在提高平坦區(qū)域化簡(jiǎn)效果的同時(shí)又可能降低模型的整體效果。我們?cè)趯?shí)際過(guò)程中取點(diǎn)v周?chē)徝娴膫€(gè)數(shù)作為加權(quán)系數(shù)w,w的取值范圍為1至10,結(jié)果證明這時(shí)的效果相對(duì)較好。
計(jì)算完每條邊的代價(jià)后,還要將其按照代價(jià)值從小到大的順序進(jìn)行堆排序。在化簡(jiǎn)過(guò)程中,每次從堆中取出代價(jià)最小的邊進(jìn)行折疊。這里需要說(shuō)明的一點(diǎn)是由于一條半邊被折疊后,其鄰居半邊也必將被折疊掉,因而沒(méi)有必要把每條半邊都放進(jìn)代價(jià)堆中。只需按邊的個(gè)數(shù)來(lái)設(shè)定堆的大小,每條邊的折疊代價(jià)為構(gòu)成該邊的兩個(gè)半邊折疊代價(jià)中較小的值,而新點(diǎn)為折疊代價(jià)較小的半邊的終點(diǎn)。
化簡(jiǎn)化簡(jiǎn)過(guò)程主要包括以下幾個(gè)步驟1.從代價(jià)堆中取出代價(jià)最小的邊,進(jìn)行合法性檢查。如果不合法,則不進(jìn)行折疊。
2.對(duì)于一條合法的邊,判斷其是否滿(mǎn)足邊界條件。如果滿(mǎn)足,則要進(jìn)行特殊處理。否則,按正常情況進(jìn)行化簡(jiǎn)。
3.邊折疊后,更新相應(yīng)的點(diǎn)、邊、面的鄰接關(guān)系,重新計(jì)算相關(guān)的折疊代價(jià),重新進(jìn)行堆排序。
4.重復(fù)以上步驟,直至達(dá)到要求。
合法性檢查通常情況下,一次邊折疊前后相鄰平面的方向不會(huì)相差太多,因而對(duì)模型幾何形狀的影響也不會(huì)太大,但有時(shí)也會(huì)出現(xiàn)例外。如圖4所示。當(dāng)點(diǎn)v5折疊到v1時(shí),邊(v3,v5)變?yōu)?v3,v1),與(v2,v4)發(fā)生了交叉。這時(shí)將模型投影到屏幕上則有可能產(chǎn)生多邊形空洞。
為了避免在折疊過(guò)程中出現(xiàn)這種情況,通常采用的方法是比較需要改變連接關(guān)系的平面在折疊前后法向量之間的差異,如果大于某個(gè)閾值,則認(rèn)為不合法,不進(jìn)行折疊。但這種方法的一個(gè)主要問(wèn)題是很難選擇合適的閾值。這里我們采用了一種更為有效的方法。
如圖5所示,如果要折疊半邊v0->v1,也就是說(shuō)將v0折疊到v1,我們采用下面幾個(gè)步驟進(jìn)行合法性檢查1.從v1開(kāi)始找到v0周?chē)械南噜忺c(diǎn)v1,v2,...,vn(如圖5中(a),n=5),然后計(jì)算出v1,v2,...,vn的平均平面(圖中沒(méi)有畫(huà)出)。
2.過(guò)線(xiàn)(v1,vi)(3≤i≤n-1)分別做n-3個(gè)垂直于平均平面的平面,記為Pi,如圖5中(b)與(c)所示。
3.平面Pi將點(diǎn)集(v2,...vi-1,vi+1,...,vn)分為兩部分(v2,...vi-1)和(vi+1,...,vn)。如果每一部分的所有點(diǎn)都位于平面Pi的同一側(cè),并且這兩部分的點(diǎn)位于平面的兩側(cè),則認(rèn)為是合法的折疊,否則是非法的。
邊界處理模型中的邊分為兩類(lèi),內(nèi)部邊和邊界邊。內(nèi)部邊有兩個(gè)鄰接面,并且對(duì)應(yīng)著兩條互為鄰居的半邊。邊界邊有一個(gè)鄰接面,只對(duì)應(yīng)一條半邊,該半邊沒(méi)有鄰居半邊,表現(xiàn)在數(shù)據(jù)結(jié)構(gòu)中就是其pair屬性為空。相應(yīng)的,模型中的頂點(diǎn)也可分為兩類(lèi),內(nèi)部點(diǎn)和邊界點(diǎn)。內(nèi)部點(diǎn)的所有鄰邊均為內(nèi)部邊,而邊界點(diǎn)的鄰邊中至少有一條是邊界邊。
對(duì)于半邊折疊,根據(jù)半邊起點(diǎn)和終點(diǎn)的特性可分為四種情況1)兩個(gè)點(diǎn)都是內(nèi)部點(diǎn);2)起點(diǎn)是內(nèi)部點(diǎn),終點(diǎn)是邊界點(diǎn);3)起點(diǎn)是邊界點(diǎn),終點(diǎn)是內(nèi)部點(diǎn);4)兩個(gè)點(diǎn)都是邊界點(diǎn);其中前兩種情況均可以按照正常的過(guò)程進(jìn)行化簡(jiǎn)。第三種情況我們不化簡(jiǎn),因?yàn)檫@種情況是將邊界點(diǎn)折疊到內(nèi)部點(diǎn),對(duì)邊界形狀的影響較大。對(duì)于第四種情況,我們?cè)试S化簡(jiǎn),這是由于當(dāng)化簡(jiǎn)掉的三角片數(shù)目較多時(shí),邊界邊占的比例會(huì)增大,如果完全禁止化簡(jiǎn)邊界邊,那么在進(jìn)行進(jìn)一步簡(jiǎn)化時(shí),就只能化簡(jiǎn)模型中的其他部分,這樣邊界雖然保持較好,但其他部分效果就會(huì)差許多。我們?cè)诔跏蓟臅r(shí)候在邊界邊上作一個(gè)通過(guò)該邊界邊并與其所在三角形垂直的平面,在計(jì)算誤差矩陣時(shí)把這些平面也考慮在內(nèi),這樣能夠有效的保證邊界邊不至于很快就被化簡(jiǎn)掉。而當(dāng)面片數(shù)量較少時(shí),則會(huì)適當(dāng)?shù)淖詣?dòng)合并一些邊界邊。由于只是邊界點(diǎn)之間的相互合并,而且數(shù)目不會(huì)太多,因而也可以較好的保持邊界特征。這里需要注意的一點(diǎn)是,邊界點(diǎn)發(fā)出的所有半邊無(wú)法構(gòu)成一個(gè)像內(nèi)部點(diǎn)那樣的循環(huán),因此在程序?qū)崿F(xiàn)時(shí)需要做特殊處理。
實(shí)現(xiàn)每一次邊折疊后鄰接關(guān)系的更新,折疊代價(jià)的重新計(jì)算以及堆排序與其他方法相差不大,這里無(wú)需重復(fù)。所不同的一點(diǎn)采用半邊數(shù)據(jù)結(jié)構(gòu)在邊折疊后對(duì)于面表的更新僅僅是將折疊掉的面從面表中去除而無(wú)需其他操作,同時(shí)頂點(diǎn)表和半邊表的更新也相當(dāng)簡(jiǎn)單,因而能夠大大提高簡(jiǎn)化速度。
我們用C++語(yǔ)言實(shí)現(xiàn)了本發(fā)明所描述的算法,并且在幾個(gè)不同的數(shù)據(jù)集上作了實(shí)驗(yàn)。所有的實(shí)驗(yàn)都是在一臺(tái)PIII 800,128MB內(nèi)存,操作系統(tǒng)為Windows 2000的PC機(jī)上完成的,顯示部分使用了標(biāo)準(zhǔn)的OpenGL圖形函數(shù)庫(kù),所用顯卡為GeForce 2 MX-400/32MB。
圖6、7、8、9為幾組實(shí)例。圖6中的原始地形模型有將近200,000萬(wàn)個(gè)三角片,在化簡(jiǎn)了將近99%后(3,000個(gè)三角片)仍能保持較好的特征,并且邊界保持的也很好。圖7(b),(c)分別為將原始兔子模型簡(jiǎn)化96%,99%后的模型。圖8為不含任何邊界的流體模型,在簡(jiǎn)化了90%后仍然具有較好的效果。圖9中(a)為重建后的人體膝蓋模型,其法向量在重建過(guò)程中通過(guò)計(jì)算梯度來(lái)得到,(b)、(c)分別為用Garland的原始QEM算法及本文改進(jìn)的QEM算法進(jìn)行化簡(jiǎn)的結(jié)果,可以看出本發(fā)明的改進(jìn)后的效果明顯好于改進(jìn)前的效果。
表1給出了Garland算法與我們的算法運(yùn)行速度對(duì)比。由表中數(shù)據(jù)可以看出,我們算法的速度明顯快于Garland算法的速度。
表權(quán)利要求
1.一種利用半邊數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)三維網(wǎng)格模型的簡(jiǎn)化方法,包括步驟(1)獲取三維模型的網(wǎng)格信息并構(gòu)建半邊結(jié)構(gòu);(2)初始化計(jì)算每條邊的折疊代價(jià);(3)化簡(jiǎn)。
2.按權(quán)利要求1所述的方法,其特征在于所述的構(gòu)建半邊結(jié)構(gòu)包括為每個(gè)頂點(diǎn)提供一塊臨時(shí)內(nèi)存,用于存放該頂點(diǎn)的鄰接面,數(shù)據(jù)結(jié)構(gòu)建完后即將其釋放掉,為后面的處理節(jié)省內(nèi)存空間。
3.按權(quán)利要求1所述的方法,其特征在于所述的計(jì)算每條邊的折疊代價(jià)包括步驟如果網(wǎng)絡(luò)模型沒(méi)有法向量信息,則直接利用二次誤差準(zhǔn)則計(jì)算代價(jià);如果輸入的模型本身含有法向量信息,則用下式計(jì)算代價(jià)Qv=ΣiQi+wQP]]>
4.按權(quán)利要求3所述的方法,其特征在于加權(quán)系數(shù)w為1至10。
5.按權(quán)利要求1所述的方法,其特征在于所述的化簡(jiǎn)包括步驟合法性檢查;邊界處理;實(shí)現(xiàn)。
6.按權(quán)利要求5所述的方法,其特征在于所述的合法性檢查包括步驟從代價(jià)堆中取出代價(jià)最小的邊進(jìn)行合法性檢查,如果合法,對(duì)該邊進(jìn)行折疊操作,并更新相關(guān)信息,如果不合法,不對(duì)該邊進(jìn)行操作,取堆中的下一條邊,重新進(jìn)行合法性檢查。
全文摘要
一種利用半邊數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)三維網(wǎng)格模型的簡(jiǎn)化方法,包括步驟(1)獲取三維模型的網(wǎng)格信息并構(gòu)建半邊結(jié)構(gòu);(2)初始化計(jì)算每條邊的折疊代價(jià);(3)化簡(jiǎn)。本發(fā)明利用半邊結(jié)構(gòu)與二次誤差準(zhǔn)則進(jìn)行網(wǎng)格簡(jiǎn)化的算法,不僅能夠提高化簡(jiǎn)的速度,同時(shí)還具有廣泛的適應(yīng)性,是一種快速高效的面片化簡(jiǎn)算法。在計(jì)算機(jī)輔助設(shè)計(jì),醫(yī)學(xué)圖像系統(tǒng)等領(lǐng)域有著重要的應(yīng)用價(jià)值。
文檔編號(hào)G06T17/05GK1430184SQ0113866
公開(kāi)日2003年7月16日 申請(qǐng)日期2001年12月29日 優(yōu)先權(quán)日2001年12月29日
發(fā)明者田捷, 常紅星, 張曉鵬, 蔣永實(shí) 申請(qǐng)人:田捷, 常紅星, 張曉鵬, 蔣永實(shí)