李寅飛
東華大學信息與科學技術學院,上海 201610
Maya的模型信息提取研究
李寅飛
東華大學信息與科學技術學院,上海 201610
Maya是Autodesk公司中和3dMax并列的三維建模和動畫軟件,而且在模型的細節(jié)渲染方面有著更為突出功能,隨著技術的進步和用戶對三維圖形動畫要求的提高,Maya已經(jīng)廣泛的應用到電影、電視、游戲等領域。因此,如果能將Maya中的模型信息從Maya軟件中提取出來,并按照一定的渲染方法重新組建,就能將依賴Maya的圖形文件用于其他設備上進行三維展示,例如平板電腦,智能手機等移動設備上。這樣,就能在很大程度上提高產(chǎn)品模型的展示效果。本文將介紹如何利用Maya的Api 將Maya模型中的信息提取出來,并按照OpenGl的模型渲染格式進行儲存。
Maya;node;mesh;face;vertex;OpenGL
要成功的提取Maya模型中的信息,必須要知道Maya中的數(shù)據(jù)結(jié)構(gòu),知道Maya中的Api運行模式,掌握Maya模型的類別,模型的構(gòu)成方式,模型屬性組成等等信息。當掌握了這些信息之后,就能實現(xiàn)模型重構(gòu)和再實現(xiàn),以完成模型在其他顯示平臺的遷移。
我們可將整個Maya 系統(tǒng)拆分為3個主要組成部分: 圖形用戶界面 ,MEL Command Engine ,Dependency Graph 。
Maya用戶可以與Maya Gui進行交互,可以選擇菜單項,更改參數(shù),使對象動畫化以及移動對象等等,當與用戶界面進行交互時,Maya實際是再發(fā)出MEl命令,這些命令唄發(fā)送到Command Engine,并在這里被解釋并執(zhí)行。
大部分的MEL命令運行與Dependency Graph直接交互。這樣做是因為Dependency Graph可以被直觀地看做是一個完整的場景,這個場景是組成3D世界的所有重要數(shù)據(jù)和信息。Dependency Graph不僅定義當前場景中有什么數(shù)據(jù),還定義了數(shù)據(jù)的處理方式。Dependency Graph 實際就像Maya的心臟和大腦。
我們將Dependency Graph簡稱為DG,DG是Maya的核心,它包括Maya模型的所有基本構(gòu)建,它允許你創(chuàng)建任意的數(shù)據(jù),這些數(shù)據(jù)進行一系列的操作處理后,最終生成一些經(jīng)過加工的數(shù)據(jù)。在DG中,數(shù)據(jù)及其操作被封裝為節(jié)點,一個節(jié)點含有任意數(shù)目的插槽,其中還有Maya使用的數(shù)據(jù),節(jié)點也包含一個操作符,用于對其數(shù)據(jù)進行處理以生成一些其他的數(shù)據(jù)。
由圖1所示節(jié)點實際是Maya的基本構(gòu)件,每個節(jié)點都有一個或者多個與其相關的特性,這些特性通常唄成為屬性,每個節(jié)點根據(jù)其屬性的不同實現(xiàn)對數(shù)據(jù)的不同操作。
Maya中有多種模型類型,但最常用的靜態(tài)模型主要使用的是nurb,polygon 和 subdiv。
Mesh 英文翻譯為網(wǎng)格,在Maya中則用于代表一個三維實體,例如一個立方體、圓錐體、球體,這些都是Mesh。而模型中的每個面則就是polygon,如下圖的球體模型則更能體現(xiàn)出mesh和polygon的關系,圖中的每個四邊形方格就是一個polygon。
Polygon主要有3個主要元素:vertices , edges, faces除此之外還有兩個有助于理解和分析polygon如何工作和運行的元素 Facevertices 和 UVs。
Polygon的Vertices元素是一個表示3d的浮點型數(shù)組,每個點都有自己的元素id,每條邊和每個面都是基于這個數(shù)組產(chǎn)生的。如表1。
3 D Float Point 行中每一個元素都是一個三維坐標(x,y,z)Edge元素儲存在一個邊數(shù)組中,數(shù)組中的每個元素儲存著兩個整型變量,儲存著vertices的id,第一個表示邊的起始點,第二個表示結(jié)束點,這樣儲存數(shù)據(jù)就能表示邊的點組成,點邊的方向以及邊的編號。如表2。
表2
Edge行中的每個元素都是一個二維的點,表示邊的起始點和結(jié)束點的id Faces的元素儲存在一個整數(shù)型數(shù)組中,每個面被一系列數(shù)字表示,每個數(shù)字都表示一個邊的索引。與之相應的的是face offset 數(shù)組,這個數(shù)組標示了每個面在face數(shù)組中每個面的起始點,具體格式如表3,表4。
表3
表4
如表4中所示,face 1 的起始點在 EdgeId的Index 3 即,F(xiàn)ace 1是由,0,1,2三條邊組成的三角面。
Face-vertices 是將一個Mesh中的每個面的相對vertices 索引,就是說,他們都是以0為起始的整數(shù)數(shù)列。并不是以整個Mesh為基礎的全局索引坐標。UV uv是專門用于描繪紋理信息的元素,其對應著每個每個點都有與之相對應的uv,我們要把二維貼圖與3d模型想匹配,必須找到每個3d坐標對應的uv。
在Maya的C++ Api 中,選取模型有兩種形式,第一種選取指定模型信息,第二種選取全部模型信息。
選取指定模型需要用到的變量類型 ∶ MSelectionList 。顧名思義,這個變量類型儲存了用戶的模型選擇信息,即用戶在軟件界面選擇的圖像(單選或者多選)。然后利用MGlobal類里面的成員函數(shù)getActiveSelectionList函數(shù)將MSelectionList變量進行賦值,如此我們設置的MSelectionList類型變量就得到了賦值。
得到了選取列表之后,就需要利用選擇迭代器對選擇列表里面的內(nèi)容進行遍歷。MItSelectionList ,MItSelectionList 也是一個類,里面有豐富的函數(shù)可以對選擇列表里面的內(nèi)容進行操作,利用里面的next()函數(shù) 和isDone()函數(shù)可以對他儲存的變量進行遍歷MItSelectionList遍歷的內(nèi)容其實就是我們上面提到的Dependency Graph 中所提到的節(jié)點DagNode,但是MItSelectionList類中并沒有直接提取節(jié)點的函數(shù),它值提供了每個節(jié)點的路徑DagPath,通過DagPath我們就可以定位到相應的節(jié)點對模型操作。
要實現(xiàn)模型的轉(zhuǎn)移,就需要知道模型的點信息,面信息,點信息包括 點的空間坐標,點的模型序列,點法線信息。面信息包括面?zhèn)€數(shù),每個面的組成,在模型構(gòu)成中,任何一個面都可以分解成若干個三角面,而Maya中的模型構(gòu)成也是按照這個原則,因此,我們提取面的信息的時候是將模型中的面都分解為若干個三角面,并將每個面的點和點的索引相聯(lián)系。
3.2.1 提取點的坐標以及索引
通過上面一步我們得到了dagpath,這里我們就以polygon模型為例提取上面提到過的模型信息首先創(chuàng)建mesh類的實力 MFnMesh這個類 ,通過這個類我們就可以直接得到點的信息以及三角面的信息,這里我們得到的點是以一定順序儲存的point序列。以立方體為例,point序列的索引為0-7,分別記錄了空間坐標的點,通過GetPoints函數(shù)我們就可以得到這個數(shù)列。
3.2.2 提取每個三角面的索引
通過MFnMesh類之中我們通過getTriangles函數(shù)就可以得到面的信息,主要得到兩變量,一是我們這個立方體的三角面的個數(shù),因為六面體是六個四邊形,因此我們得到的三角面是十二個,而另一個變量就是每個三角面的點與我們得到的點的對應索引,以這個立方體為例,我們得到的數(shù)列如下(0,1,2,2,1,3,2,3,4,4,3,5,4,5,6,5,7,6,7,0,0,7,1,1,7,3,3,7,5),這些點每3個對應一個面,因為我們以立方體為對象,所以每六個點為同一個四邊形的兩個三角面,而且可以看出每個四邊形的組成。
通過上面的步驟我們成功的得到了每個三角面的信息,通過這些單獨的三角面信息我們就能通過opengl進行仿真對每個面配上顏色我們就能實現(xiàn)模型結(jié)構(gòu)的提取。
3.2.3 提取每個點的法線
為了使一個細分度很高的Polygon Mesh 在轉(zhuǎn)移的情況下表現(xiàn)的更加平緩和光滑,即表現(xiàn)的和軟件中更加相似,就需要提取每個點的法線。
這里我們用到的是MItMeshVertex類來對Mesh的每個點進行遍歷,然后通過getNormals函數(shù)得到一個MVectorArray變量,里面儲存了每個點相對于每個面的法線值,通過計算我們可以得到每個點的實際法線。
下面是具體程序?qū)崿F(xiàn):
MItDag dagIter( MItDag∶∶kBreadthFirst, MFn∶∶kMesh, &stat );
通過以上幾步,我們將成功得到所需要的點的空間坐標,點的個數(shù),面的個數(shù),每個面與相應點的索引,每個點的點法線通過歸一化之后的信息。通過這些信息,我們就能成功的利用OpenGl模擬出模型的體信息
通過OpenGl中的glBegin(GL_TRIANGLES)函數(shù)我們可以將得到的數(shù)據(jù)重新組合成圖形,因為我們只提取了基本模型信息,對于紋理和材質(zhì)并沒有提取,所以,只能生成模型本體,通過設置glPolygonMode可以將我們形成線框?qū)嶓w化。如圖2是軟件中的圖形,圖3是仿真后的圖形。
圖2
圖3
我們從Maya的數(shù)據(jù)結(jié)構(gòu)入手,分析了他的模型信息儲存結(jié)構(gòu),通過得到正確的模型信息我們就能將模型從Maya中遷移出來,利用openGl將這些信息重現(xiàn),我們就能讓3d模型脫離那些消耗系統(tǒng)資源巨大的軟件,而在我們希望的平臺展示。
[1]Watt A 3D計算機圖形學(第三版).機械工業(yè)出版社,2005.
[2]Maya user manual(瑪雅用戶手冊)[OL].http://www.autodesk.com/maya
[3]Woo M,Neider J,DavisTj,Shreiner D.OpenGL 編程權(quán)威指南(第三版)[M].北京:中國電力出版社,2003.
TP31
A
1674-6708(2012)58-0157-02