陳 曉,馬建倉
(西北工業大學 電子信息學院,陜西 西安 710129)
隨著計算機圖形學的發展,計算機動畫、科學計算可視化和虛擬現實逐漸成為計算機圖形學領域中3大重要技術,其中三維現與廣泛應用于建筑學、醫學、模擬仿真、虛擬現實等諸多領域[1]對大多數人來說,計算機真實感圖形已不再是一個陌生的名詞,它正日益廣泛的深入到人們日常的工作、學習和生活中,在影視特技、廣告動畫中,人們已經領略到計算機真實感圖形的神奇魅力。真實感圖形是一種計算機生成技術,它首先在計算機中構造出所需場景的幾何模型,然后根據假定的光照條件,計算畫面上可見的各個景物表面的光亮度,從而產生逼真的視覺效果。
文中主要針對Autodesk公司的3DMAX軟件建立幾何模型,從而對生成的3DS文件進行編程,實現3DS文件的讀取、重繪及控制。傳統的基于過程的設計方法,由于相關函數多而且散雜同時數據又與函數分離,導致不便于程序的移植,為了克服這些缺點,本文采用了面向對象的程序設計方法,將3DS文件的形體數據讀入到類中,然后利用光線追蹤技術[2]實現對三維模型的渲染,使得生成的場景更加逼真,具有真實感。
3DS文件是基于塊(chunk)結構存儲的。一個塊開始是2個字節的ID,4個字節的塊長度信息,然后是塊的主要數據。將3DS文件以16進制方式打開如圖1所示,數據按照低位在前,高位在后的方式存儲。例如,2個16進制字節FFAF組成的整型數,表明AF是高字節,FF是低字節;對于長整型數,如。938E 0600,表明8E93是低位字,0006是高位字。

圖1 3DS文件的16進制數據構成Fig.1 3 DS file hexadecimal data form
3DS文件中 有一個基本塊,其ID是4D4D,每個3DS文件的開頭都是這樣的一個塊。基本塊中的子塊是3D編輯塊和關鍵幀塊,前者的ID是3D3D,后者的ID是B000.圖2說明了3DS的塊結構以及各個塊之間的嵌套關系。下面對主要的幾個塊進行簡單介紹。
1)主編輯塊(0X3D3D)
描述場景數據的主編輯塊存儲了當前編輯場景的狀況和當前窗口的配置數據,這些數據是用于顯示三維圖形的重要幾何信息,也是基于OPENGL裝載3DS文件的重點煙酒部分。
2)材質塊(0XAFFF)
材質塊定義了使用與物體上的材質屬性,包括材質的名稱,顏色以及貼圖等。如果讀入的材質包含貼圖,則貼圖所對應的文件名、透明度信息、位置和纏繞方法也都存儲在材質塊的響應子塊中。

圖2 3DS文件塊結構Fig.2 3 DS file chunk structure
3)物體塊(0X4000)
物體塊下有物體網格塊 (0X4100)和物體材質塊(0X4130)。物體網格塊存儲的是模型的頂點、頂點的紋理坐標、面信息以及邊信息等。物體材質塊中存儲的是當前物體上所賦予的材質,該塊與材質塊的區別是,材質塊存儲的是3DS文件中材質庫中的信息,而物體材質塊中存儲的是當前物體上的材質信息。
4)其他塊
當遇到塊信息未知或對模型顯示不起作用的塊時(如關鍵幀塊),可不進行處理直接讀入下一個塊。
OpenGL全稱為“開放式圖形庫”,是由SGI公司開發的三維圖形API,目前在圖形開發領域已經成為工業標準。OpenGL是一種強大的三維圖形開發工具,是圖形硬件的軟件接口[3],OpenGL主要工作是將三維的物體投影到一個二維平面上,之后處理得到的像素,進行顯示。首先將物體轉化為可以描述物體幾何性質的頂點與描述圖像的像素,在執行其他操作后,最終將這些數據轉化為像素數據。
1)針對每個頂點的操作和幾何要素裝配
每個頂點的空間坐標需要經過模型取景矩陣變換、法向矢量矩陣變換,若允許紋理自動生成,則由變換后的頂點坐標所生成的新紋理坐標替代原有的紋理坐標,再經過當前紋理矩陣變換。然后根據幾何要素類型決定采取不同的幾何要素裝配方式。
2)像素操作
由主機讀入的像素首先解壓縮成適當的組分數目,然后進行數據放大、偏置,并經過像素映射處理,根據數據類型的限制在適當的取值范圍內。像素最后寫入紋理內存,使用紋理映射或光柵化生成像素段。
3)像素段操作
當使用紋理映射時,每個像素段將產生紋素,再進行霧效果計算、反走樣處理,接著進行剪裁處理、一致性檢驗、模板檢驗、深度緩沖區檢驗和抖動處理。
3DS文件中采用的是塊結構,并且塊與塊之間存在嵌套的關系,所以對3DS文件中三維模型數據的讀取采用遞歸的方法。返回上一級的條件是當前已經讀入的塊字節數是否等于塊的長度,從父塊跳轉到子塊可用switch語句實現,通過子塊的ID判斷進入那個子塊分支。當遇到沒有必要讀入的塊時,可通過ID判斷,若不需要此塊信息,則可將文件指針向前移動(塊長度—6)個字節[5]然后break跳過該塊,處理下一塊。當遇到需要讀入的塊時,例如材質塊,通過判斷當ID為0XAFFF(EDIT-MATERIAL)時,首先自加記錄材質數目的變量,然后為當前材質塊分配一塊空白的結構,接著遞歸讀出相關信息。當主塊讀完后,整個讀入程序結束。讀入程序的主要流程圖如圖3所示。

