劉爽,張恒博
(大連民族學院計算機科學與工程學院,遼寧大連 116605)
三維建模軟件3ds Max數據文件3ds的解析
劉爽,張恒博
(大連民族學院計算機科學與工程學院,遼寧大連 116605)
為了實現三維建模數據的快速讀取和解析,提出了一種解析保存3ds數據的方法并應用到實際三維漫游軟件中。作為專業(yè)的三維建模軟件,3ds Max提供了強大的快速建模功能。但由于需要占用大量CPU和內存資源,因此其實時交互性較差,很難直接應用到實際工程項目中。充分利用3ds Max的快速建模能力,分析3ds Max的建模文件3ds數據格式,以其內部樹狀數據結構為基礎,按照其存儲特點及數據之間的關系有效讀取,并采用C++高效編碼實現,以自定義的列表類、對象類、材質庫類合理的組織和保存,為三維場景重建奠定基礎。實際應用表明該解析算法實用有效。
3ds Max;三維建模;3ds數據文件;實時交互;解析
隨著虛擬現實技術的發(fā)展,航空航天、醫(yī)學實習、軍事訓練、建筑設計、教育培訓等眾多領域對基于三維建模的三維可視化技術需求越來越大[1-3]。這里的三維建模技術是指獲取實際環(huán)境的三維數據,并根據應用的需要,利用獲取的三維數據建立相應的虛擬環(huán)境模型。目前,常用的三維建模軟件包括AutoCAD、3ds Max、Rhino、Alias、Solidthink、3D VIZ等等。盡管不同的三維建模軟件適用于不同的應用領域,但3ds Max還是以適用范圍廣、功能強大而成為PC機上全球使用人數最多的三維設計軟件之一。3ds Max全稱3D Studio Max,是Autodesk多媒體分公司——Discreet公司開發(fā)的三維建模、渲染、動畫制作軟件,其專業(yè)性較強,功能可以與工作站級的軟件相媲美,廣泛應用于電影特效制作、影視動畫設計(廣告、片頭)、建筑裝潢、游戲制作(交互式和電影式)、三維概念化設計等各個領域。
但是大規(guī)模三維場景的三維模型往往比較復雜,3ds Max軟件在普通的個人PC機上運行這些復雜三維模型時需要占用大量的CPU和內存資源,因此交互性和實時性較差。本文將主要討論其建模數據3ds文件的特點、組織方式,快速解析并合理保存,充分利用該建模軟件快速強大的建模功能的同時借助于OpenGL保證三維可視化的實時交互性。
3ds Max軟件的建模數據保存為以“.DS”為擴展名的3ds數據文件格式。出于保護版權等原因,文件3ds對外格式是不公開的,Autodesk公司對3ds文件不提供任何支持。但是可以通過已知的數據結構及相關研究資料完成3ds文件的解析。3ds文件中保存有三維建模所需的點、線、面、材質等屬性特征,通過讀取其二進制格式數據,可以編程實現獲取點、線、面、材質等數據,進而實現三維場景重建。
解析3ds文件的關鍵是理清文件的內部數據結構。3ds文件內部是以“塊”為單位組織的。這里,“塊”是指相同類型數據信息的集合。所有塊信息的數據格式見表1。

表1 塊數據格式
由表1可知,這些塊數據說明了緊跟其ID之后的內容和下一個塊的地址。下一個塊的指針與當前塊的首地址和長度有關。所有的塊都是以一個塊頭為起始的,后面跟著塊數據和子塊。塊頭是表1中的前兩行,包括兩個字節(jié)保存的塊ID和四個字節(jié)保存的塊的長度信息。根據不同塊的ID值就可以獲取該塊的數據信息。
3ds文件以二進制形式存儲,以二進制打開任何一個3DS文件,可以發(fā)現其內容都是以4D4D開頭,如圖1,該圖為太陽鳥的三維建模數據文件。可以通過判斷文件起始的兩個字節(jié)是否為0x4D4D來判斷文件是否為3ds格式。

