聶文超, 李 琳,劉曉平
(合肥工業(yè)大學計算機與信息學院,安徽 合肥 230009)
隨著信息技術(shù)的飛速發(fā)展三維動畫正在逐 漸成為繼聲音、圖像、視頻和三維模型之后的第5種多媒體類型[1]。作為三維動畫的核心組成部分,動畫角色在影視制作、網(wǎng)絡(luò)游戲等應(yīng)用領(lǐng)域占據(jù)越來越重要的地位。無論是擁有國內(nèi)500萬玩家的網(wǎng)絡(luò)游戲《魔獸世界》中形形色色的怪物角色,還是創(chuàng)造了5億國內(nèi)票房的3D電影《阿凡達》中創(chuàng)意無限的外星生物,動畫角色的外形設(shè)計和動作設(shè)計無一不是人們趨之若鶩的理由和效益神話的根本[2]。
動畫角色的制作軟件也非常之多,作為目前流行的三維建模、動畫和渲染軟件,3ds max成為首選工具[3]。然而其自身的.max文件格式難以被全部解析,因而難以通過解析文件的方式充分利用3ds max中強大的功能,而且隨著系統(tǒng)的更新,依靠解析文件獲取模型信息的方法始終無法獲取最新最完整的模型信息[4]。3ds文件格式以密文存儲,雖然能夠部分解析,但是只包含 3D模型數(shù)據(jù),無法實現(xiàn)對動畫角色進行研究的要求。在虛擬現(xiàn)實系統(tǒng)里面進行動畫角色算法研究,即需要有動畫角色的運動數(shù)據(jù)又需要有動畫角色模型數(shù)據(jù)。
動畫角色主要包含兩方面信息,動畫角色的模型信息與動畫角色的骨骼運動信息。模型文件格式有很多,這些格式的文件都是針對特定的情況而設(shè)計的,有些注重工業(yè)標準,有些注重通訊的簡易性,還有些注重適宜性和可移植性[5]。為了方便研究人員進行動畫角色相關(guān)算法的研究,本文提出了一種用于存儲動畫角色信息的文件格式,該格式包含了動畫角色的模型信息和運動信息,以明文方式存儲,使研究人員可以對動畫角色算法進行全面的研究。同時,不同于OGRE與Unity3D所支持的三維模型格式包含全面的三維模型信息,此格式針對動畫角色的特點,摒棄了常見三維模型軟件的冗余信息,提高了算法的執(zhí)行效率和穩(wěn)定性。
為了增加該文件格式的通用性,還開發(fā)了此文件格式的動畫角色數(shù)據(jù)轉(zhuǎn)換工具,可用于與3ds max里的動畫角色相互轉(zhuǎn)換,減小了使用者對自定義文件格式的依賴性。該轉(zhuǎn)換工具是通過對3ds max動畫角色模型組織結(jié)構(gòu)進行分析,基于max SDK,將max中的動畫角色與自定義格式進行相互轉(zhuǎn)換,從而可以充分利用3ds max中豐富的動畫角色信息,進行動畫角色算法的研究。
下面分別從動畫角色數(shù)據(jù)結(jié)構(gòu)分析,系統(tǒng)整體介紹、結(jié)果驗證3個方面展開論述。
常用的模型文件格式有OBJ格式,目前幾乎所有知名的3D軟件都可以通過插件支持OBJ文件的讀寫,很適合用于3D軟件模型之間的互導;Stanford大學開發(fā)的ply格式,是一種結(jié)構(gòu)簡單但是能滿足大多數(shù)圖形學應(yīng)用需要的模型格式,在圖形學的研究領(lǐng)域中,ply是種常用且重要的文件格式;還有OGRE引擎所支持的mesh格式,主要用在商業(yè)領(lǐng)域中。骨骼動畫是隨時間變化的,常用的運動格式有通用的人體特征動畫文件格式bvh與3ds max cs特有格式bip。這些文件格式都只包含動畫角色某一部分的數(shù)據(jù),目前尚無標準的以明文格式存儲的動畫角色文件格式出臺,既包含動畫角色模型數(shù)據(jù)又包含骨骼運動數(shù)據(jù)的文件格式都是一些商業(yè)軟件所用的,無法在其上進行動畫角色相關(guān)算法的研究。
作為目前流行的三維動畫渲染和制作軟件,3ds max擁有強大的功能。雖然其自身的.max文件格式難以被解析,無法提供動畫角色數(shù)據(jù),但max SDK提供了豐富的接口使我們可以有選擇性地導出與導入自己需要的數(shù)據(jù)。
節(jié)點INode作為max SDK里最基本的數(shù)據(jù)結(jié)構(gòu),承載著其里面掛載數(shù)據(jù)的功能,節(jié)點有骨骼、網(wǎng)格等多種類型,不同類型的節(jié)點掛載著不同的數(shù)據(jù)。節(jié)點在場景中是以父子層次關(guān)系組織的。每個節(jié)點都會以子節(jié)點的身份關(guān)聯(lián)到另一個節(jié)點上,一個節(jié)點可以有多個孩子節(jié)點,只能有一個父節(jié)點。節(jié)點INode與max場景中的對象存在著一一對應(yīng)的關(guān)系,每一個出現(xiàn)在視口中的對象,包括骨骼、網(wǎng)格等,都關(guān)聯(lián)一個節(jié)點。如圖1所示。3ds max中的對象掛載在節(jié)點上,通過對節(jié)點的遍歷判斷節(jié)點掛載對象的類型,可以獲取到場景中動畫角色的骨骼數(shù)據(jù)與網(wǎng)格數(shù)據(jù)。
圖1 max SDK動畫角色數(shù)據(jù)結(jié)構(gòu)
為了使研究人員對動畫角色進行算法研究,本文提出一種以明文存儲的、用來存儲動畫角色信息的文件格式。動畫角色是網(wǎng)格數(shù)據(jù)、運動數(shù)據(jù)和蒙皮約束數(shù)據(jù)的結(jié)合,該自定義動畫角色文件格式包括5個部分:文件頭、運動數(shù)據(jù)、蒙皮數(shù)據(jù)、網(wǎng)格數(shù)據(jù)以及紋理數(shù)據(jù),如圖2所示,其中文件頭是對后四者的描述,介紹文件中包含哪幾個數(shù)據(jù)模塊,用于文件讀取的預處理。
圖2 自定義動畫角色文件示例圖
運動數(shù)據(jù)是動畫角色骨架的數(shù)據(jù)表現(xiàn)形式,是動畫角色隨著時間變化姿態(tài)信息的存儲形式。常用的運動數(shù)據(jù)表示方法有旋轉(zhuǎn)矩陣、歐拉角和四元數(shù)3種,這3種運動數(shù)據(jù)的存儲各有利弊,表1給出了對比結(jié)果。用戶可根據(jù)需求選擇對應(yīng)的運動數(shù)據(jù)存儲在自定義文件格式中。
表1 旋轉(zhuǎn)矩陣、歐拉角和四元數(shù)的比較
蒙皮數(shù)據(jù)是聯(lián)系骨架的動態(tài)信息與靜態(tài)網(wǎng)格之間的橋梁,隨著時間軸的前進,骨架的運動通過蒙皮使得每個網(wǎng)格頂點產(chǎn)生對應(yīng)的位置變化,進而發(fā)生網(wǎng)格變形,即為動畫。權(quán)重表是蒙皮數(shù)據(jù)的核心,它存儲著每根骨骼對網(wǎng)格各頂點的約束權(quán)重,如表2所示。權(quán)重表由權(quán)重項組成,權(quán)重表的每一行代表了一個權(quán)重項,權(quán)重項包含了影響當前網(wǎng)格頂點的各骨骼信息以及對應(yīng)的約束權(quán)重。
表2 權(quán)重表
網(wǎng)格給模型以最直觀的顯示,通過對網(wǎng)格表面頂點集合的繪制以及面片貼圖的渲染,得到逼近真實的效果。網(wǎng)格主要包含以下信息:①頂點信息:網(wǎng)格的頂點三維坐標數(shù)組,用于標記頂點的空間位置;②法線信息:用于控制場景中光線的傳播特性;③頂點顏色:頂點的渲染顏色;④紋理頂點信息:記錄了網(wǎng)格頂點的紋理坐標信息,用于紋理映射;⑤面片信息:存儲了網(wǎng)格的面片屬性,主要存儲每個面片的各頂點對應(yīng)的頂點索引、法線索引以及紋理頂點索引等信息。
目前還沒有找到即包含動畫角色的運動數(shù)據(jù)又包含模型數(shù)據(jù)且以明文方式存儲的文件格式,動畫轉(zhuǎn)換工具導出的自定義格式的文件包含有這兩項數(shù)據(jù),很大程度上方便了研究人員進行動畫角色方面的算法研究。動畫角色數(shù)據(jù)轉(zhuǎn)換工具將動畫角色從常用建模軟件3ds max中導出為自定義格式的文件,經(jīng)過動畫角色算法操作后,產(chǎn)生新的文件,再通過動畫角色數(shù)據(jù)轉(zhuǎn)換工具導入回3ds max中。轉(zhuǎn)換工具的這一功能使產(chǎn)生的新模型可以跟外界常用的模型文件格式進行相互轉(zhuǎn)換,如圖3所示。例如可以將產(chǎn)生的新模型通過3ds max為媒介轉(zhuǎn)換為OGRE引擎所支持的mesh格式,從而將模型用于游戲制作中。
動畫角色常用的運動數(shù)據(jù)表示方法有旋轉(zhuǎn)矩陣、歐拉角和四元數(shù)3種,max SDK提供的標準的運動數(shù)據(jù)接口是以矩陣形式表示的,并且提供了矩陣與歐拉角、四元數(shù)相互轉(zhuǎn)換的方法。動畫角色數(shù)據(jù)轉(zhuǎn)換工具支持這3種表示方法的導出與導入,這3種運動數(shù)據(jù)表示方法各有利弊,增加動畫角色轉(zhuǎn)換工具的通用性。
3ds max作為目前流行的三維動畫渲染和制作軟件,其SDK[6]提供了豐富的接口進行動畫角色數(shù)據(jù)的導出與導入。動畫角色的數(shù)據(jù)包括以下3個部分:骨骼運動數(shù)據(jù),網(wǎng)格紋理數(shù)據(jù),蒙皮數(shù)據(jù)。本文所提出的動畫角色轉(zhuǎn)換工具包括對這3個部分的導出與導入,整體結(jié)構(gòu)如圖3所示。
圖3 動畫角色數(shù)據(jù)轉(zhuǎn)換工具
Interface類是max SDK提供的獲取3ds max中數(shù)據(jù)信息的一個接口,通過此接口可以導出與導入大部分動畫角色數(shù)據(jù)。圖4為與動畫角色運動數(shù)據(jù)相關(guān)的一些主要方法。
圖4 Interface類運動數(shù)據(jù)相關(guān)的一些方法
運動數(shù)據(jù)是動畫角色骨架的數(shù)據(jù)表現(xiàn)形式,骨骼節(jié)點是運動數(shù)據(jù)的載體。通過max SDK的節(jié)點類提供的類層次關(guān)系的方法,對場景中的節(jié)點進行遍歷,判斷節(jié)點類型,獲取到所有骨骼節(jié)點,進而獲取到動畫角色所有骨骼節(jié)點數(shù)據(jù);也可以創(chuàng)建骨骼節(jié)點構(gòu)建出這種父子層次關(guān)系結(jié)構(gòu),從而進行運動數(shù)據(jù)的導入。如圖5為節(jié)點類層次關(guān)系的一些主要方法。
圖5 INode類層次關(guān)系的一些主要方法
通過獲取到的場景根節(jié)點 RootNode,根據(jù)節(jié)點的父子層次關(guān)系進行遍歷,得到場景中所有的節(jié)點。3ds max里的對象存在對象標識符Class_ID,對象標識符用來標志節(jié)點屬于哪種類型,例如三角網(wǎng)格節(jié)點用TRIOBJ_CLASS_ID標志,Bone骨骼節(jié)點用BONE_OBJ_CLASSID標志,bip骨骼節(jié)點用 BIPSLAVE_CONTROL_CLASS_ID或者BIPBODY_CONTROL_CLASS_ID標志。在3ds max中存在兩種骨骼,Bone骨骼與bip骨骼,對遍歷得到節(jié)點的對象標識符類型判斷,可以獲取到場景中所有的骨骼節(jié)點。從而得到場景中所有骨骼每一幀的運動數(shù)據(jù)。骨骼運動數(shù)據(jù)有3種表現(xiàn)形式,矩陣,四元數(shù),歐拉角,這3種運動數(shù)據(jù)的存儲都存在一定的利弊,用戶可以根據(jù)自己的研究需要選擇 1種進行導出。偽代碼描述如下:
//獲取骨骼節(jié)點
//獲取3種類型運動數(shù)據(jù)
for (int time = 0;time <= numFrame;time++)
骨骼運動數(shù)據(jù)的導入主要是骨骼節(jié)點父子層次結(jié)構(gòu)的創(chuàng)建與運動數(shù)據(jù)的錄制。具體可以分為以下4個部分進行:
(1)調(diào)用CreateInstance()創(chuàng)建骨骼對象pBone,并通過CreateObjectNode(pBone)關(guān)聯(lián)到節(jié)點;
(2)通過INode的方法構(gòu)建出骨骼節(jié)點父子層次關(guān)系;
(3)調(diào)用AnimateOn()函數(shù)開啟動畫運動數(shù)據(jù)的錄制;
(4)讀取運動數(shù)據(jù)構(gòu)建數(shù)據(jù)結(jié)構(gòu)進行運動數(shù)據(jù)錄制;
(5)錄制完后調(diào)用函數(shù)ResumeAnimate()重新開啟動畫完成運動數(shù)據(jù)的錄制。
網(wǎng)格在 max SDK中的代表的類為 Mesh,Mesh類有專門的Face類描述,F(xiàn)ace類記錄了1個面片的3個頂點在網(wǎng)格頂點數(shù)組、材質(zhì)頂點、法線中的索引。而在 Mesh類中,面片數(shù)組為faces,它是一個 Face類型的數(shù)組。另外網(wǎng)格還有材質(zhì)、法線等信息。紋理數(shù)據(jù)定義材質(zhì)如何在網(wǎng)格上顯示,使模型更加漂亮有真實感,文獻[7]中很詳細地介紹了網(wǎng)格模型的導出過程。圖6給出了用來導出導入Mesh的主要方法。
圖6 Mesh相關(guān)方法
網(wǎng)格對象Mesh通過Interface從場景中獲得,通過Mesh的相關(guān)方法能夠獲取到網(wǎng)格對象的網(wǎng)格頂點、法線、材質(zhì)、面片等信息,完成數(shù)據(jù)的導出。Mesh網(wǎng)格中的面片均為三角形,通過TriObject可以創(chuàng)建出網(wǎng)格對象,并調(diào)用網(wǎng)格類的setNumFace等方法完成網(wǎng)格數(shù)據(jù)的導入。
蒙皮是骨骼與網(wǎng)格模型之間的一座橋梁,使骨骼的運動能夠驅(qū)動網(wǎng)格模型產(chǎn)生相應(yīng)的變化。蒙皮在max SDK中以蒙皮類ISkin表示,蒙皮類中存在ISkinContextData與ISkinImportData兩個對象。ISkinContextData對象提供了一個接口以獲取蒙皮數(shù)據(jù),這些數(shù)據(jù)以頂點蒙皮權(quán)重表的形式存儲。每一個頂點都包含了影響這個頂點的骨骼索引及其對應(yīng)的影響權(quán)重值。ISkinImportData接口用于向蒙皮修改器中導入蒙皮數(shù)據(jù),包括添加蒙皮的骨骼節(jié)點、設(shè)置頂點的蒙皮權(quán)重等。通過蒙皮類的這兩個對象即可完成蒙皮數(shù)據(jù)的導出與導入。
本文設(shè)計動畫角色數(shù)據(jù)轉(zhuǎn)換工具的目的是方便研究人員進行對動畫角色算法進行全面的研究。因此需要驗證沒有經(jīng)過外部算法對數(shù)據(jù)文件影響的情況下,經(jīng)過該工具轉(zhuǎn)換的動畫角色不會發(fā)生動作與網(wǎng)格模型的變化。圖 7(a)為動畫角色導出前的原始效果,圖 7(b)為通過動畫角色數(shù)據(jù)轉(zhuǎn)換工具轉(zhuǎn)換后的效果,其中數(shù)字代表當前幀號。
通過實驗結(jié)果的前后對比可以看出動畫角色經(jīng)過轉(zhuǎn)換后,動作數(shù)據(jù)與網(wǎng)格模型沒有發(fā)生改變,因此該工具是正確有效的。
本文從方便三維動畫角色算法研究的角度出發(fā),定義了一種動畫角色文件格式,開發(fā)了此文件格式動畫角色數(shù)據(jù)轉(zhuǎn)換工具,并對這一過程進行了詳細的描述。此工具是針對做動畫角色算法研究人員所開發(fā)的,使用該工具可以幫助研究人員很方便的從常用建模軟件導出動畫角色的骨骼運動數(shù)據(jù)與模型數(shù)據(jù),使研究人員可以集中時間在算法的研究上,大大減輕了研究人員的負擔。
圖7 經(jīng)過數(shù)據(jù)轉(zhuǎn)換工具轉(zhuǎn)換的動畫角色前后對比圖
[1] 王 鑫,孫守遷,柴春雷. 3維人體運動編輯與合成技術(shù)綜述[J]. 中國圖象圖形學報,2009,14(2):233-242.
[2] 吳 正. 基于樣例的動畫角色多樣化研究[D]. 合肥:合肥工業(yè)大學,2011.
[3] 翟旭峰,朱杰杰,潘志庚. 3ds MAX建模及其在虛擬現(xiàn)實中的應(yīng)用[J]. 計算機仿真,2004,21(4): 94-97.
[4] Lloyd L,Skiena S. Parsing without a grammar:making sense of unknown file formats[C]//Pata mining,2003. ICDM2003. Third IEEE International Conference on,2003: 195-202.
[5] Zhang Congzhe,Zhou Mengchu,Gao Jianlin.Conversion between discrete images and organized 3D file formats [C]//2001. Systems,Man,and Cybernetics,IEEE International Conference on,2001: 2835-2839.
[6] Sdk M幫助文檔[EB/OL] [2014-04-02]. http://sparks.discreet. com/downloads/downloadshome.cfm.2006.11.20.
[7] 余 燁,劉曉平. 面向 VR系統(tǒng)的三維模型轉(zhuǎn)換工具[J]. 工程圖學學報,2008,29(5): 72-78.