聶文超, 李 琳,劉曉平
(合肥工業大學計算機與信息學院,安徽 合肥 230009)
隨著信息技術的飛速發展三維動畫正在逐 漸成為繼聲音、圖像、視頻和三維模型之后的第5種多媒體類型[1]。作為三維動畫的核心組成部分,動畫角色在影視制作、網絡游戲等應用領域占據越來越重要的地位。無論是擁有國內500萬玩家的網絡游戲《魔獸世界》中形形色色的怪物角色,還是創造了5億國內票房的3D電影《阿凡達》中創意無限的外星生物,動畫角色的外形設計和動作設計無一不是人們趨之若鶩的理由和效益神話的根本[2]。
動畫角色的制作軟件也非常之多,作為目前流行的三維建模、動畫和渲染軟件,3ds max成為首選工具[3]。然而其自身的.max文件格式難以被全部解析,因而難以通過解析文件的方式充分利用3ds max中強大的功能,而且隨著系統的更新,依靠解析文件獲取模型信息的方法始終無法獲取最新最完整的模型信息[4]。3ds文件格式以密文存儲,雖然能夠部分解析,但是只包含 3D模型數據,無法實現對動畫角色進行研究的要求。在虛擬現實系統里面進行動畫角色算法研究,即需要有動畫角色的運動數據又需要有動畫角色模型數據。
動畫角色主要包含兩方面信息,動畫角色的模型信息與動畫角色的骨骼運動信息。模型文件格式有很多,這些格式的文件都是針對特定的情況而設計的,有些注重工業標準,有些注重通訊的簡易性,還有些注重適宜性和可移植性[5]。為了方便研究人員進行動畫角色相關算法的研究,本文提出了一種用于存儲動畫角色信息的文件格式,該格式包含了動畫角色的模型信息和運動信息,以明文方式存儲,使研究人員可以對動畫角色算法進行全面的研究。同時,不同于OGRE與Unity3D所支持的三維模型格式包含全面的三維模型信息,此格式針對動畫角色的特點,摒棄了常見三維模型軟件的冗余信息,提高了算法的執行效率和穩定性。
為了增加該文件格式的通用性,還開發了此文件格式的動畫角色數據轉換工具,可用于與3ds max里的動畫角色相互轉換,減小了使用者對自定義文件格式的依賴性。該轉換工具是通過對3ds max動畫角色模型組織結構進行分析,基于max SDK,將max中的動畫角色與自定義格式進行相互轉換,從而可以充分利用3ds max中豐富的動畫角色信息,進行動畫角色算法的研究。
下面分別從動畫角色數據結構分析,系統整體介紹、結果驗證3個方面展開論述。
常用的模型文件格式有OBJ格式,目前幾乎所有知名的3D軟件都可以通過插件支持OBJ文件的讀寫,很適合用于3D軟件模型之間的互導;Stanford大學開發的ply格式,是一種結構簡單但是能滿足大多數圖形學應用需要的模型格式,在圖形學的研究領域中,ply是種常用且重要的文件格式;還有OGRE引擎所支持的mesh格式,主要用在商業領域中。骨骼動畫是隨時間變化的,常用的運動格式有通用的人體特征動畫文件格式bvh與3ds max cs特有格式bip。這些文件格式都只包含動畫角色某一部分的數據,目前尚無標準的以明文格式存儲的動畫角色文件格式出臺,既包含動畫角色模型數據又包含骨骼運動數據的文件格式都是一些商業軟件所用的,無法在其上進行動畫角色相關算法的研究。
作為目前流行的三維動畫渲染和制作軟件,3ds max擁有強大的功能。雖然其自身的.max文件格式難以被解析,無法提供動畫角色數據,但max SDK提供了豐富的接口使我們可以有選擇性地導出與導入自己需要的數據。
節點INode作為max SDK里最基本的數據結構,承載著其里面掛載數據的功能,節點有骨骼、網格等多種類型,不同類型的節點掛載著不同的數據。節點在場景中是以父子層次關系組織的。每個節點都會以子節點的身份關聯到另一個節點上,一個節點可以有多個孩子節點,只能有一個父節點。節點INode與max場景中的對象存在著一一對應的關系,每一個出現在視口中的對象,包括骨骼、網格等,都關聯一個節點。如圖1所示。3ds max中的對象掛載在節點上,通過對節點的遍歷判斷節點掛載對象的類型,可以獲取到場景中動畫角色的骨骼數據與網格數據。