圖1 3ds文件的十六進制數據查看
與許多文件格式一樣,3ds二進制文件中的數據也是按低位在前、高位在后的方式組織的,例如,兩個十六進制字節(jié)4A 5C組成的整型數,則5C是高位字節(jié),4A是低位字節(jié);對于長整型數,如:4A 5C 3B 8F,則5C4A是低位字,而8F3B是高位字,解析數據時需遵循這一規(guī)則。
3ds文件中所有的塊以樹形結構組織在一起,就是說大塊中包含小塊,最頂層的塊為主塊(Main Chunk),其塊ID為0x4D4D。三維場景重建所需的塊均是主塊的一級或多級子塊,每個塊所包含的信息不同,所以每塊內部的數據結構也并不相同。
為了直觀的說明3ds文件數據之間的關系,本文選擇三維重建主要的塊:主編輯塊(3D Editor Chunk)、對象塊(Object Block)、材質塊(Material Block)、關鍵幀塊(Keyframer Chunk)來說明塊之間的父子關系,如圖2,不同層次的樹狀結構就體現了不同的父子關系。這里由于篇幅關系圖2并未列出所有的塊數據,為避免個別節(jié)點的子節(jié)點過多,某些子塊信息已省略。
其中,MAIN3DS(0x4D4D)為3ds文件中的主塊,包含所有其它的塊,所有子塊中最重要的就是主編輯塊EDIT3DS。
EDIT3DS(0x3D3D)塊,包含對象塊EDIT_ OBJECT,也就是三維場景中的對象。
EDIT_OBJECT(0x4000)塊,包含OBJ_TRIMESH塊。塊頭之后緊跟著一個以NULL結尾的字符串對象名。
OBJ_TRIMESH(0x4100)塊,包含對象的幾何信息:頂點、面、紋理坐標。
TRI_VERTEXL(0x4110)塊,包含頂點列表,格式為兩字節(jié)無符號整型頂點總數,之后是頂點數目個三元組,每個三元組為一個點的XYZ坐標。這里需要注意的是,OpenGL的空間坐標系是右手坐標系,而3DS文件的坐標系是左手坐標系,因此在讀取時要對其進行適當的轉化,將讀取的坐標值的Y坐標與Z坐標對調,并將對調之后的Z坐標翻轉。
TRI_FACEL1(0x4120)塊,定義面信息,每個面都是由三個點構成的。格式與點塊類似,前兩個字節(jié)是無符號整型數字,代表面的總數,接下來是4個兩字節(jié)的無符號整型,前三個是點在點塊中的索引號,最后一個是標志位。可以根據面塊中每個面對應三個點在點塊中的索引,搜索到點的三維坐標。
TRI_TEXCOORD(0x4140)塊,提供紋理坐標,起始的兩個字節(jié)無符號整型表示列表中的條目總數,之后是兩浮點數的序列對,定義相應頂點的二維紋理坐標。

圖2 3ds文件樹形結構圖
假設從3ds文件中截取22個字節(jié)的數據:


讀取文件頭,判斷ID是否為0x4D4D,若ID不是0x4D4D則直接跳出,否則繼續(xù)。
接著就是按照樹狀塊的結構通過while循環(huán),從樹干、樹杈、樹枝依次讀取,也就是按照文件指針的順序依次讀取,如果讀取到的塊信息是三維建模需要的,那么進一步解析。如果讀取的塊信息未知,那么直接跳過。注意讀取過程不能按特定的塊ID去查找塊信息,因為并不是所有的塊都存在,比如材質塊,如果在建模時未指定對象材質,那么導出的3ds文件中就不包含材質塊。主程序流程如圖3。
其中,Read3DSChunk()函數用于將塊的內容讀入塊結構中,對每個塊調用的Read3DSFile()函數用來獲取對象信息、材質信息、關鍵幀信息等。Read3DSFile()函數中調用ReadMDATA()函數讀取最高級的對象數據;ReadKFDATA()函數讀取關鍵幀數據。

