劉爽,張恒博
(大連民族學(xué)院計算機(jī)科學(xué)與工程學(xué)院,遼寧大連 116605)
三維建模軟件3ds Max數(shù)據(jù)文件3ds的解析
劉爽,張恒博
(大連民族學(xué)院計算機(jī)科學(xué)與工程學(xué)院,遼寧大連 116605)
為了實現(xiàn)三維建模數(shù)據(jù)的快速讀取和解析,提出了一種解析保存3ds數(shù)據(jù)的方法并應(yīng)用到實際三維漫游軟件中。作為專業(yè)的三維建模軟件,3ds Max提供了強(qiáng)大的快速建模功能。但由于需要占用大量CPU和內(nèi)存資源,因此其實時交互性較差,很難直接應(yīng)用到實際工程項目中。充分利用3ds Max的快速建模能力,分析3ds Max的建模文件3ds數(shù)據(jù)格式,以其內(nèi)部樹狀數(shù)據(jù)結(jié)構(gòu)為基礎(chǔ),按照其存儲特點及數(shù)據(jù)之間的關(guān)系有效讀取,并采用C++高效編碼實現(xiàn),以自定義的列表類、對象類、材質(zhì)庫類合理的組織和保存,為三維場景重建奠定基礎(chǔ)。實際應(yīng)用表明該解析算法實用有效。
3ds Max;三維建模;3ds數(shù)據(jù)文件;實時交互;解析
隨著虛擬現(xiàn)實技術(shù)的發(fā)展,航空航天、醫(yī)學(xué)實習(xí)、軍事訓(xùn)練、建筑設(shè)計、教育培訓(xùn)等眾多領(lǐng)域?qū)谌S建模的三維可視化技術(shù)需求越來越大[1-3]。這里的三維建模技術(shù)是指獲取實際環(huán)境的三維數(shù)據(jù),并根據(jù)應(yīng)用的需要,利用獲取的三維數(shù)據(jù)建立相應(yīng)的虛擬環(huán)境模型。目前,常用的三維建模軟件包括AutoCAD、3ds Max、Rhino、Alias、Solidthink、3D VIZ等等。盡管不同的三維建模軟件適用于不同的應(yīng)用領(lǐng)域,但3ds Max還是以適用范圍廣、功能強(qiáng)大而成為PC機(jī)上全球使用人數(shù)最多的三維設(shè)計軟件之一。3ds Max全稱3D Studio Max,是Autodesk多媒體分公司——Discreet公司開發(fā)的三維建模、渲染、動畫制作軟件,其專業(yè)性較強(qiáng),功能可以與工作站級的軟件相媲美,廣泛應(yīng)用于電影特效制作、影視動畫設(shè)計(廣告、片頭)、建筑裝潢、游戲制作(交互式和電影式)、三維概念化設(shè)計等各個領(lǐng)域。
但是大規(guī)模三維場景的三維模型往往比較復(fù)雜,3ds Max軟件在普通的個人PC機(jī)上運行這些復(fù)雜三維模型時需要占用大量的CPU和內(nèi)存資源,因此交互性和實時性較差。本文將主要討論其建模數(shù)據(jù)3ds文件的特點、組織方式,快速解析并合理保存,充分利用該建模軟件快速強(qiáng)大的建模功能的同時借助于OpenGL保證三維可視化的實時交互性。
3ds Max軟件的建模數(shù)據(jù)保存為以“.DS”為擴(kuò)展名的3ds數(shù)據(jù)文件格式。出于保護(hù)版權(quán)等原因,文件3ds對外格式是不公開的,Autodesk公司對3ds文件不提供任何支持。但是可以通過已知的數(shù)據(jù)結(jié)構(gòu)及相關(guān)研究資料完成3ds文件的解析。3ds文件中保存有三維建模所需的點、線、面、材質(zhì)等屬性特征,通過讀取其二進(jìn)制格式數(shù)據(jù),可以編程實現(xiàn)獲取點、線、面、材質(zhì)等數(shù)據(jù),進(jìn)而實現(xiàn)三維場景重建。
解析3ds文件的關(guān)鍵是理清文件的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。3ds文件內(nèi)部是以“塊”為單位組織的。這里,“塊”是指相同類型數(shù)據(jù)信息的集合。所有塊信息的數(shù)據(jù)格式見表1。
表1 塊數(shù)據(jù)格式
由表1可知,這些塊數(shù)據(jù)說明了緊跟其ID之后的內(nèi)容和下一個塊的地址。下一個塊的指針與當(dāng)前塊的首地址和長度有關(guān)。所有的塊都是以一個塊頭為起始的,后面跟著塊數(shù)據(jù)和子塊。塊頭是表1中的前兩行,包括兩個字節(jié)保存的塊ID和四個字節(jié)保存的塊的長度信息。根據(jù)不同塊的ID值就可以獲取該塊的數(shù)據(jù)信息。
3ds文件以二進(jìn)制形式存儲,以二進(jìn)制打開任何一個3DS文件,可以發(fā)現(xiàn)其內(nèi)容都是以4D4D開頭,如圖1,該圖為太陽鳥的三維建模數(shù)據(jù)文件。可以通過判斷文件起始的兩個字節(jié)是否為0x4D4D來判斷文件是否為3ds格式。
圖1 3ds文件的十六進(jìn)制數(shù)據(jù)查看
與許多文件格式一樣,3ds二進(jìn)制文件中的數(shù)據(jù)也是按低位在前、高位在后的方式組織的,例如,兩個十六進(jìn)制字節(jié)4A 5C組成的整型數(shù),則5C是高位字節(jié),4A是低位字節(jié);對于長整型數(shù),如:4A 5C 3B 8F,則5C4A是低位字,而8F3B是高位字,解析數(shù)據(jù)時需遵循這一規(guī)則。
3ds文件中所有的塊以樹形結(jié)構(gòu)組織在一起,就是說大塊中包含小塊,最頂層的塊為主塊(Main Chunk),其塊ID為0x4D4D。三維場景重建所需的塊均是主塊的一級或多級子塊,每個塊所包含的信息不同,所以每塊內(nèi)部的數(shù)據(jù)結(jié)構(gòu)也并不相同。
為了直觀的說明3ds文件數(shù)據(jù)之間的關(guān)系,本文選擇三維重建主要的塊:主編輯塊(3D Editor Chunk)、對象塊(Object Block)、材質(zhì)塊(Material Block)、關(guān)鍵幀塊(Keyframer Chunk)來說明塊之間的父子關(guān)系,如圖2,不同層次的樹狀結(jié)構(gòu)就體現(xiàn)了不同的父子關(guān)系。這里由于篇幅關(guān)系圖2并未列出所有的塊數(shù)據(jù),為避免個別節(jié)點的子節(jié)點過多,某些子塊信息已省略。
其中,MAIN3DS(0x4D4D)為3ds文件中的主塊,包含所有其它的塊,所有子塊中最重要的就是主編輯塊EDIT3DS。
EDIT3DS(0x3D3D)塊,包含對象塊EDIT_ OBJECT,也就是三維場景中的對象。
EDIT_OBJECT(0x4000)塊,包含OBJ_TRIMESH塊。塊頭之后緊跟著一個以NULL結(jié)尾的字符串對象名。
OBJ_TRIMESH(0x4100)塊,包含對象的幾何信息:頂點、面、紋理坐標(biāo)。
TRI_VERTEXL(0x4110)塊,包含頂點列表,格式為兩字節(jié)無符號整型頂點總數(shù),之后是頂點數(shù)目個三元組,每個三元組為一個點的XYZ坐標(biāo)。這里需要注意的是,OpenGL的空間坐標(biāo)系是右手坐標(biāo)系,而3DS文件的坐標(biāo)系是左手坐標(biāo)系,因此在讀取時要對其進(jìn)行適當(dāng)?shù)霓D(zhuǎn)化,將讀取的坐標(biāo)值的Y坐標(biāo)與Z坐標(biāo)對調(diào),并將對調(diào)之后的Z坐標(biāo)翻轉(zhuǎn)。
TRI_FACEL1(0x4120)塊,定義面信息,每個面都是由三個點構(gòu)成的。格式與點塊類似,前兩個字節(jié)是無符號整型數(shù)字,代表面的總數(shù),接下來是4個兩字節(jié)的無符號整型,前三個是點在點塊中的索引號,最后一個是標(biāo)志位??梢愿鶕?jù)面塊中每個面對應(yīng)三個點在點塊中的索引,搜索到點的三維坐標(biāo)。
TRI_TEXCOORD(0x4140)塊,提供紋理坐標(biāo),起始的兩個字節(jié)無符號整型表示列表中的條目總數(shù),之后是兩浮點數(shù)的序列對,定義相應(yīng)頂點的二維紋理坐標(biāo)。
圖2 3ds文件樹形結(jié)構(gòu)圖
假設(shè)從3ds文件中截取22個字節(jié)的數(shù)據(jù):
讀取文件頭,判斷ID是否為0x4D4D,若ID不是0x4D4D則直接跳出,否則繼續(xù)。
接著就是按照樹狀塊的結(jié)構(gòu)通過while循環(huán),從樹干、樹杈、樹枝依次讀取,也就是按照文件指針的順序依次讀取,如果讀取到的塊信息是三維建模需要的,那么進(jìn)一步解析。如果讀取的塊信息未知,那么直接跳過。注意讀取過程不能按特定的塊ID去查找塊信息,因為并不是所有的塊都存在,比如材質(zhì)塊,如果在建模時未指定對象材質(zhì),那么導(dǎo)出的3ds文件中就不包含材質(zhì)塊。主程序流程如圖3。
其中,Read3DSChunk()函數(shù)用于將塊的內(nèi)容讀入塊結(jié)構(gòu)中,對每個塊調(diào)用的Read3DSFile()函數(shù)用來獲取對象信息、材質(zhì)信息、關(guān)鍵幀信息等。Read3DSFile()函數(shù)中調(diào)用ReadMDATA()函數(shù)讀取最高級的對象數(shù)據(jù);ReadKFDATA()函數(shù)讀取關(guān)鍵幀數(shù)據(jù)。
圖3 解析3ds文件的主流程
這里對主編輯塊的解析流程簡要加以說明。根據(jù)塊頭的ID號判斷讀取的是材質(zhì)塊還是對象塊。當(dāng)讀取到材質(zhì)塊時,則將讀取到的信息保存到材質(zhì)結(jié)構(gòu)體tMaterial中,每讀完一個材質(zhì)塊,就將其添加到材質(zhì)對象MaterialDict中,最終組成材質(zhì)庫。當(dāng)讀取到的是對象塊時,調(diào)用ReadNamed-Object()函數(shù)來讀入對應(yīng)名稱的對象塊,其它名稱的塊將忽略,該函數(shù)只對塊ID為0x4100的對象塊進(jìn)行處理,其余的塊直接跳過。
對象由點、面、材質(zhì)三部分構(gòu)成。因此,讀取對象塊時可以根據(jù)塊的ID值做不同的處理。
如果塊ID值為0x4110,則當(dāng)前塊為點塊。把點數(shù)據(jù)讀入的同時寫入對象類。
如果塊ID為0x4120,則當(dāng)前塊為面塊。讀取面塊時首先獲取總面數(shù),通過fread(&value,sizeof (value),1,fp)將面數(shù)讀取到value變量中,接著根據(jù)面數(shù)循環(huán)讀取每個面對應(yīng)三個點的索引,循環(huán)結(jié)束后將索引加入到object對象中,然后讀取該面塊包含的面對應(yīng)的材質(zhì)名稱并根據(jù)名稱到材質(zhì)庫中查找,接下來讀入該材質(zhì)映射的面的數(shù)量,最后將查找得到的材質(zhì)加入到object對象中并與對應(yīng)的面進(jìn)行關(guān)聯(lián)。
如果塊ID值為0x4140,則當(dāng)前塊為紋理坐標(biāo)塊。UV紋理坐標(biāo)是二維坐標(biāo),其作用是實現(xiàn)三維場景中逼真的三維環(huán)境,即把現(xiàn)實世界中的圖片嵌合在三維物體上。3ds中提供的方法是應(yīng)用紋理坐標(biāo)之前首先由點塊中對應(yīng)的三個點確定一個平面,然后再由三個紋理坐標(biāo)確定該面所需的貼圖。每個UV紋理坐標(biāo)由兩個浮點數(shù)構(gòu)成,與之前讀取的點塊中每個點依次對應(yīng),所以紋理坐標(biāo)的數(shù)量與點塊中點數(shù)完全相同。
在OpenGL[4]中實現(xiàn)三維重建時,面是由點構(gòu)成的,對象是由面構(gòu)成的,對象上的顏色、貼圖等數(shù)據(jù)則是由材質(zhì)庫根據(jù)對象不同的面選擇不同的材質(zhì)塊進(jìn)行映射。因此,在2.1節(jié)讀取3ds文件的過程中必須保存相應(yīng)數(shù)據(jù)。本文3ds文件數(shù)據(jù)的保存是通過三個類完成的,分別為對象類、列表類、材質(zhì)庫類。其中對象類用于保存一個對象的所有信息,包括坐標(biāo)點、紋理坐標(biāo)點、對象本身所用的材質(zhì),面的信息等等。列表類的作用是可以索引所有的對象,即可以通過列表類獲取所有已知的信息。材質(zhì)庫類用于保存讀取的材質(zhì)塊,其中包括材質(zhì)的鏡面光成分、散射光成分、對應(yīng)的紋理貼圖名等。
由上節(jié)的讀取解析過程可知,一個3ds文件解析之后保存成了一個列表類、一個材質(zhì)庫類,一個列表類對應(yīng)一個或多個對象類。其中材質(zhì)庫類包含所有的材質(zhì)信息,而一個對象類包含了該對象所有三維重建所需要的數(shù)據(jù)信息及對應(yīng)材質(zhì)庫的索引。在OpenGL中實現(xiàn)三維重建時只需要通過列表類就可找到所有需要的數(shù)據(jù)信息。
OpenGL作為專業(yè)的3D程序接口,定義了一個跨編程語言、跨平臺的編程接口,可以方便的進(jìn)行3D物體交互性應(yīng)用程序的開發(fā)。本文在MFC框架下,利用OpenGL三維建模功能函數(shù)及交互繪制函數(shù)實現(xiàn)了大連民族學(xué)院校園三維漫游系統(tǒng)軟件的開發(fā)。由于本文的側(cè)重點在于3ds數(shù)據(jù)文件格式的有效解析和保存,因此對基于MFC框架和OpenGL類庫實現(xiàn)的三維重建就不再詳細(xì)陳述,相關(guān)信息可以查閱參考文獻(xiàn)[5]。3ds Max軟件與本漫游軟件運行相同場景時的每幀刷新結(jié)果見表2,這里pc機(jī)配置CPU為Intel Pentium Dual E2180 2.00GHz主頻,1G內(nèi)存,120G硬盤的普通電腦,不同的場景為把整個校園建模數(shù)據(jù)分割為不同的組成部分。由對比數(shù)據(jù)可以看出本漫游軟件在三維場景漫游過程中畫面更流暢。
表2 3ds Max與漫游軟件運行效果對比
在OpenGL+MFC框架下,以解析的3ds數(shù)據(jù)為基礎(chǔ)實現(xiàn)的三維重建,完成了大連民族學(xué)院三維漫游系統(tǒng),該軟件可以在普通個人用戶的PC機(jī)上流暢運行。這種實現(xiàn)方案不僅有效利用了3ds Max軟件的快速建模功能,在保證良好三維重建效果的同時,借助OpenGL的交互繪制編程接口提供了強(qiáng)大的實時交互功能。
[1]HUANG Y L,ZHANG X,3D reconstruction based on OpenGL and treatment of smoothness[C].In Proceedings of 2011 IEEE 3rd International Conference on Communication Software and Networks(ICCSN 2011),Xi'an,China,2011:78-81.
[2]OZKAN N F,GREENSTEIN J S.Effects of 2D online and 3D virtual world meeting spaces on the performance of a concept selection task by engineering design teams[C].In Proceedings of the Human Factors and Ergonomics Society 55th Annual Meeting,HFES 2011,2011:1676-1680.
[3]郭立萍,李光霞,董碩.虛擬現(xiàn)實技術(shù)在構(gòu)建虛擬旅游環(huán)境中的應(yīng)用[J].安徽農(nóng)業(yè)科學(xué),2010,38(18): 9811-9813.
[4]HEARN D,PAULINE M B.Computer Graphics with OpenGL[M].北京:電子工業(yè)出版社,2005.
[5]李國超,劉爽,張延超,等.VC環(huán)境下基于OpenGL與3DS的三維場景重建[J].電腦知識與技術(shù),2010,26 (10):10131-10133.
Parsing of 3ds Data File Provided by Three Dimensional Modelling Software 3ds Max
LIU Shuang,ZHANG Heng-bo
(School of Computer Science&Engineering,Dalian Nationalities University,Dalian Liaoning 116605,China)
To read and parse three dimensional modelling data rapidly,an approach of parsing and saving 3ds data is proposed and applied in a practical 3D walkthrough software.As a professional three dimensional modelling software,3ds Max provides powerful and rapid functions of modelling.But due to massive occupation of resources of CPU and memory,real-time interaction of this software is poor and practical application of engineering projects is difficult.Making full use of the advantages of rapid modelling functions of 3ds Max software,we analyzed modelling file with 3ds data format provided by 3ds Max based on its inner tree-structured data structure.C+ +programming language is adopted to implement effective reading according to its saving characteristics and relationship between data.Then self-defined list class,object class and material library class are introduced to organize and save the parsed data for three dimensional reconstruction.Practical application shows the effectiveness of the proposed parsing algorithm.
3ds Max;three dimensional modeling;3ds data file;real-time interaction;parsing
TP391
A
1009-315X(2012)03-0260-05
2012-2-23;最后
2012-3-1
中央高?;究蒲袠I(yè)務(wù)費專項資金資助項目(DC110306)。
劉爽(1977-),女,滿族,遼寧錦州人,副教授,博士,主要從事智能信息處理、計算機(jī)教育研究。
(責(zé)任編輯 劉敏)