杜麗美
(長治學(xué)院 計算機(jī)系,山西 長治 046011)
在互聯(lián)網(wǎng)+時代,越來越多的人在生活中要使用網(wǎng)絡(luò),人類通過互聯(lián)網(wǎng)可以獲取到各種知識信息,同樣人們也想將日常生活中的一些重要信息傳到互聯(lián)網(wǎng)上,以便能夠更好地保存或者供他人分享.本文主要研究如何將現(xiàn)實生活中的物體經(jīng)過建模保存到計算機(jī)中,目的是使更多的人可以通過計算機(jī)屏幕看到與實物完全一樣的虛擬物體以及物體的各種屬性.
通過激光掃描技術(shù)、紅外線探測技術(shù)等可以很方便、準(zhǔn)確地獲取到物體表面的離散數(shù)據(jù)點坐標(biāo),由于是現(xiàn)實生活中的物體,所以獲取到的三維數(shù)據(jù)點均為三維坐標(biāo)[1-2],有三個分量X,Y和Z,考慮到物體體積大小不一,要想將不同物體均在同一窗口的中心位置處仿真出來,還需要對每個三維坐標(biāo)進(jìn)行一定比例的縮放,具體可以采用如下公式進(jìn)行:
(1)
公式(1)中的Lx,Wy和Hz分別表示物體在X軸方向上的最大長度、Y軸方向上的最大寬度和Z軸方向上的最大高度,接著找到物體的中心位置Cx,Cy和Cz如公式(2),最后按一定比例對仿真物體進(jìn)行縮放如公式(3),其中λ為縮放因子.
(2)
(3)
從物體表面提取的三維數(shù)據(jù)點經(jīng)過公式(1)(2)(3)的處理后,本節(jié)就要對處理后的數(shù)據(jù)點進(jìn)行網(wǎng)格的劃分了,網(wǎng)格劃分的好壞直接影響著物體的重建效果,又由于三角形有其自身的優(yōu)勢,它可以很好地展示復(fù)雜物體的邊界,所以一般采用三角網(wǎng)格來重建物體,有關(guān)三角網(wǎng)格劃分的算法有很多,比如區(qū)域生長算法、分治算法、細(xì)分法、網(wǎng)格模型簡化算法、二次曲面擬合方法等,通過這些算法劃分出三角形必須滿足各邊上均沒有其他數(shù)據(jù)點存在以及三角形與三角形之間沒有邊相交現(xiàn)象.這里介紹幾種常用的三角網(wǎng)格劃分算法[3]:
區(qū)域生長算法的關(guān)鍵是種子的選取,一般選用初始三角形作為種子,然后根據(jù)給定的生長準(zhǔn)則進(jìn)行區(qū)域生長,將之后生長出的三角形歸入種子一類中,接著繼續(xù)向外進(jìn)行生長,循環(huán)進(jìn)行直到滿足生長結(jié)束條件時終止,具體步驟如下:
2.1.1 初始種子三角形的選取
從離散數(shù)據(jù)點中最中心的一個數(shù)據(jù)點V1開始,然后找到距離點V1最近的兩個數(shù)據(jù)點V2和V3,之后將V1,V2,V3用邊連接起來構(gòu)成三角形作為初始種子T1,如圖1,并將頂點V1,V2,V3以及相應(yīng)的邊使用適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)S和W存儲起來,另外需要將待擴(kuò)展的邊V1V2、V2V3、V1V3存儲在數(shù)據(jù)結(jié)構(gòu)R中.
2.1.2 擴(kuò)展新三角形
初始種子T1找到后,以R中存儲的邊為出發(fā)點,繼續(xù)向外生長尋找新的三角形,以邊V1V3為例,先以V1V3為直徑畫圓,尋找落在圓內(nèi)的數(shù)據(jù)點集P(注意如果P中的點太少,可以擴(kuò)大范圍),通過計算找到點集P中與頂點V2在反方向的那些數(shù)據(jù)點集P′,并有P′?P中;接著尋找P′中的最佳點V4,使得∠V1V4V3最大,那么三角形T11便為擴(kuò)展出的新三角形如圖1所示,將此新三角形頂點和邊的信息存儲在數(shù)據(jù)結(jié)構(gòu)S和W中,并將R中已經(jīng)擴(kuò)展完成的邊V1V3去掉,并增加新邊V1V4和V3V4,繼續(xù)擴(kuò)展R中存儲的其他邊.
2.1.3 結(jié)束條件
檢查R中存儲的每一條邊,以這些邊為直徑作圓,查看是否有落在圓內(nèi)的點,若有則繼續(xù)采用2.1.2的方法擴(kuò)充新的三角形,若沒有則以待擴(kuò)展邊的λ倍為直徑作圓擴(kuò)大范圍繼續(xù)尋找點,直到λ達(dá)到給定閾值后終止此邊的擴(kuò)展.
分治算法顧名思義即先將離散數(shù)據(jù)點劃分成塊,如圖2(a)所示;然后對每塊中的數(shù)據(jù)點進(jìn)行三角網(wǎng)的劃分,這里可以采用區(qū)域生長法等方法進(jìn)行,如圖2(b)所示;最后將每部分三角網(wǎng)連接起來形成大的三角網(wǎng),如圖2(c)所示.
圖1 區(qū)域生長算法圖2 分治算法思想
細(xì)分法經(jīng)常用在對已經(jīng)劃分好的初始三角網(wǎng)進(jìn)行插值細(xì)分[4]過程中,通常情況下我們采用Delaunay三角化方法或者是區(qū)域生長等算法劃分出的三角網(wǎng)效果不是最優(yōu)的,比如在劃分的過程中可能會丟失一些數(shù)據(jù)點而使得最終劃分出的三角網(wǎng)格模型失去了一些細(xì)節(jié)部分的展示,而且所劃分的三角網(wǎng)模型最優(yōu)的狀態(tài)為每個三角形都應(yīng)趨于等邊三角形,基于這些方面考慮,我們必須在初始三角網(wǎng)的基礎(chǔ)上增加一些新的點來細(xì)分原有三角網(wǎng),或者是采用相關(guān)算法改變原有三角網(wǎng)的結(jié)構(gòu)使之盡量接近等邊三角形.最常用的細(xì)分算法有距離函數(shù)法、三角形的重心坐標(biāo)法、內(nèi)外接圓圓心法等等.
對于初始三角網(wǎng),如果只是單純想插入新點來細(xì)化細(xì)節(jié)部分,則可以直接采用相應(yīng)的算法來增加新點,從而以增加三角形的方式來增強(qiáng)模型細(xì)節(jié)部分的展示.通常情況下,初始三角網(wǎng)中的三角形面積越小說明當(dāng)前位置處的細(xì)節(jié)會更多,因此可以設(shè)置面積閾值,當(dāng)每個三角形的面積小于給定的閾值時,則在此三角形中增加新點來細(xì)分這個三角形.
如果想要改變初始三角網(wǎng)中三角形的結(jié)構(gòu),通常使用的算法是借助內(nèi)外接圓心法,首先找到需要改變結(jié)構(gòu)的三角形,通常目標(biāo)為三角形的某個內(nèi)角小于給定閾值的那些三角形,接著通過指定三角形T的內(nèi)外接圓心(x1,y1)和(x2,y2)從而找到新的插入點P:(xp,yp),如公式(4)所示,其中R1和R2分別為三角形的內(nèi)切圓半徑和外接圓半徑,接著判斷三角形T周圍的三角形的外接圓是否包含新的插入點P,如果包含則將這些找到的三角形放到一起形成一個封閉的多邊形區(qū)域,刪除此多邊形區(qū)域里所有的邊,最后將點P與多邊形的所有頂點相連,通過這種辦法必可消除初始三角網(wǎng)中所有的鈍角三角形.
(4)
本節(jié)主要實現(xiàn)對于最終形成的三角網(wǎng)進(jìn)行各種特殊效果的設(shè)置[5-9],從而還原物體全貌.首先要確定物體在窗口中的顯示效果,包括窗口的橫縱比例、視野的位置角度和朝向、遠(yuǎn)近裁剪面、物體的中心位置坐標(biāo)等,這些設(shè)置都可以借助函數(shù)(5)和(6)來實現(xiàn).
voidgluPerspective(GLdoubleovy,GLdoubleaspect,GLdoublezNear,GLdoublebzFar)
(5)
voidgluLookAt(GLdoubleeyex,GLdoubleeyey,GLdoubleeyez,GLdoublecenterx,GLdoublecentery,GLdoublecenterz,GLdoubleupx,GLdoubleupy,GLdoubleupz)
(6)
對三角網(wǎng)進(jìn)行光照和材質(zhì)的設(shè)置,函數(shù)(7)為光照函數(shù),其中第一個參數(shù)為光源號,第二個參數(shù)為光源的特性,第三個參數(shù)為第二個參數(shù)對應(yīng)的具體值.函數(shù)(8)為材質(zhì)函數(shù),其中第一個參數(shù)表示將紋理作用在物體的哪個面上,第二個參數(shù)指定一個具體材質(zhì),第三個參數(shù)為第二個參數(shù)對應(yīng)的具體值.
voidglLight{if}{v}(GLenumlight,GLenumpname,TYPEparam).
(7)
voidglMaterial{if}{v}(GLenumface,GLenumpname,TYPEparam)
(8)
要想使得重建物體更加逼真,可以對模型進(jìn)行紋理貼圖,具體做法就是將指定圖片貼到模型表面上,以期達(dá)到接近實物的效果,紋理設(shè)置函數(shù)如(9)所示.此外還可以對周圍環(huán)境渲染一種霧化效果,使得物體的遠(yuǎn)處呈現(xiàn)模糊的狀態(tài)而近處呈現(xiàn)清晰的狀態(tài)從而達(dá)到一種立體效果,霧化函數(shù)如(10)所示.
voidglTexImage2D(GLenumtarget,GLintlevel,GLintcomponents,GLsizeiwidth,GLsizeiheight,GLintborder,GLenumformat,GLenumtype,constGLvoid*pixels).
(9)
voidglFog{if}{v}(GLenumpname,TYPEparam).
(10)
本文選取了圓球表面的三維數(shù)據(jù)點,應(yīng)用上面所講的方法對圓球表面進(jìn)行了三角網(wǎng)格的劃分,圖3(a)是從圓球表面提取到的258個三維數(shù)據(jù)點,圖3(b)為采用區(qū)域生長算法對離散數(shù)據(jù)點進(jìn)行的三角網(wǎng)格劃分,從實驗結(jié)果來看由于獲取的數(shù)據(jù)點分布是較均勻和對稱的,因此劃分出的初始三角網(wǎng)也是很標(biāo)準(zhǔn)的并且都接近等邊三角形,圖3(c)是對圖3(b)的三角網(wǎng)進(jìn)行光照和材質(zhì)的設(shè)置后的整體效果,從結(jié)果看到表面不是很光滑,為此對其進(jìn)行插值細(xì)分,圖3(d)為插值細(xì)分后的結(jié)果.本實驗在win7系統(tǒng)下,VC6.0平臺上完成.
圖3 圓球的重建過程
本文介紹了三維物體仿真的一般技術(shù)手段,采用本文提出算法可以對物體表面進(jìn)行建模,在建模過程中可以根據(jù)需要采取不同的三角網(wǎng)格劃分算法或者是細(xì)分算法,實驗結(jié)果表明本文提出的算法是可行的.但是對于較為復(fù)雜的物體,比如物體表面有多處空洞、凸起或者凹陷等情況,采用本文的算法就有些費(fèi)力,因此對于三角網(wǎng)格劃分算法還有待于繼續(xù)研究,以尋找到更先進(jìn)的方法對各種物體進(jìn)行仿真.此外對于現(xiàn)實生活中的物體表面一般匯集了多種顏色,我們在仿真的過程中可以采用紋理函數(shù)的方式對模型表面不同部位進(jìn)行設(shè)置.以上所提出的問題都是今后研究的重點方向.