高 燕,馬韋偉,2
(1. 河源職業技術學院,廣東 河源 517000;2. 云南師范大學教育學部,云南 昆明 650500)
在各種影視作品和電子游戲等應用當中,人體和動物角色模型的制作,以及基于骨骼進行角色的動畫驅動,是非常必要且常見的需求。生動的人物和動物造型可以讓三維場景增色不少,而人物和動物角色的動畫運動,尤其是交互式的動畫仿真效果,則能夠將三維內容提升到一個全新的高度。
傳統的角色模型制作和動畫仿真,需要美術人員的大量介入。這其中包括角色模型頂點和三角面的制作,角色骨骼的擺放和蒙皮操作(即綁定模型頂點到對應的骨骼之上),角色骨骼的動畫關鍵幀制作,以及角色模型的實時動畫驅動和渲染效果。對于常見的雙足人類角色,以及四足動物角色(例如貓、狗、牛等)而言,美術人員可以憑借自身經驗,將以往作品作為參考,迅速地構建角色模型和動畫,如圖1所示。

圖1 常見雙足和四足動物角色及其骨骼
但是對于一些特殊的生物體,例如各式各樣的恐龍角色而言,制作過程中就會存在比較大的變數;而這些問題主要源自于制作人員并沒有真的見過恐龍的外形和運動方式,導致無從下手,制作的骨骼關節位置和結構不合理,關鍵幀動畫生硬,并且不知道如何調節等等。
科學研究人員可以基于現有的生物體來推測恐龍的運動方式,但是并不能要求美術人員同樣具有這樣的能力。如果可以通過某種方法,將恐龍角色與已經存在的某些生物體模型進行匹配,將后者的常見運動方式映射到恐龍身上,從而快速產生平滑自然的動畫效果,那么將對相關應用的開發和角色制作流程產生非常大的幫助。本文嘗試通過網格遷移的方法,將已經制作完成的角色動畫快速地移植到可能具有類似動作行為的恐龍模型身上,從而批量式地生成恐龍角色動畫;并且省去了為恐龍角色制作骨骼關節的環節,有效提升了工作效率,并且可以與傳統的美術環節無縫銜接。
假設有原始的三角網格模型S,它可以是任何常見的動物或者人物模型。那么通過模型頂點變形或者動畫關鍵幀的生成,可以得到一系列的形變模型S′。
此時認為,S和多個S′之間一定存在某種確定的形變關系,可以通過數學模型復現。
對于目標的三角網格模型T,假設它是已經制作好的恐龍角色模型,并且不需要后續的骨骼和蒙皮步驟。
如果它和原始模型S的形態上基本一致,那么同樣可以認為,T和它的多個形變模型T′之間也存在著確定的形變關系,并且可以通過S和S′之間的形變數學模型遷移實現,如圖2所示。

圖2 已知原始模型S,T和形變模型S′,生成形變模型T′的遷移過程
原始模型S和T之間不需要有相同的頂點數,也不需要相同的三角面索引(即頂點的連接方式)。因此,可以針對任意恐龍網格模型,選擇一個與它相近的動物模型并通過角色骨骼和動畫產生多個形變模型,進而通過網格遷移的方式產生對應的恐龍形變模型。形變模型的頂點變化過程,也就是恐龍角色的動畫仿真過程。
可以使用Maya等常見建模軟件來制作參考網格模型,并設置它的骨骼信息。人體和四足動物的骨骼關節有一定的相似之處,都有頭部,頸部,脊柱,雙手和雙腳,且通常都具有肩關節、肘關節和膝關節的設置(手指和腳趾數量這里不做考慮)。區別在于人體采取站姿,雙手垂立身旁;而四足動物的脊柱是平行于地面的,“雙手”和雙腳均站立在地面上,如圖3所示。