圖1 max SDK動畫角色數據結構
為了使研究人員對動畫角色進行算法研究,本文提出一種以明文存儲的、用來存儲動畫角色信息的文件格式。動畫角色是網格數據、運動數據和蒙皮約束數據的結合,該自定義動畫角色文件格式包括5個部分:文件頭、運動數據、蒙皮數據、網格數據以及紋理數據,如圖2所示,其中文件頭是對后四者的描述,介紹文件中包含哪幾個數據模塊,用于文件讀取的預處理。

圖2 自定義動畫角色文件示例圖
運動數據是動畫角色骨架的數據表現形式,是動畫角色隨著時間變化姿態信息的存儲形式。常用的運動數據表示方法有旋轉矩陣、歐拉角和四元數3種,這3種運動數據的存儲各有利弊,表1給出了對比結果。用戶可根據需求選擇對應的運動數據存儲在自定義文件格式中。

表1 旋轉矩陣、歐拉角和四元數的比較
蒙皮數據是聯系骨架的動態信息與靜態網格之間的橋梁,隨著時間軸的前進,骨架的運動通過蒙皮使得每個網格頂點產生對應的位置變化,進而發生網格變形,即為動畫。權重表是蒙皮數據的核心,它存儲著每根骨骼對網格各頂點的約束權重,如表2所示。權重表由權重項組成,權重表的每一行代表了一個權重項,權重項包含了影響當前網格頂點的各骨骼信息以及對應的約束權重。

表2 權重表
網格給模型以最直觀的顯示,通過對網格表面頂點集合的繪制以及面片貼圖的渲染,得到逼近真實的效果。網格主要包含以下信息:①頂點信息:網格的頂點三維坐標數組,用于標記頂點的空間位置;②法線信息:用于控制場景中光線的傳播特性;③頂點顏色:頂點的渲染顏色;④紋理頂點信息:記錄了網格頂點的紋理坐標信息,用于紋理映射;⑤面片信息:存儲了網格的面片屬性,主要存儲每個面片的各頂點對應的頂點索引、法線索引以及紋理頂點索引等信息。
目前還沒有找到即包含動畫角色的運動數據又包含模型數據且以明文方式存儲的文件格式,動畫轉換工具導出的自定義格式的文件包含有這兩項數據,很大程度上方便了研究人員進行動畫角色方面的算法研究。動畫角色數據轉換工具將動畫角色從常用建模軟件3ds max中導出為自定義格式的文件,經過動畫角色算法操作后,產生新的文件,再通過動畫角色數據轉換工具導入回3ds max中。轉換工具的這一功能使產生的新模型可以跟外界常用的模型文件格式進行相互轉換,如圖3所示。例如可以將產生的新模型通過3ds max為媒介轉換為OGRE引擎所支持的mesh格式,從而將模型用于游戲制作中。
動畫角色常用的運動數據表示方法有旋轉矩陣、歐拉角和四元數3種,max SDK提供的標準的運動數據接口是以矩陣形式表示的,并且提供了矩陣與歐拉角、四元數相互轉換的方法。動畫角色數據轉換工具支持這3種表示方法的導出與導入,這3種運動數據表示方法各有利弊,增加動畫角色轉換工具的通用性。
3ds max作為目前流行的三維動畫渲染和制作軟件,其SDK[6]提供了豐富的接口進行動畫角色數據的導出與導入。動畫角色的數據包括以下3個部分:骨骼運動數據,網格紋理數據,蒙皮數據。本文所提出的動畫角色轉換工具包括對這3個部分的導出與導入,整體結構如圖3所示。

圖3 動畫角色數據轉換工具
Interface類是max SDK提供的獲取3ds max中數據信息的一個接口,通過此接口可以導出與導入大部分動畫角色數據。圖4為與動畫角色運動數據相關的一些主要方法。

圖4 Interface類運動數據相關的一些方法
運動數據是動畫角色骨架的數據表現形式,骨骼節點是運動數據的載體。通過max SDK的節點類提供的類層次關系的方法,對場景中的節點進行遍歷,判斷節點類型,獲取到所有骨骼節點,進而獲取到動畫角色所有骨骼節點數據;也可以創建骨骼節點構建出這種父子層次關系結構,從而進行運動數據的導入。如圖5為節點類層次關系的一些主要方法。

