3ds模型在OpenGL中的讀取和重繪

對OpenGL做了基本的介紹,並詳細介紹了3ds模型的文件格式.在VC+十下的OpenGL編程中完成了3ds模型的讀取與重繪.並例舉了一個3ds模型驗證了程序的可行性.

  1、引言

  OpenGL是一種強大的三維圖形開發工具,是圖形硬件的軟件接口,它由大約250個命令組成,用戶通過這些命令指定創建交互式2D或3D程序所需的幾何對象和操作.從本質上說,它是一個3D圖形和模型庫,獨立於操作系統和硬件環境,具有高度的可移植性,並且具有非常快的速度.OpenGL嚴格按照計算機圖形學原理設計而成,符合光學和視覺原理,可以創建極其逼真的3D圖像,許多三維演示系統都用 OpenGL作爲三維圖象生成和控制的編程接口,在系統仿真系統、CAD系統或者虛擬現實系統中,往往需要構造一些複雜的模型,但是直接利用OpenGL的圖元繪製命令或曲線曲面繪製命令進行復雜模型的建模不太現實.我們往往先利用專業建模軟件比如3DSMAX建立需要的模型,然後結合Visual C++開發環境直接獲取3DS模型數據,在OpenGL中進行繪製交互控制.這種方法一方面可以利用專業建模軟件3DSMAX的優點,較快地建立比較複雜的模型,另一方面利用OpenGL的編程接口對建立的模型進行實時繪製和交互控制,降低建模時間,加快系統開發進程因此,學會讀取和操作ads文件對於建立比較實用的三維圖形應用軟件顯得非常重要.

  2、3ds模型文件格式

  3ds模型文件由許多塊組成,每個塊首先描述其後的信息類別,即該塊是如何組成的,快得信息類別是用ID來識別的,塊還包含了下一個塊的相對位置信息,因此,即使你不瞭解一個塊的含義,你也可以很容易地跳過它,因爲其中指出了下一個塊相對於該塊起始位置的偏移字節數,與許多文件格式一樣,3ds模型二進制文件中的數據也是按低位在前高位在後的方式組織的,例如,兩個十六進制字節:3A4C組成的整型數,表明4C是高位字節,3A是低位字節.對於長整型數如:4ASC3B8F表明5C4A是低位字,而SF3B是高位字.

  塊的具體定義爲:塊的前兩項信息分別是:塊的ID和塊的長度,塊的id是一個整型數,而塊的長度是一個長整型數.每個塊實際上是一個層次結構,不同類型的塊,其層次結構也不相同.ads模型文件中有一個基本塊,其id是4D4D,每一個ads模型文件的開頭都開始由這樣的塊構成,基本塊內的塊稱主塊主塊包括3D編輯器塊和關鍵禎塊,其中3D編輯器塊包括材質列表塊,兩配置塊,視口定義塊,物體定義塊等,這其中的塊又可以逐級包含一些塊,總之3DS模型文件是由塊組成的一種層次結構.3DS模型文件中幾個主要的塊ID及信息如表1所示:

  3ds文件有非常複雜的塊層次結構,各個子塊下又包含其它更多的子塊,在整個場景中,每個物體被標識了一個數字,以表示其在場景中的順序,作爲根物體給予了數-1(FFFF)作爲其數字標識.當讀取文件的時候,就會得到一系列的物體數字標識.對於ads文件,如果當前數字比前一個大,那麼當前物體是前一個物體的子物體,反之,當數字標識比前一個數字標識小,則又回到上一層結構.至今爲止,沒有任何一個官方的文件完全說明3d。的文件格式,即具體指出每一個塊的m和其含義,還有許多未知的塊,不過這樣並不影響我們在程序中讀人ads文件類型的模型,而忽略掉那些不感興趣或未知的塊,這正是塊結構給我們帶來的好處.

3、3ds模型讀取與重繪

  1)3ds模型讀人

  知道了3DS模型文件格式後,在程序中,我們要讀入3DS模型一般情況下,3ds文件中的對象塊、顏色塊和材質塊信息是最重要的,對三維模型起着關鍵性的作用,所以要在程序中讀入.我們在VC ++的MFC框架的程序中定義一個類import3DS用於3ds文件的讀入.在這個類中,主要用到了3個函數,PcocessNextChunk( )(將3ds文件中的每個塊讀出)、ProcessNextObjectChunk ( )(處理文件所有對象的信息),ProcessNextMaterialChunk( )(處理所有的材質信息).這三個函數全部採用遞歸的方法,將3ds中需要的塊數據讀出並存儲在自己組織的數據格式中.3d模型數據是在一個結構體中定義的,主要用於將3ds文件中讀出的數據保存在模型中.這些數據在OpenGL環境下可以進行重繪,從而免去了直接用OpenGL繪製複雜三維模型這個複雜的工作.數據模型定義源代碼如下:

  //定義3D類的點,用於保存模型中的頂點

3ds模型在OpenGL中的讀取和重繪 - 蔡忠鋒 - 希望
3ds模型在OpenGL中的讀取和重繪 - 蔡忠鋒 - 希望
3ds模型在OpenGL中的讀取和重繪 - 蔡忠鋒 - 希望
3ds模型在OpenGL中的讀取和重繪 - 蔡忠鋒 - 希望
3ds模型在OpenGL中的讀取和重繪 - 蔡忠鋒 - 希望

  三維數據模型主要有四個鏈接表:pVects[ ],pNormal[ ], pTexYerts[ ], pFaces[ ]組成.PVerts[ ]是頂點鏈接表,描述了物體的所有頂點的信息;pNormal[ ]是法向量連接表,描述了物體的所有面法線和頂點法線的信息,法向量用於後續的光照計算;pTexVerts[ ]是二維紋理座標鏈接表,描述了物體的所有紋理UV座標的信息,UV紋理座標在紋理映射時要用到;pFaces[ ]是面信息鏈接表,存儲場景中的各個三角面.

3ds模型在OpenGL中的讀取和重繪 - 蔡忠鋒 - 希望

 

 2)模型的重繪

  讀取了模型數據以後,我們通過以下步驟實現模型的重繪:

3ds模型在OpenGL中的讀取和重繪 - 蔡忠鋒 - 希望

  4、驗證程序的可行性

  爲了驗證上述程序的可行性,本人用3dsmax建了一個場景,如圖(1)所示,導出爲3ds模型.運行上述程序,並導人這個剛建的3ds模型,則如圖(2)所示,基本上實現了模型的讀取和重繪.

3ds模型在OpenGL中的讀取和重繪 - 蔡忠鋒 - 希望

3ds模型在OpenGL中的讀取和重繪 - 蔡忠鋒 - 希望

  5、結束語

  3ds模型在OpenGL中的成功讀取和重繪,大大降低了OpenGL建立複雜模型的難度,我們可以較容易的得到比較真實的三維複雜物體模型同時,在OpenGL程序中,引入3ds數據模型文件後,還可以進行交互處理因此,在實驗系統中這個成果可應用到城市規劃和虛擬現實等領域中.當然,當讀取的3ds模型數據量很大的時候,如何快速的顯示模型,如何在讀人的模型中加人屬性信息,難度比較大,還有待於進一步研究.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章