圖3 3DS文件處理流程圖Fig.3 3DS document processing flow chart
通過面向對象的編程,實現了3DS文件數據信息的讀取,對象的繪制就是根據類中保存的信息進行繪制,場景控制主要是基于D3D InputSystem實現鍵盤和鼠標的控制操作。用OpenGL繪圖命令繪制出來,主要代碼如下。


光線追蹤時一種真實地顯示物體的方法。光線追蹤算法是生成真實感圖形的主要算法之一。它通過跟蹤每一條從視點出發的光線,計算光線與景物交點的光強,可以精確地在三維實體上產生陰影、反射、折射及表面紋理等真實感很強的光學效果。標準的光線追蹤算法需要計算每一條與景物空間相交的光線,并且要根據景物的性質進行光的反射、折射等計算,計算量非常龐大,因此很難滿足真實感圖形顯示的實時性要求,為了提高顯示的實時性,一般通過提高光線追蹤算法的效率及并行處理技術來實現。
在本文中采用二叉空間剖分[6](BSP)加速技術,來提高光線追蹤的效率。它由Schumacker于1969年首先提出,90年代初期由John Carmack和John Romero最早在第一人稱視角游戲Doom中引入。自那以后,幾乎所有的第一人稱射擊類游戲都采用BSP技術。BSP樹能應用在深度排序、碰撞檢測、繪制、節點裁剪和潛在可見集的計算,極大地加速了三維場景的漫游。它基于這樣一個事實:空間中的任何平面都將整個空間分割成兩個半空間,位于該平面某一側的所有點構成了一個半空間,位于另一側的點則定義了另一個半空間,該平面則是將兩個半空間剖分開來的分割面。根據這種空間剖分的方法,可以建立起對整個幾何場景和場景中各種物體幾何的描述。BSP樹的根節點就是整個場景,每個節點所代表的區域被平面分成兩部分,一部分是平面前面(左側)區域的子節點,另一部分是平面后面(右側)區域的子節點。對子節點剖分,一直向下遞歸直到空間內部沒有多邊形或者剖分的深度達到指定的數值時才停止。BSP樹具有內存開銷小,剖分產生的無效區域少,樹結構比較平衡及樹的深度較淺等優點。
基于上述方法,本文設計實現了三維場景模型的讀取、繪制和操作,在此基礎上實現了基于BSP的光線追蹤算法,并且在場景中實現了簡單的粒子系統。仿真場景圖如圖4所示。此圖(b)中的亮光區域即為手槍子彈的爆炸(粒子系統)演示。

圖4 基于3DS文件實現的虛擬場景Fig.4 Based on the 3 DS file virtual scene
3DS是一種通用的保存三維模型的數據格式,因此研究該格式的讀取和繪制很有重要的實際意義。本文基于面向對象的編程方法對3DS文件進行讀取,利用OpenGL進行重繪,大大降低OpenGL建立復雜模型的難度,可以較容易的得到真實的三維復雜物體模型。在此基礎上運用光線追蹤技術,對三維模型場景進行實時渲染,使得生成的場景更加逼真,具有真實感。
[1]于瑩瑩.在VC中利用OpenGL實現動態效果圖像的技巧[J].微型電腦應用,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]彭群生,鮑虎軍,金小剛.計算機真實感圖形的算法基礎[M].北京:科學出版社,1999.
[3]Wright R S,Lipchak B.OpenGL超級寶典[M].徐波,譯.3版.北京:人民郵電出版社,2005.
[4]郭景,雷鳴.3DSMAX模型在OpenGL中的讀取與重現[J].自動化與儀表,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]殷素峰,高雪強,楊勝強.在OpenGL環境下開發3DS文件瀏覽器[J].工程圖學學報,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.