圖5 INode類層次關系的一些主要方法
通過獲取到的場景根節點 RootNode,根據節點的父子層次關系進行遍歷,得到場景中所有的節點。3ds max里的對象存在對象標識符Class_ID,對象標識符用來標志節點屬于哪種類型,例如三角網格節點用TRIOBJ_CLASS_ID標志,Bone骨骼節點用BONE_OBJ_CLASSID標志,bip骨骼節點用 BIPSLAVE_CONTROL_CLASS_ID或者BIPBODY_CONTROL_CLASS_ID標志。在3ds max中存在兩種骨骼,Bone骨骼與bip骨骼,對遍歷得到節點的對象標識符類型判斷,可以獲取到場景中所有的骨骼節點。從而得到場景中所有骨骼每一幀的運動數據。骨骼運動數據有3種表現形式,矩陣,四元數,歐拉角,這3種運動數據的存儲都存在一定的利弊,用戶可以根據自己的研究需要選擇 1種進行導出。偽代碼描述如下:
//獲取骨骼節點

//獲取3種類型運動數據
for (int time = 0;time <= numFrame;time++)

骨骼運動數據的導入主要是骨骼節點父子層次結構的創建與運動數據的錄制。具體可以分為以下4個部分進行:
(1)調用CreateInstance()創建骨骼對象pBone,并通過CreateObjectNode(pBone)關聯到節點;
(2)通過INode的方法構建出骨骼節點父子層次關系;
(3)調用AnimateOn()函數開啟動畫運動數據的錄制;
(4)讀取運動數據構建數據結構進行運動數據錄制;
(5)錄制完后調用函數ResumeAnimate()重新開啟動畫完成運動數據的錄制。
網格在 max SDK中的代表的類為 Mesh,Mesh類有專門的Face類描述,Face類記錄了1個面片的3個頂點在網格頂點數組、材質頂點、法線中的索引。而在 Mesh類中,面片數組為faces,它是一個 Face類型的數組。另外網格還有材質、法線等信息。紋理數據定義材質如何在網格上顯示,使模型更加漂亮有真實感,文獻[7]中很詳細地介紹了網格模型的導出過程。圖6給出了用來導出導入Mesh的主要方法。

圖6 Mesh相關方法
網格對象Mesh通過Interface從場景中獲得,通過Mesh的相關方法能夠獲取到網格對象的網格頂點、法線、材質、面片等信息,完成數據的導出。Mesh網格中的面片均為三角形,通過TriObject可以創建出網格對象,并調用網格類的setNumFace等方法完成網格數據的導入。
蒙皮是骨骼與網格模型之間的一座橋梁,使骨骼的運動能夠驅動網格模型產生相應的變化。蒙皮在max SDK中以蒙皮類ISkin表示,蒙皮類中存在ISkinContextData與ISkinImportData兩個對象。ISkinContextData對象提供了一個接口以獲取蒙皮數據,這些數據以頂點蒙皮權重表的形式存儲。每一個頂點都包含了影響這個頂點的骨骼索引及其對應的影響權重值。ISkinImportData接口用于向蒙皮修改器中導入蒙皮數據,包括添加蒙皮的骨骼節點、設置頂點的蒙皮權重等。通過蒙皮類的這兩個對象即可完成蒙皮數據的導出與導入。
本文設計動畫角色數據轉換工具的目的是方便研究人員進行對動畫角色算法進行全面的研究。因此需要驗證沒有經過外部算法對數據文件影響的情況下,經過該工具轉換的動畫角色不會發生動作與網格模型的變化。圖 7(a)為動畫角色導出前的原始效果,圖 7(b)為通過動畫角色數據轉換工具轉換后的效果,其中數字代表當前幀號。
通過實驗結果的前后對比可以看出動畫角色經過轉換后,動作數據與網格模型沒有發生改變,因此該工具是正確有效的。
本文從方便三維動畫角色算法研究的角度出發,定義了一種動畫角色文件格式,開發了此文件格式動畫角色數據轉換工具,并對這一過程進行了詳細的描述。此工具是針對做動畫角色算法研究人員所開發的,使用該工具可以幫助研究人員很方便的從常用建模軟件導出動畫角色的骨骼運動數據與模型數據,使研究人員可以集中時間在算法的研究上,大大減輕了研究人員的負擔。

圖7 經過數據轉換工具轉換的動畫角色前后對比圖
[1] 王 鑫,孫守遷,柴春雷. 3維人體運動編輯與合成技術綜述[J]. 中國圖象圖形學報,2009,14(2):233-242.
[2] 吳 正. 基于樣例的動畫角色多樣化研究[D]. 合肥:合肥工業大學,2011.
[3] 翟旭峰,朱杰杰,潘志庚. 3ds MAX建模及其在虛擬現實中的應用[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系統的三維模型轉換工具[J]. 工程圖學學報,2008,29(5): 72-78.