圖3 解析3ds文件的主流程
這里對主編輯塊的解析流程簡要加以說明。根據塊頭的ID號判斷讀取的是材質塊還是對象塊。當讀取到材質塊時,則將讀取到的信息保存到材質結構體tMaterial中,每讀完一個材質塊,就將其添加到材質對象MaterialDict中,最終組成材質庫。當讀取到的是對象塊時,調用ReadNamed-Object()函數來讀入對應名稱的對象塊,其它名稱的塊將忽略,該函數只對塊ID為0x4100的對象塊進行處理,其余的塊直接跳過。
對象由點、面、材質三部分構成。因此,讀取對象塊時可以根據塊的ID值做不同的處理。
如果塊ID值為0x4110,則當前塊為點塊。把點數據讀入的同時寫入對象類。
如果塊ID為0x4120,則當前塊為面塊。讀取面塊時首先獲取總面數,通過fread(&value,sizeof (value),1,fp)將面數讀取到value變量中,接著根據面數循環(huán)讀取每個面對應三個點的索引,循環(huán)結束后將索引加入到object對象中,然后讀取該面塊包含的面對應的材質名稱并根據名稱到材質庫中查找,接下來讀入該材質映射的面的數量,最后將查找得到的材質加入到object對象中并與對應的面進行關聯(lián)。
如果塊ID值為0x4140,則當前塊為紋理坐標塊。UV紋理坐標是二維坐標,其作用是實現三維場景中逼真的三維環(huán)境,即把現實世界中的圖片嵌合在三維物體上。3ds中提供的方法是應用紋理坐標之前首先由點塊中對應的三個點確定一個平面,然后再由三個紋理坐標確定該面所需的貼圖。每個UV紋理坐標由兩個浮點數構成,與之前讀取的點塊中每個點依次對應,所以紋理坐標的數量與點塊中點數完全相同。
在OpenGL[4]中實現三維重建時,面是由點構成的,對象是由面構成的,對象上的顏色、貼圖等數據則是由材質庫根據對象不同的面選擇不同的材質塊進行映射。因此,在2.1節(jié)讀取3ds文件的過程中必須保存相應數據。本文3ds文件數據的保存是通過三個類完成的,分別為對象類、列表類、材質庫類。其中對象類用于保存一個對象的所有信息,包括坐標點、紋理坐標點、對象本身所用的材質,面的信息等等。列表類的作用是可以索引所有的對象,即可以通過列表類獲取所有已知的信息。材質庫類用于保存讀取的材質塊,其中包括材質的鏡面光成分、散射光成分、對應的紋理貼圖名等。
由上節(jié)的讀取解析過程可知,一個3ds文件解析之后保存成了一個列表類、一個材質庫類,一個列表類對應一個或多個對象類。其中材質庫類包含所有的材質信息,而一個對象類包含了該對象所有三維重建所需要的數據信息及對應材質庫的索引。在OpenGL中實現三維重建時只需要通過列表類就可找到所有需要的數據信息。
OpenGL作為專業(yè)的3D程序接口,定義了一個跨編程語言、跨平臺的編程接口,可以方便的進行3D物體交互性應用程序的開發(fā)。本文在MFC框架下,利用OpenGL三維建模功能函數及交互繪制函數實現了大連民族學院校園三維漫游系統(tǒng)軟件的開發(fā)。由于本文的側重點在于3ds數據文件格式的有效解析和保存,因此對基于MFC框架和OpenGL類庫實現的三維重建就不再詳細陳述,相關信息可以查閱參考文獻[5]。3ds Max軟件與本漫游軟件運行相同場景時的每幀刷新結果見表2,這里pc機配置CPU為Intel Pentium Dual E2180 2.00GHz主頻,1G內存,120G硬盤的普通電腦,不同的場景為把整個校園建模數據分割為不同的組成部分。由對比數據可以看出本漫游軟件在三維場景漫游過程中畫面更流暢。

表2 3ds Max與漫游軟件運行效果對比
在OpenGL+MFC框架下,以解析的3ds數據為基礎實現的三維重建,完成了大連民族學院三維漫游系統(tǒng),該軟件可以在普通個人用戶的PC機上流暢運行。這種實現方案不僅有效利用了3ds Max軟件的快速建模功能,在保證良好三維重建效果的同時,借助OpenGL的交互繪制編程接口提供了強大的實時交互功能。
[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]郭立萍,李光霞,董碩.虛擬現實技術在構建虛擬旅游環(huán)境中的應用[J].安徽農業(yè)科學,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].電腦知識與技術,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
中央高校基本科研業(yè)務費專項資金資助項目(DC110306)。
劉爽(1977-),女,滿族,遼寧錦州人,副教授,博士,主要從事智能信息處理、計算機教育研究。
(責任編輯 劉敏)