陳 曉,馬建倉(cāng)
(西北工業(yè)大學(xué) 電子信息學(xué)院,陜西 西安 710129)
隨著計(jì)算機(jī)圖形學(xué)的發(fā)展,計(jì)算機(jī)動(dòng)畫、科學(xué)計(jì)算可視化和虛擬現(xiàn)實(shí)逐漸成為計(jì)算機(jī)圖形學(xué)領(lǐng)域中3大重要技術(shù),其中三維現(xiàn)與廣泛應(yīng)用于建筑學(xué)、醫(yī)學(xué)、模擬仿真、虛擬現(xiàn)實(shí)等諸多領(lǐng)域[1]對(duì)大多數(shù)人來說,計(jì)算機(jī)真實(shí)感圖形已不再是一個(gè)陌生的名詞,它正日益廣泛的深入到人們?nèi)粘5墓ぷ?、學(xué)習(xí)和生活中,在影視特技、廣告動(dòng)畫中,人們已經(jīng)領(lǐng)略到計(jì)算機(jī)真實(shí)感圖形的神奇魅力。真實(shí)感圖形是一種計(jì)算機(jī)生成技術(shù),它首先在計(jì)算機(jī)中構(gòu)造出所需場(chǎng)景的幾何模型,然后根據(jù)假定的光照條件,計(jì)算畫面上可見的各個(gè)景物表面的光亮度,從而產(chǎn)生逼真的視覺效果。
文中主要針對(duì)Autodesk公司的3DMAX軟件建立幾何模型,從而對(duì)生成的3DS文件進(jìn)行編程,實(shí)現(xiàn)3DS文件的讀取、重繪及控制。傳統(tǒng)的基于過程的設(shè)計(jì)方法,由于相關(guān)函數(shù)多而且散雜同時(shí)數(shù)據(jù)又與函數(shù)分離,導(dǎo)致不便于程序的移植,為了克服這些缺點(diǎn),本文采用了面向?qū)ο蟮某绦蛟O(shè)計(jì)方法,將3DS文件的形體數(shù)據(jù)讀入到類中,然后利用光線追蹤技術(shù)[2]實(shí)現(xiàn)對(duì)三維模型的渲染,使得生成的場(chǎng)景更加逼真,具有真實(shí)感。
3DS文件是基于塊(chunk)結(jié)構(gòu)存儲(chǔ)的。一個(gè)塊開始是2個(gè)字節(jié)的ID,4個(gè)字節(jié)的塊長(zhǎng)度信息,然后是塊的主要數(shù)據(jù)。將3DS文件以16進(jìn)制方式打開如圖1所示,數(shù)據(jù)按照低位在前,高位在后的方式存儲(chǔ)。例如,2個(gè)16進(jìn)制字節(jié)FFAF組成的整型數(shù),表明AF是高字節(jié),F(xiàn)F是低字節(jié);對(duì)于長(zhǎng)整型數(shù),如。938E 0600,表明8E93是低位字,0006是高位字。
圖1 3DS文件的16進(jìn)制數(shù)據(jù)構(gòu)成Fig.1 3 DS file hexadecimal data form
3DS文件中 有一個(gè)基本塊,其ID是4D4D,每個(gè)3DS文件的開頭都是這樣的一個(gè)塊。基本塊中的子塊是3D編輯塊和關(guān)鍵幀塊,前者的ID是3D3D,后者的ID是B000.圖2說明了3DS的塊結(jié)構(gòu)以及各個(gè)塊之間的嵌套關(guān)系。下面對(duì)主要的幾個(gè)塊進(jìn)行簡(jiǎn)單介紹。
1)主編輯塊(0X3D3D)
描述場(chǎng)景數(shù)據(jù)的主編輯塊存儲(chǔ)了當(dāng)前編輯場(chǎng)景的狀況和當(dāng)前窗口的配置數(shù)據(jù),這些數(shù)據(jù)是用于顯示三維圖形的重要幾何信息,也是基于OPENGL裝載3DS文件的重點(diǎn)煙酒部分。
2)材質(zhì)塊(0XAFFF)
材質(zhì)塊定義了使用與物體上的材質(zhì)屬性,包括材質(zhì)的名稱,顏色以及貼圖等。如果讀入的材質(zhì)包含貼圖,則貼圖所對(duì)應(yīng)的文件名、透明度信息、位置和纏繞方法也都存儲(chǔ)在材質(zhì)塊的響應(yīng)子塊中。
圖2 3DS文件塊結(jié)構(gòu)Fig.2 3 DS file chunk structure
3)物體塊(0X4000)
物體塊下有物體網(wǎng)格塊 (0X4100)和物體材質(zhì)塊(0X4130)。物體網(wǎng)格塊存儲(chǔ)的是模型的頂點(diǎn)、頂點(diǎn)的紋理坐標(biāo)、面信息以及邊信息等。物體材質(zhì)塊中存儲(chǔ)的是當(dāng)前物體上所賦予的材質(zhì),該塊與材質(zhì)塊的區(qū)別是,材質(zhì)塊存儲(chǔ)的是3DS文件中材質(zhì)庫(kù)中的信息,而物體材質(zhì)塊中存儲(chǔ)的是當(dāng)前物體上的材質(zhì)信息。
4)其他塊
當(dāng)遇到塊信息未知或?qū)δP惋@示不起作用的塊時(shí)(如關(guān)鍵幀塊),可不進(jìn)行處理直接讀入下一個(gè)塊。
OpenGL全稱為“開放式圖形庫(kù)”,是由SGI公司開發(fā)的三維圖形API,目前在圖形開發(fā)領(lǐng)域已經(jīng)成為工業(yè)標(biāo)準(zhǔn)。OpenGL是一種強(qiáng)大的三維圖形開發(fā)工具,是圖形硬件的軟件接口[3],OpenGL主要工作是將三維的物體投影到一個(gè)二維平面上,之后處理得到的像素,進(jìn)行顯示。首先將物體轉(zhuǎn)化為可以描述物體幾何性質(zhì)的頂點(diǎn)與描述圖像的像素,在執(zhí)行其他操作后,最終將這些數(shù)據(jù)轉(zhuǎn)化為像素?cái)?shù)據(jù)。
1)針對(duì)每個(gè)頂點(diǎn)的操作和幾何要素裝配
每個(gè)頂點(diǎn)的空間坐標(biāo)需要經(jīng)過模型取景矩陣變換、法向矢量矩陣變換,若允許紋理自動(dòng)生成,則由變換后的頂點(diǎn)坐標(biāo)所生成的新紋理坐標(biāo)替代原有的紋理坐標(biāo),再經(jīng)過當(dāng)前紋理矩陣變換。然后根據(jù)幾何要素類型決定采取不同的幾何要素裝配方式。
2)像素操作
由主機(jī)讀入的像素首先解壓縮成適當(dāng)?shù)慕M分?jǐn)?shù)目,然后進(jìn)行數(shù)據(jù)放大、偏置,并經(jīng)過像素映射處理,根據(jù)數(shù)據(jù)類型的限制在適當(dāng)?shù)娜≈捣秶鷥?nèi)。像素最后寫入紋理內(nèi)存,使用紋理映射或光柵化生成像素段。
3)像素段操作
當(dāng)使用紋理映射時(shí),每個(gè)像素段將產(chǎn)生紋素,再進(jìn)行霧效果計(jì)算、反走樣處理,接著進(jìn)行剪裁處理、一致性檢驗(yàn)、模板檢驗(yàn)、深度緩沖區(qū)檢驗(yàn)和抖動(dòng)處理。
3DS文件中采用的是塊結(jié)構(gòu),并且塊與塊之間存在嵌套的關(guān)系,所以對(duì)3DS文件中三維模型數(shù)據(jù)的讀取采用遞歸的方法。返回上一級(jí)的條件是當(dāng)前已經(jīng)讀入的塊字節(jié)數(shù)是否等于塊的長(zhǎng)度,從父塊跳轉(zhuǎn)到子塊可用switch語(yǔ)句實(shí)現(xiàn),通過子塊的ID判斷進(jìn)入那個(gè)子塊分支。當(dāng)遇到?jīng)]有必要讀入的塊時(shí),可通過ID判斷,若不需要此塊信息,則可將文件指針向前移動(dòng)(塊長(zhǎng)度—6)個(gè)字節(jié)[5]然后break跳過該塊,處理下一塊。當(dāng)遇到需要讀入的塊時(shí),例如材質(zhì)塊,通過判斷當(dāng)ID為0XAFFF(EDIT-MATERIAL)時(shí),首先自加記錄材質(zhì)數(shù)目的變量,然后為當(dāng)前材質(zhì)塊分配一塊空白的結(jié)構(gòu),接著遞歸讀出相關(guān)信息。當(dāng)主塊讀完后,整個(gè)讀入程序結(jié)束。讀入程序的主要流程圖如圖3所示。
圖3 3DS文件處理流程圖Fig.3 3DS document processing flow chart
通過面向?qū)ο蟮木幊?,?shí)現(xiàn)了3DS文件數(shù)據(jù)信息的讀取,對(duì)象的繪制就是根據(jù)類中保存的信息進(jìn)行繪制,場(chǎng)景控制主要是基于D3D InputSystem實(shí)現(xiàn)鍵盤和鼠標(biāo)的控制操作。用OpenGL繪圖命令繪制出來,主要代碼如下。
光線追蹤時(shí)一種真實(shí)地顯示物體的方法。光線追蹤算法是生成真實(shí)感圖形的主要算法之一。它通過跟蹤每一條從視點(diǎn)出發(fā)的光線,計(jì)算光線與景物交點(diǎn)的光強(qiáng),可以精確地在三維實(shí)體上產(chǎn)生陰影、反射、折射及表面紋理等真實(shí)感很強(qiáng)的光學(xué)效果。標(biāo)準(zhǔn)的光線追蹤算法需要計(jì)算每一條與景物空間相交的光線,并且要根據(jù)景物的性質(zhì)進(jìn)行光的反射、折射等計(jì)算,計(jì)算量非常龐大,因此很難滿足真實(shí)感圖形顯示的實(shí)時(shí)性要求,為了提高顯示的實(shí)時(shí)性,一般通過提高光線追蹤算法的效率及并行處理技術(shù)來實(shí)現(xiàn)。
在本文中采用二叉空間剖分[6](BSP)加速技術(shù),來提高光線追蹤的效率。它由Schumacker于1969年首先提出,90年代初期由John Carmack和John Romero最早在第一人稱視角游戲Doom中引入。自那以后,幾乎所有的第一人稱射擊類游戲都采用BSP技術(shù)。BSP樹能應(yīng)用在深度排序、碰撞檢測(cè)、繪制、節(jié)點(diǎn)裁剪和潛在可見集的計(jì)算,極大地加速了三維場(chǎng)景的漫游。它基于這樣一個(gè)事實(shí):空間中的任何平面都將整個(gè)空間分割成兩個(gè)半空間,位于該平面某一側(cè)的所有點(diǎn)構(gòu)成了一個(gè)半空間,位于另一側(cè)的點(diǎn)則定義了另一個(gè)半空間,該平面則是將兩個(gè)半空間剖分開來的分割面。根據(jù)這種空間剖分的方法,可以建立起對(duì)整個(gè)幾何場(chǎng)景和場(chǎng)景中各種物體幾何的描述。BSP樹的根節(jié)點(diǎn)就是整個(gè)場(chǎng)景,每個(gè)節(jié)點(diǎn)所代表的區(qū)域被平面分成兩部分,一部分是平面前面(左側(cè))區(qū)域的子節(jié)點(diǎn),另一部分是平面后面(右側(cè))區(qū)域的子節(jié)點(diǎn)。對(duì)子節(jié)點(diǎn)剖分,一直向下遞歸直到空間內(nèi)部沒有多邊形或者剖分的深度達(dá)到指定的數(shù)值時(shí)才停止。BSP樹具有內(nèi)存開銷小,剖分產(chǎn)生的無效區(qū)域少,樹結(jié)構(gòu)比較平衡及樹的深度較淺等優(yōu)點(diǎn)。
基于上述方法,本文設(shè)計(jì)實(shí)現(xiàn)了三維場(chǎng)景模型的讀取、繪制和操作,在此基礎(chǔ)上實(shí)現(xiàn)了基于BSP的光線追蹤算法,并且在場(chǎng)景中實(shí)現(xiàn)了簡(jiǎn)單的粒子系統(tǒng)。仿真場(chǎng)景圖如圖4所示。此圖(b)中的亮光區(qū)域即為手槍子彈的爆炸(粒子系統(tǒng))演示。
圖4 基于3DS文件實(shí)現(xiàn)的虛擬場(chǎng)景Fig.4 Based on the 3 DS file virtual scene
3DS是一種通用的保存三維模型的數(shù)據(jù)格式,因此研究該格式的讀取和繪制很有重要的實(shí)際意義。本文基于面向?qū)ο蟮木幊谭椒▽?duì)3DS文件進(jìn)行讀取,利用OpenGL進(jìn)行重繪,大大降低OpenGL建立復(fù)雜模型的難度,可以較容易的得到真實(shí)的三維復(fù)雜物體模型。在此基礎(chǔ)上運(yùn)用光線追蹤技術(shù),對(duì)三維模型場(chǎng)景進(jìn)行實(shí)時(shí)渲染,使得生成的場(chǎng)景更加逼真,具有真實(shí)感。
[1]于瑩瑩.在VC中利用OpenGL實(shí)現(xiàn)動(dòng)態(tài)效果圖像的技巧[J].微型電腦應(yīng)用,2002,18(6):50-52.
YU Ying-ying.In the VC using OpenGL realize dynamic image skills[J].Microcompute Applications,2002,18(6):50-52.
[2]彭群生,鮑虎軍,金小剛.計(jì)算機(jī)真實(shí)感圖形的算法基礎(chǔ)[M].北京:科學(xué)出版社,1999.
[3]Wright R S,Lipchak B.OpenGL超級(jí)寶典[M].徐波,譯.3版.北京:人民郵電出版社,2005.
[4]郭景,雷鳴.3DSMAX模型在OpenGL中的讀取與重現(xiàn)[J].自動(dòng)化與儀表,2002,17(5):46-49.
GUO Jing,LEI Ming.3DSMAX model in the OpenGL reading and reappear[J].Automation and Instrumentation,2002,17(5):46-49.
[5]殷素峰,高雪強(qiáng),楊勝?gòu)?qiáng).在OpenGL環(huán)境下開發(fā)3DS文件瀏覽器[J].工程圖學(xué)學(xué)報(bào),2005(6):22-25.
YAN Su-feng,GAO Xue-qiang,YANG Sheng-qiang.Development 3DS file browser based on OpenGL[J].Journal of Engineering Graphics,2005(6):22-25.
[6]Kaplan M.Space-tracing:a constant time ray-tracer[C]//SIGGRAPH’85 State of the Art Image Syn Sem Notes,1985:149-158.