高 燕,馬韋偉,2
(1. 河源職業(yè)技術(shù)學院,廣東 河源 517000;2. 云南師范大學教育學部,云南 昆明 650500)
在各種影視作品和電子游戲等應(yīng)用當中,人體和動物角色模型的制作,以及基于骨骼進行角色的動畫驅(qū)動,是非常必要且常見的需求。生動的人物和動物造型可以讓三維場景增色不少,而人物和動物角色的動畫運動,尤其是交互式的動畫仿真效果,則能夠?qū)⑷S內(nèi)容提升到一個全新的高度。
傳統(tǒng)的角色模型制作和動畫仿真,需要美術(shù)人員的大量介入。這其中包括角色模型頂點和三角面的制作,角色骨骼的擺放和蒙皮操作(即綁定模型頂點到對應(yīng)的骨骼之上),角色骨骼的動畫關(guān)鍵幀制作,以及角色模型的實時動畫驅(qū)動和渲染效果。對于常見的雙足人類角色,以及四足動物角色(例如貓、狗、牛等)而言,美術(shù)人員可以憑借自身經(jīng)驗,將以往作品作為參考,迅速地構(gòu)建角色模型和動畫,如圖1所示。
圖1 常見雙足和四足動物角色及其骨骼
但是對于一些特殊的生物體,例如各式各樣的恐龍角色而言,制作過程中就會存在比較大的變數(shù);而這些問題主要源自于制作人員并沒有真的見過恐龍的外形和運動方式,導致無從下手,制作的骨骼關(guān)節(jié)位置和結(jié)構(gòu)不合理,關(guān)鍵幀動畫生硬,并且不知道如何調(diào)節(jié)等等。
科學研究人員可以基于現(xiàn)有的生物體來推測恐龍的運動方式,但是并不能要求美術(shù)人員同樣具有這樣的能力。如果可以通過某種方法,將恐龍角色與已經(jīng)存在的某些生物體模型進行匹配,將后者的常見運動方式映射到恐龍身上,從而快速產(chǎn)生平滑自然的動畫效果,那么將對相關(guān)應(yīng)用的開發(fā)和角色制作流程產(chǎn)生非常大的幫助。本文嘗試通過網(wǎng)格遷移的方法,將已經(jīng)制作完成的角色動畫快速地移植到可能具有類似動作行為的恐龍模型身上,從而批量式地生成恐龍角色動畫;并且省去了為恐龍角色制作骨骼關(guān)節(jié)的環(huán)節(jié),有效提升了工作效率,并且可以與傳統(tǒng)的美術(shù)環(huán)節(jié)無縫銜接。
假設(shè)有原始的三角網(wǎng)格模型S,它可以是任何常見的動物或者人物模型。那么通過模型頂點變形或者動畫關(guān)鍵幀的生成,可以得到一系列的形變模型S′。
此時認為,S和多個S′之間一定存在某種確定的形變關(guān)系,可以通過數(shù)學模型復現(xiàn)。
對于目標的三角網(wǎng)格模型T,假設(shè)它是已經(jīng)制作好的恐龍角色模型,并且不需要后續(xù)的骨骼和蒙皮步驟。
如果它和原始模型S的形態(tài)上基本一致,那么同樣可以認為,T和它的多個形變模型T′之間也存在著確定的形變關(guān)系,并且可以通過S和S′之間的形變數(shù)學模型遷移實現(xiàn),如圖2所示。
圖2 已知原始模型S,T和形變模型S′,生成形變模型T′的遷移過程
原始模型S和T之間不需要有相同的頂點數(shù),也不需要相同的三角面索引(即頂點的連接方式)。因此,可以針對任意恐龍網(wǎng)格模型,選擇一個與它相近的動物模型并通過角色骨骼和動畫產(chǎn)生多個形變模型,進而通過網(wǎng)格遷移的方式產(chǎn)生對應(yīng)的恐龍形變模型。形變模型的頂點變化過程,也就是恐龍角色的動畫仿真過程。
可以使用Maya等常見建模軟件來制作參考網(wǎng)格模型,并設(shè)置它的骨骼信息。人體和四足動物的骨骼關(guān)節(jié)有一定的相似之處,都有頭部,頸部,脊柱,雙手和雙腳,且通常都具有肩關(guān)節(jié)、肘關(guān)節(jié)和膝關(guān)節(jié)的設(shè)置(手指和腳趾數(shù)量這里不做考慮)。區(qū)別在于人體采取站姿,雙手垂立身旁;而四足動物的脊柱是平行于地面的,“雙手”和雙腳均站立在地面上,如圖3所示。
圖3 常見的四足動物參考角色骨骼分布
四足動物還可能有一些特定的骨骼關(guān)節(jié),例如尾巴部分,或者例如大象等動物的鼻子和耳朵。是否要對這些部分進行骨骼構(gòu)建,通常取決于實際應(yīng)用中的需求。
將參考模型和恐龍模型均輸出為Autodesk FBX格式。該格式采用公開的數(shù)據(jù)標準,可以直接用于Unity,Unreal等常見的三維渲染引擎。
FBX格式內(nèi)部通過FbxMesh類來管理每個模型網(wǎng)格體。獲取模型頂點和三角面信息的基本代碼如下:
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; } 為了正確執(zhí)行網(wǎng)格遷移算法,還需要在建模軟件中建立一些標記點,用來標記角色模型表面的一些關(guān)鍵位置。標記點可以直接用系統(tǒng)默認的Cylinder或者Node來標記,并隨FBX格式導出;也可以在后續(xù)的渲染引擎Unity或者Unreal中手動編輯制作,并用于算法計算過程當中。 源模型S的變形S′可以表示為為源模型網(wǎng)格中的每個三角形的仿射變換集合。仿射變換矩陣中的非平移部分包括了由三角形變形引起的方向、比例和傾斜度的變化。但是,三角形的三個頂點v1,v2和v3并不能完全確定一個完整的仿射變換結(jié)果,因為它們不能確定垂直于三角形的空間是如何變形的。因此,需要引入第四個頂點v4,它垂直于三角形存在,其計算公式為 因此,源模型S中每個三角形的4個頂點,變換到形變模型S′之后,新的4個頂點可以表達為原頂點乘以一個3×3的仿射矩陣Q,再加上一個位移d的結(jié)果,即 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′之間的變換數(shù)學模型。 需要建立兩組源模型T與S之間的映射關(guān)系。進而由于S和S′之間的變換關(guān)系已知,那么就可以得到T與T′之間的變換關(guān)系。但是,因為S和T的頂點數(shù)和三角面數(shù)都是不一樣的,不能直接采取一一對應(yīng)的方式來計算映射關(guān)系。此時需要手動建立多個標記點,用來標識用戶模型T和參考模型S之間的對應(yīng)關(guān)系。標記點的數(shù)量不限,但是每個參考點在兩個模型中必須表達同樣的物理位置(例如頭部,手部,腳步),并且總數(shù)量必須相等,如圖4所示。 圖4 在源模型S和T上設(shè)置同樣數(shù)量的標記點 遍歷每個標記點,搜索質(zhì)心非常接近的成對的網(wǎng)格S三角形和網(wǎng)格T三角形,進而計算三角形對應(yīng)關(guān)系。通過迭代最近點的算法,即可得到兩個三角形之間的仿射變換矩陣Q和位移d,并通過上一節(jié)的方法進行計算。 此外,根據(jù)共享頂點的原理,模型網(wǎng)格發(fā)生形變后,相鄰的兩個三角網(wǎng)格應(yīng)當滿足如下關(guān)系 Tjvi+dj=Tkvi+dk 其中j,k表示模型網(wǎng)格中兩個相鄰的三角形,vi表示它們共享的頂點。 根據(jù)之前的算法,可以通過用戶輸入多個標記點的方式,計算參考模型S與源恐龍模型T之間的變換關(guān)系。而通過類似的方法也可以計算形變模型S′和S之間的變換關(guān)系。并且因為S和S′的頂點和三角面是完全一致的,因此不需要添加新的參考點。依據(jù)上述兩次運算的結(jié)果,可以得到目標形變模型T′與T之間的關(guān)系,進而通過原始的靜止恐龍模型T,得到新的運動恐龍模型T′。 這一過程可以通過計算機程序?qū)崿F(xiàn)自動運算,即,對于已經(jīng)制作完成的參考模型S和它的關(guān)鍵幀動畫As,可以通過骨骼和蒙皮計算,輸出它的每個關(guān)鍵幀對應(yīng)的形變模型SAi。之后對于恐龍模型T,雖然它沒有骨骼和蒙皮信息,但是依然可以通過網(wǎng)格遷移的方式,得到每個參考形變模型SAi對應(yīng)的恐龍形變模型TAi。 對于一組關(guān)鍵幀動畫As,可以得到對應(yīng)的關(guān)鍵幀動畫序列At={TA1,TA2,…,TAn}。注意新的動畫序列并不是角色骨骼動畫,而是模型頂點變形動畫。相比于前者來說,頂點變形動畫的實時執(zhí)行效率更高,動畫仿真效果更為精細,但是需要更多的存儲空間,并且無法逆運算轉(zhuǎn)換到骨骼動畫。 使用Unity引擎作為基礎(chǔ)測試平臺,使用C#實現(xiàn)網(wǎng)格遷移的算法。原始的低多邊形恐龍模型(無骨骼或者動畫數(shù)據(jù))如圖5所示。 圖5 原始的恐龍模型 用于進行網(wǎng)格遷移算法應(yīng)用的參考模型是一種常見的四足動物,其行走的骨骼動畫已經(jīng)制作完成,可以直接播放,并按照關(guān)鍵幀輸出多組形變網(wǎng)格模型,如圖6所示。 圖6 參考模型和形變模型 通過網(wǎng)格遷移算法,將參考模型的動畫效果移植到恐龍角色上。為此,首先在Unity引擎中添加30-40個標記點,主要用來標記兩個原始模型中相似的位置,例如頭頂,嘴部,四足位置,肩部和胯部,尾部等等。之后,通過網(wǎng)格遷移算法進行仿射矩陣計算和形變模型運算。具體的模型和計算參數(shù)如下表1所示。 表1 網(wǎng)格遷移模型參數(shù) 通過驗證可知,該算法過程消耗的CPU計算時間較短,且能夠產(chǎn)生較好的形變效果,基本滿足了恐龍模型和動畫仿真系統(tǒng)的需求,如圖7所示。 圖7 恐龍角色動畫形變結(jié)果 研究了一種網(wǎng)格遷移的算法,對于沒有進行骨骼蒙皮操作的原始模型T,可以通過另一個已經(jīng)制作完畢的參考模型S,以及多組由關(guān)鍵幀動畫生成的形變模型S′,生成新的形變模型T′。該方法不需要原始模型和參考模型的頂點數(shù)或者三角面數(shù)相等,但是需要在兩者表面上添加多個標記點,對應(yīng)于兩組模型上物理意義相同的位置標注。標記點可以在建模軟件中設(shè)置,也可以實時引擎中直接添加。但是標記點數(shù)量必須相等,且ID在兩個模型上是一一對應(yīng)的。 該方法可以用于處理復雜的恐龍三維模型。通過已經(jīng)制作完畢的參考模型和動畫數(shù)據(jù),經(jīng)過簡單的標記點添加操作,即可產(chǎn)生恐龍模型的多組變形動畫,并且不需要制作骨骼和設(shè)置蒙皮效果。這大大降低了美術(shù)人員的工作量,并且得到的動畫仿真數(shù)據(jù)結(jié)果平滑可靠,符合大多數(shù)人對一般動物的運動認知,不會產(chǎn)生生硬感。 該方法目前依然有一些需要優(yōu)化的地方:首先,手動添加標記點的操作目前是無法避免的,這導致整個恐龍動畫仿真的流程無法實現(xiàn)完全自動化,仍然需要有美術(shù)和三維基礎(chǔ)的人員介入;其次,標記點的數(shù)量和準確性對于形變結(jié)果的影響較大,如果標記點數(shù)量過少,則極易出現(xiàn)形變結(jié)果的異常。并且頂點變形效果如果存在不平滑和不連續(xù)的情況,其表現(xiàn)結(jié)果比骨骼動畫要更為明顯,并且很難通過手動的方式進行后續(xù)修補,而是只能通過調(diào)整標記點來重新輸出。如何改善和解決這些問題,也是后續(xù)研究的重點方向。3 恐龍角色的自動網(wǎng)格遷移
3.1 網(wǎng)格形變遷移算法的推導
3.2 基于已有角色的模型網(wǎng)格遷移
3.3 基于已有角色的快速動畫數(shù)據(jù)遷移
4 實例研究
5 結(jié)語