圖3 常見的四足動物參考角色骨骼分布
四足動物還可能有一些特定的骨骼關節,例如尾巴部分,或者例如大象等動物的鼻子和耳朵。是否要對這些部分進行骨骼構建,通常取決于實際應用中的需求。
將參考模型和恐龍模型均輸出為Autodesk FBX格式。該格式采用公開的數據標準,可以直接用于Unity,Unreal等常見的三維渲染引擎。
FBX格式內部通過FbxMesh類來管理每個模型網格體。獲取模型頂點和三角面信息的基本代碼如下:
FbxMesh* m=…;
FbxVector4* v=m->GetControlPoints();
int num=m->GetPolygonCount();
for (int i=0,n=0; i int v0=m->GetPolygonVertex(i,n+0), v1=m->GetPolygonVertex(i,n+1), v2=m->GetPolygonVertex(i,n+2); ∥ 三角形={vertices[v0], ∥ vertices[v1],vertices[v2]} n+=3; } 為了正確執行網格遷移算法,還需要在建模軟件中建立一些標記點,用來標記角色模型表面的一些關鍵位置。標記點可以直接用系統默認的Cylinder或者Node來標記,并隨FBX格式導出;也可以在后續的渲染引擎Unity或者Unreal中手動編輯制作,并用于算法計算過程當中。 源模型S的變形S′可以表示為為源模型網格中的每個三角形的仿射變換集合。仿射變換矩陣中的非平移部分包括了由三角形變形引起的方向、比例和傾斜度的變化。但是,三角形的三個頂點v1,v2和v3并不能完全確定一個完整的仿射變換結果,因為它們不能確定垂直于三角形的空間是如何變形的。因此,需要引入第四個頂點v4,它垂直于三角形存在,其計算公式為 因此,源模型S中每個三角形的4個頂點,變換到形變模型S′之后,新的4個頂點可以表達為原頂點乘以一個3×3的仿射矩陣Q,再加上一個位移d的結果,即 v′1=Qvi+d,i∈[1,4] 為了計算仿射矩陣Q,需要消去位移值d,那么有如下公式 d=v′1-Qv1 v′i-v′1=Q(vi-v1) Q=(v′i-v′1)(vi-v1)-1=V′V-1 由此可以計算得到放射矩陣Q的值,進而得到源模型S與形變模型S′之間的變換數學模型。 需要建立兩組源模型T與S之間的映射關系。進而由于S和S′之間的變換關系已知,那么就可以得到T與T′之間的變換關系。但是,因為S和T的頂點數和三角面數都是不一樣的,不能直接采取一一對應的方式來計算映射關系。此時需要手動建立多個標記點,用來標識用戶模型T和參考模型S之間的對應關系。標記點的數量不限,但是每個參考點在兩個模型中必須表達同樣的物理位置(例如頭部,手部,腳步),并且總數量必須相等,如圖4所示。 圖4 在源模型S和T上設置同樣數量的標記點 遍歷每個標記點,搜索質心非常接近的成對的網格S三角形和網格T三角形,進而計算三角形對應關系。通過迭代最近點的算法,即可得到兩個三角形之間的仿射變換矩陣Q和位移d,并通過上一節的方法進行計算。 此外,根據共享頂點的原理,模型網格發生形變后,相鄰的兩個三角網格應當滿足如下關系 Tjvi+dj=Tkvi+dk 其中j,k表示模型網格中兩個相鄰的三角形,vi表示它們共享的頂點。 根據之前的算法,可以通過用戶輸入多個標記點的方式,計算參考模型S與源恐龍模型T之間的變換關系。而通過類似的方法也可以計算形變模型S′和S之間的變換關系。并且因為S和S′的頂點和三角面是完全一致的,因此不需要添加新的參考點。依據上述兩次運算的結果,可以得到目標形變模型T′與T之間的關系,進而通過原始的靜止恐龍模型T,得到新的運動恐龍模型T′。 這一過程可以通過計算機程序實現自動運算,即,對于已經制作完成的參考模型S和它的關鍵幀動畫As,可以通過骨骼和蒙皮計算,輸出它的每個關鍵幀對應的形變模型SAi。之后對于恐龍模型T,雖然它沒有骨骼和蒙皮信息,但是依然可以通過網格遷移的方式,得到每個參考形變模型SAi對應的恐龍形變模型TAi。 對于一組關鍵幀動畫As,可以得到對應的關鍵幀動畫序列At={TA1,TA2,…,TAn}。注意新的動畫序列并不是角色骨骼動畫,而是模型頂點變形動畫。相比于前者來說,頂點變形動畫的實時執行效率更高,動畫仿真效果更為精細,但是需要更多的存儲空間,并且無法逆運算轉換到骨骼動畫。 使用Unity引擎作為基礎測試平臺,使用C#實現網格遷移的算法。原始的低多邊形恐龍模型(無骨骼或者動畫數據)如圖5所示。 圖5 原始的恐龍模型 用于進行網格遷移算法應用的參考模型是一種常見的四足動物,其行走的骨骼動畫已經制作完成,可以直接播放,并按照關鍵幀輸出多組形變網格模型,如圖6所示。 圖6 參考模型和形變模型 通過網格遷移算法,將參考模型的動畫效果移植到恐龍角色上。為此,首先在Unity引擎中添加30-40個標記點,主要用來標記兩個原始模型中相似的位置,例如頭頂,嘴部,四足位置,肩部和胯部,尾部等等。之后,通過網格遷移算法進行仿射矩陣計算和形變模型運算。具體的模型和計算參數如下表1所示。 表1 網格遷移模型參數 通過驗證可知,該算法過程消耗的CPU計算時間較短,且能夠產生較好的形變效果,基本滿足了恐龍模型和動畫仿真系統的需求,如圖7所示。 圖7 恐龍角色動畫形變結果 研究了一種網格遷移的算法,對于沒有進行骨骼蒙皮操作的原始模型T,可以通過另一個已經制作完畢的參考模型S,以及多組由關鍵幀動畫生成的形變模型S′,生成新的形變模型T′。該方法不需要原始模型和參考模型的頂點數或者三角面數相等,但是需要在兩者表面上添加多個標記點,對應于兩組模型上物理意義相同的位置標注。標記點可以在建模軟件中設置,也可以實時引擎中直接添加。但是標記點數量必須相等,且ID在兩個模型上是一一對應的。 該方法可以用于處理復雜的恐龍三維模型。通過已經制作完畢的參考模型和動畫數據,經過簡單的標記點添加操作,即可產生恐龍模型的多組變形動畫,并且不需要制作骨骼和設置蒙皮效果。這大大降低了美術人員的工作量,并且得到的動畫仿真數據結果平滑可靠,符合大多數人對一般動物的運動認知,不會產生生硬感。 該方法目前依然有一些需要優化的地方:首先,手動添加標記點的操作目前是無法避免的,這導致整個恐龍動畫仿真的流程無法實現完全自動化,仍然需要有美術和三維基礎的人員介入;其次,標記點的數量和準確性對于形變結果的影響較大,如果標記點數量過少,則極易出現形變結果的異常。并且頂點變形效果如果存在不平滑和不連續的情況,其表現結果比骨骼動畫要更為明顯,并且很難通過手動的方式進行后續修補,而是只能通過調整標記點來重新輸出。如何改善和解決這些問題,也是后續研究的重點方向。3 恐龍角色的自動網格遷移
3.1 網格形變遷移算法的推導
3.2 基于已有角色的模型網格遷移

3.3 基于已有角色的快速動畫數據遷移
4 實例研究




5 結語