劉爽,張恒博
(大連民族學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院,遼寧大連 116605)
三維建模軟件3ds Max數(shù)據(jù)文件3ds的解析
劉爽,張恒博
(大連民族學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院,遼寧大連 116605)
為了實(shí)現(xiàn)三維建模數(shù)據(jù)的快速讀取和解析,提出了一種解析保存3ds數(shù)據(jù)的方法并應(yīng)用到實(shí)際三維漫游軟件中。作為專業(yè)的三維建模軟件,3ds Max提供了強(qiáng)大的快速建模功能。但由于需要占用大量CPU和內(nèi)存資源,因此其實(shí)時(shí)交互性較差,很難直接應(yīng)用到實(shí)際工程項(xiàng)目中。充分利用3ds Max的快速建模能力,分析3ds Max的建模文件3ds數(shù)據(jù)格式,以其內(nèi)部樹(shù)狀數(shù)據(jù)結(jié)構(gòu)為基礎(chǔ),按照其存儲(chǔ)特點(diǎn)及數(shù)據(jù)之間的關(guān)系有效讀取,并采用C++高效編碼實(shí)現(xiàn),以自定義的列表類、對(duì)象類、材質(zhì)庫(kù)類合理的組織和保存,為三維場(chǎng)景重建奠定基礎(chǔ)。實(shí)際應(yīng)用表明該解析算法實(shí)用有效。
3ds Max;三維建模;3ds數(shù)據(jù)文件;實(shí)時(shí)交互;解析
隨著虛擬現(xiàn)實(shí)技術(shù)的發(fā)展,航空航天、醫(yī)學(xué)實(shí)習(xí)、軍事訓(xùn)練、建筑設(shè)計(jì)、教育培訓(xùn)等眾多領(lǐng)域?qū)谌S建模的三維可視化技術(shù)需求越來(lái)越大[1-3]。這里的三維建模技術(shù)是指獲取實(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è)計(jì)軟件之一。3ds Max全稱3D Studio Max,是Autodesk多媒體分公司——Discreet公司開(kāi)發(fā)的三維建模、渲染、動(dòng)畫制作軟件,其專業(yè)性較強(qiáng),功能可以與工作站級(jí)的軟件相媲美,廣泛應(yīng)用于電影特效制作、影視動(dòng)畫設(shè)計(jì)(廣告、片頭)、建筑裝潢、游戲制作(交互式和電影式)、三維概念化設(shè)計(jì)等各個(gè)領(lǐng)域。
但是大規(guī)模三維場(chǎng)景的三維模型往往比較復(fù)雜,3ds Max軟件在普通的個(gè)人PC機(jī)上運(yùn)行這些復(fù)雜三維模型時(shí)需要占用大量的CPU和內(nèi)存資源,因此交互性和實(shí)時(shí)性較差。本文將主要討論其建模數(shù)據(jù)3ds文件的特點(diǎn)、組織方式,快速解析并合理保存,充分利用該建模軟件快速?gòu)?qiáng)大的建模功能的同時(shí)借助于OpenGL保證三維可視化的實(shí)時(shí)交互性。
3ds Max軟件的建模數(shù)據(jù)保存為以“.DS”為擴(kuò)展名的3ds數(shù)據(jù)文件格式。出于保護(hù)版權(quán)等原因,文件3ds對(duì)外格式是不公開(kāi)的,Autodesk公司對(duì)3ds文件不提供任何支持。但是可以通過(guò)已知的數(shù)據(jù)結(jié)構(gòu)及相關(guān)研究資料完成3ds文件的解析。3ds文件中保存有三維建模所需的點(diǎn)、線、面、材質(zhì)等屬性特征,通過(guò)讀取其二進(jìn)制格式數(shù)據(jù),可以編程實(shí)現(xiàn)獲取點(diǎn)、線、面、材質(zhì)等數(shù)據(jù),進(jìn)而實(shí)現(xiàn)三維場(chǎng)景重建。
解析3ds文件的關(guān)鍵是理清文件的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。3ds文件內(nèi)部是以“塊”為單位組織的。這里,“塊”是指相同類型數(shù)據(jù)信息的集合。所有塊信息的數(shù)據(jù)格式見(jiàn)表1。
表1 塊數(shù)據(jù)格式
由表1可知,這些塊數(shù)據(jù)說(shuō)明了緊跟其ID之后的內(nèi)容和下一個(gè)塊的地址。下一個(gè)塊的指針與當(dāng)前塊的首地址和長(zhǎng)度有關(guān)。所有的塊都是以一個(gè)塊頭為起始的,后面跟著塊數(shù)據(jù)和子塊。塊頭是表1中的前兩行,包括兩個(gè)字節(jié)保存的塊ID和四個(gè)字節(jié)保存的塊的長(zhǎng)度信息。根據(jù)不同塊的ID值就可以獲取該塊的數(shù)據(jù)信息。
3ds文件以二進(jìn)制形式存儲(chǔ),以二進(jìn)制打開(kāi)任何一個(gè)3DS文件,可以發(fā)現(xiàn)其內(nèi)容都是以4D4D開(kāi)頭,如圖1,該圖為太陽(yáng)鳥(niǎo)的三維建模數(shù)據(jù)文件??梢酝ㄟ^(guò)判斷文件起始的兩個(gè)字節(jié)是否為0x4D4D來(lái)判斷文件是否為3ds格式。
圖1 3ds文件的十六進(jìn)制數(shù)據(jù)查看
與許多文件格式一樣,3ds二進(jìn)制文件中的數(shù)據(jù)也是按低位在前、高位在后的方式組織的,例如,兩個(gè)十六進(jìn)制字節(jié)4A 5C組成的整型數(shù),則5C是高位字節(jié),4A是低位字節(jié);對(duì)于長(zhǎng)整型數(shù),如:4A 5C 3B 8F,則5C4A是低位字,而8F3B是高位字,解析數(shù)據(jù)時(shí)需遵循這一規(guī)則。
3ds文件中所有的塊以樹(shù)形結(jié)構(gòu)組織在一起,就是說(shuō)大塊中包含小塊,最頂層的塊為主塊(Main Chunk),其塊ID為0x4D4D。三維場(chǎng)景重建所需的塊均是主塊的一級(jí)或多級(jí)子塊,每個(gè)塊所包含的信息不同,所以每塊內(nèi)部的數(shù)據(jù)結(jié)構(gòu)也并不相同。
為了直觀的說(shuō)明3ds文件數(shù)據(jù)之間的關(guān)系,本文選擇三維重建主要的塊:主編輯塊(3D Editor Chunk)、對(duì)象塊(Object Block)、材質(zhì)塊(Material Block)、關(guān)鍵幀塊(Keyframer Chunk)來(lái)說(shuō)明塊之間的父子關(guān)系,如圖2,不同層次的樹(shù)狀結(jié)構(gòu)就體現(xiàn)了不同的父子關(guān)系。這里由于篇幅關(guān)系圖2并未列出所有的塊數(shù)據(jù),為避免個(gè)別節(jié)點(diǎn)的子節(jié)點(diǎn)過(guò)多,某些子塊信息已省略。
其中,MAIN3DS(0x4D4D)為3ds文件中的主塊,包含所有其它的塊,所有子塊中最重要的就是主編輯塊EDIT3DS。
EDIT3DS(0x3D3D)塊,包含對(duì)象塊EDIT_ OBJECT,也就是三維場(chǎng)景中的對(duì)象。
EDIT_OBJECT(0x4000)塊,包含OBJ_TRIMESH塊。塊頭之后緊跟著一個(gè)以NULL結(jié)尾的字符串對(duì)象名。
OBJ_TRIMESH(0x4100)塊,包含對(duì)象的幾何信息:頂點(diǎn)、面、紋理坐標(biāo)。
TRI_VERTEXL(0x4110)塊,包含頂點(diǎn)列表,格式為兩字節(jié)無(wú)符號(hào)整型頂點(diǎn)總數(shù),之后是頂點(diǎn)數(shù)目個(gè)三元組,每個(gè)三元組為一個(gè)點(diǎn)的XYZ坐標(biāo)。這里需要注意的是,OpenGL的空間坐標(biāo)系是右手坐標(biāo)系,而3DS文件的坐標(biāo)系是左手坐標(biāo)系,因此在讀取時(shí)要對(duì)其進(jìn)行適當(dāng)?shù)霓D(zhuǎn)化,將讀取的坐標(biāo)值的Y坐標(biāo)與Z坐標(biāo)對(duì)調(diào),并將對(duì)調(diào)之后的Z坐標(biāo)翻轉(zhuǎn)。
TRI_FACEL1(0x4120)塊,定義面信息,每個(gè)面都是由三個(gè)點(diǎn)構(gòu)成的。格式與點(diǎn)塊類似,前兩個(gè)字節(jié)是無(wú)符號(hào)整型數(shù)字,代表面的總數(shù),接下來(lái)是4個(gè)兩字節(jié)的無(wú)符號(hào)整型,前三個(gè)是點(diǎn)在點(diǎn)塊中的索引號(hào),最后一個(gè)是標(biāo)志位??梢愿鶕?jù)面塊中每個(gè)面對(duì)應(yīng)三個(gè)點(diǎn)在點(diǎn)塊中的索引,搜索到點(diǎn)的三維坐標(biāo)。
TRI_TEXCOORD(0x4140)塊,提供紋理坐標(biāo),起始的兩個(gè)字節(jié)無(wú)符號(hào)整型表示列表中的條目總數(shù),之后是兩浮點(diǎn)數(shù)的序列對(duì),定義相應(yīng)頂點(diǎn)的二維紋理坐標(biāo)。
圖2 3ds文件樹(shù)形結(jié)構(gòu)圖
假設(shè)從3ds文件中截取22個(gè)字節(jié)的數(shù)據(jù):
讀取文件頭,判斷ID是否為0x4D4D,若ID不是0x4D4D則直接跳出,否則繼續(xù)。
接著就是按照樹(shù)狀塊的結(jié)構(gòu)通過(guò)while循環(huán),從樹(shù)干、樹(shù)杈、樹(shù)枝依次讀取,也就是按照文件指針的順序依次讀取,如果讀取到的塊信息是三維建模需要的,那么進(jìn)一步解析。如果讀取的塊信息未知,那么直接跳過(guò)。注意讀取過(guò)程不能按特定的塊ID去查找塊信息,因?yàn)椴⒉皇撬械膲K都存在,比如材質(zhì)塊,如果在建模時(shí)未指定對(duì)象材質(zhì),那么導(dǎo)出的3ds文件中就不包含材質(zhì)塊。主程序流程如圖3。
其中,Read3DSChunk()函數(shù)用于將塊的內(nèi)容讀入塊結(jié)構(gòu)中,對(duì)每個(gè)塊調(diào)用的Read3DSFile()函數(shù)用來(lái)獲取對(duì)象信息、材質(zhì)信息、關(guān)鍵幀信息等。Read3DSFile()函數(shù)中調(diào)用ReadMDATA()函數(shù)讀取最高級(jí)的對(duì)象數(shù)據(jù);ReadKFDATA()函數(shù)讀取關(guān)鍵幀數(shù)據(jù)。
圖3 解析3ds文件的主流程
這里對(duì)主編輯塊的解析流程簡(jiǎn)要加以說(shuō)明。根據(jù)塊頭的ID號(hào)判斷讀取的是材質(zhì)塊還是對(duì)象塊。當(dāng)讀取到材質(zhì)塊時(shí),則將讀取到的信息保存到材質(zhì)結(jié)構(gòu)體tMaterial中,每讀完一個(gè)材質(zhì)塊,就將其添加到材質(zhì)對(duì)象MaterialDict中,最終組成材質(zhì)庫(kù)。當(dāng)讀取到的是對(duì)象塊時(shí),調(diào)用ReadNamed-Object()函數(shù)來(lái)讀入對(duì)應(yīng)名稱的對(duì)象塊,其它名稱的塊將忽略,該函數(shù)只對(duì)塊ID為0x4100的對(duì)象塊進(jìn)行處理,其余的塊直接跳過(guò)。
對(duì)象由點(diǎn)、面、材質(zhì)三部分構(gòu)成。因此,讀取對(duì)象塊時(shí)可以根據(jù)塊的ID值做不同的處理。
如果塊ID值為0x4110,則當(dāng)前塊為點(diǎn)塊。把點(diǎn)數(shù)據(jù)讀入的同時(shí)寫入對(duì)象類。
如果塊ID為0x4120,則當(dāng)前塊為面塊。讀取面塊時(shí)首先獲取總面數(shù),通過(guò)fread(&value,sizeof (value),1,fp)將面數(shù)讀取到value變量中,接著根據(jù)面數(shù)循環(huán)讀取每個(gè)面對(duì)應(yīng)三個(gè)點(diǎn)的索引,循環(huán)結(jié)束后將索引加入到object對(duì)象中,然后讀取該面塊包含的面對(duì)應(yīng)的材質(zhì)名稱并根據(jù)名稱到材質(zhì)庫(kù)中查找,接下來(lái)讀入該材質(zhì)映射的面的數(shù)量,最后將查找得到的材質(zhì)加入到object對(duì)象中并與對(duì)應(yīng)的面進(jìn)行關(guān)聯(lián)。
如果塊ID值為0x4140,則當(dāng)前塊為紋理坐標(biāo)塊。UV紋理坐標(biāo)是二維坐標(biāo),其作用是實(shí)現(xiàn)三維場(chǎng)景中逼真的三維環(huán)境,即把現(xiàn)實(shí)世界中的圖片嵌合在三維物體上。3ds中提供的方法是應(yīng)用紋理坐標(biāo)之前首先由點(diǎn)塊中對(duì)應(yīng)的三個(gè)點(diǎn)確定一個(gè)平面,然后再由三個(gè)紋理坐標(biāo)確定該面所需的貼圖。每個(gè)UV紋理坐標(biāo)由兩個(gè)浮點(diǎn)數(shù)構(gòu)成,與之前讀取的點(diǎn)塊中每個(gè)點(diǎn)依次對(duì)應(yīng),所以紋理坐標(biāo)的數(shù)量與點(diǎn)塊中點(diǎn)數(shù)完全相同。
在OpenGL[4]中實(shí)現(xiàn)三維重建時(shí),面是由點(diǎn)構(gòu)成的,對(duì)象是由面構(gòu)成的,對(duì)象上的顏色、貼圖等數(shù)據(jù)則是由材質(zhì)庫(kù)根據(jù)對(duì)象不同的面選擇不同的材質(zhì)塊進(jìn)行映射。因此,在2.1節(jié)讀取3ds文件的過(guò)程中必須保存相應(yīng)數(shù)據(jù)。本文3ds文件數(shù)據(jù)的保存是通過(guò)三個(gè)類完成的,分別為對(duì)象類、列表類、材質(zhì)庫(kù)類。其中對(duì)象類用于保存一個(gè)對(duì)象的所有信息,包括坐標(biāo)點(diǎn)、紋理坐標(biāo)點(diǎn)、對(duì)象本身所用的材質(zhì),面的信息等等。列表類的作用是可以索引所有的對(duì)象,即可以通過(guò)列表類獲取所有已知的信息。材質(zhì)庫(kù)類用于保存讀取的材質(zhì)塊,其中包括材質(zhì)的鏡面光成分、散射光成分、對(duì)應(yīng)的紋理貼圖名等。
由上節(jié)的讀取解析過(guò)程可知,一個(gè)3ds文件解析之后保存成了一個(gè)列表類、一個(gè)材質(zhì)庫(kù)類,一個(gè)列表類對(duì)應(yīng)一個(gè)或多個(gè)對(duì)象類。其中材質(zhì)庫(kù)類包含所有的材質(zhì)信息,而一個(gè)對(duì)象類包含了該對(duì)象所有三維重建所需要的數(shù)據(jù)信息及對(duì)應(yīng)材質(zhì)庫(kù)的索引。在OpenGL中實(shí)現(xiàn)三維重建時(shí)只需要通過(guò)列表類就可找到所有需要的數(shù)據(jù)信息。
OpenGL作為專業(yè)的3D程序接口,定義了一個(gè)跨編程語(yǔ)言、跨平臺(tái)的編程接口,可以方便的進(jìn)行3D物體交互性應(yīng)用程序的開(kāi)發(fā)。本文在MFC框架下,利用OpenGL三維建模功能函數(shù)及交互繪制函數(shù)實(shí)現(xiàn)了大連民族學(xué)院校園三維漫游系統(tǒng)軟件的開(kāi)發(fā)。由于本文的側(cè)重點(diǎn)在于3ds數(shù)據(jù)文件格式的有效解析和保存,因此對(duì)基于MFC框架和OpenGL類庫(kù)實(shí)現(xiàn)的三維重建就不再詳細(xì)陳述,相關(guān)信息可以查閱參考文獻(xiàn)[5]。3ds Max軟件與本漫游軟件運(yùn)行相同場(chǎng)景時(shí)的每幀刷新結(jié)果見(jiàn)表2,這里pc機(jī)配置CPU為Intel Pentium Dual E2180 2.00GHz主頻,1G內(nèi)存,120G硬盤的普通電腦,不同的場(chǎng)景為把整個(gè)校園建模數(shù)據(jù)分割為不同的組成部分。由對(duì)比數(shù)據(jù)可以看出本漫游軟件在三維場(chǎng)景漫游過(guò)程中畫面更流暢。
表2 3ds Max與漫游軟件運(yùn)行效果對(duì)比
在OpenGL+MFC框架下,以解析的3ds數(shù)據(jù)為基礎(chǔ)實(shí)現(xiàn)的三維重建,完成了大連民族學(xué)院三維漫游系統(tǒng),該軟件可以在普通個(gè)人用戶的PC機(jī)上流暢運(yùn)行。這種實(shí)現(xiàn)方案不僅有效利用了3ds Max軟件的快速建模功能,在保證良好三維重建效果的同時(shí),借助OpenGL的交互繪制編程接口提供了強(qiáng)大的實(shí)時(shí)交互功能。
[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í)技術(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]李國(guó)超,劉爽,張延超,等.VC環(huán)境下基于OpenGL與3DS的三維場(chǎng)景重建[J].電腦知識(shí)與技術(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ù)費(fèi)專項(xiàng)資金資助項(xiàng)目(DC110306)。
劉爽(1977-),女,滿族,遼寧錦州人,副教授,博士,主要從事智能信息處理、計(jì)算機(jī)教育研究。
(責(zé)任編輯 劉敏)