顧乃林,申閆春
(1.宿遷學(xué)院法政學(xué)院,江蘇 宿遷 223800;2.北京信息科技大學(xué)計算機(jī)學(xué)院,北京 100192)
對于影視行業(yè),游戲制作行業(yè),以及近些年新興的直播行業(yè)來說,虛擬人體角色的建模和渲染都是其中重要的一環(huán)。但是,虛擬人模型的制作過程比較繁瑣,需要有經(jīng)驗的美術(shù)人員大量參與。從人物設(shè)計,構(gòu)建幾何拓?fù)浣Y(jié)構(gòu),到骨骼的構(gòu)建和綁定,蒙皮系統(tǒng),以及后續(xù)的運動捕捉和動作匹配,都需要專業(yè)的美術(shù)團(tuán)隊配合,否則很難保證建模的質(zhì)量以及成品的可用性。
對于特效電影和游戲中的主角制作而言,由專業(yè)美術(shù)人員全程進(jìn)行制作和修改的成本和時間通場都是項目方可以接受的。但是如果項目中需要大量的非主角類角色,例如成百上千的虛擬士兵,或者一場舞會中身著盛裝的人群,此時依然全部交給美術(shù)團(tuán)隊去制作,因此產(chǎn)生的成本恐怕就難以承擔(dān)了。
如果可以通過程序化的手段,基于同一個基準(zhǔn)角色,快速地隨機(jī)修改角色的身高、胖瘦、面部形象以及體表特征,從而快速變形生成大量相似但是又形態(tài)各異的虛擬人物的話,那么對于此類項目而言無疑有巨大的使用價值。
傳統(tǒng)的角色網(wǎng)格變形方法,可以在角色身體上添加額外的骨骼關(guān)節(jié)(這些關(guān)節(jié)不參與到通場的骨骼動畫中),并通過調(diào)整關(guān)節(jié)的位置和姿態(tài)來改變對應(yīng)的蒙皮頂點位置,從而達(dá)到角色模型網(wǎng)格局部變形的效果。但是該方法需要美術(shù)人員提前設(shè)計和制作相應(yīng)的骨骼關(guān)節(jié),并依次進(jìn)行蒙皮操作,增加了制作成本,以及后續(xù)使用角色的難度。此外,如果制作到半程時有新的網(wǎng)格變形需求,該方法也無法滿足立即更改的需求。
另一種網(wǎng)格變形方法是通過晶格自由變形(Free-Form Deformation,簡稱為FFD),將角色分割為多個立方體空間,并修改立方體的角點來實現(xiàn)角色的整體變形效果,如圖1所示。
圖1 基于FFD方法進(jìn)行模型網(wǎng)格變形注:黃色點為晶格角點
方法可以相對靈活地調(diào)整和定制虛擬角色形象,但是不適合進(jìn)行精細(xì)的調(diào)整,只能夠大范圍地進(jìn)行改動。對于虛擬人來說,這樣很容易造成角色失真;并且無法判斷某個角點與實際變形效果的映射關(guān)系,因此無法通過程序化的方法自動化地構(gòu)建多種形態(tài)的角色。
RBF插值的作用是能夠在一些三維的離散點之間進(jìn)行平滑插值。假設(shè)在3維空間中有M個離散點xi,那么RBF可以提供該離散空間中的整體平滑插值函數(shù)F(x)。該函數(shù)就是M個徑向基函數(shù)G(ri)的結(jié)果之和,其中ri是估算點和原始點的距離:
其中ai是常量系數(shù),c0,c1,c2,c3為多項式系數(shù)。因為已知M個離散控制點X1到XM,因此可以構(gòu)建M個F(Xi)=Fi。由此可以構(gòu)建M+4個線性方程組F=GA并求解,這里F=(F1,F(xiàn)2,…,F(xiàn)M,0,0,0,0),A=(a1,a2,…,aM,c0,c1,c2,c3),而G是一個(M+4,M+4)的矩陣。
解算線性方程組得到所有參數(shù)之后,再傳入新的X=(x,y,z)坐標(biāo)值,就可以得到對應(yīng)的空間基函數(shù)插值的結(jié)果,也就是頂點X基于該基函數(shù)變換后的結(jié)果。
在三維空間中預(yù)先設(shè)置M個控制點,用于控制同一空間中其它模型頂點的變形效果。如果沒有任何控制點發(fā)生變化,則認(rèn)為對應(yīng)的模型頂點P也都位于原處不變;當(dāng)某個或者多個控制點發(fā)生坐標(biāo)位置的變化時,計算其差值得到M個矢量數(shù)據(jù),基于這組矢量數(shù)據(jù)解算RBF方程,即可得到插值變形后的模型頂點差值d,則新模型頂點坐標(biāo)P′=P+d。
在預(yù)處理過程中解算方程組得到所有的RBF參數(shù)之后,傳入模型頂點P,即可通過上述公式得到變換后的模型頂點P′。此時該頂點的法線矢量可能也發(fā)生了改變,如果不做處理的話,會造成模型的光照效果不正確,因此在處理完所有的模型頂點之后,需要重新進(jìn)行法線的計算。
模型的三維法線矢量自動計算方法為:
1)對于模型的每一個頂點,獲取頂點所在的所有三角形信息;
“有這樣的稀罕事?”陳主任右手掌掻了掻后腦勺,“不瞞你說,這樣的事情我還是頭一回聽說。不是我不相信你,耳聽為虛,眼見為實,我想實地核實一下,你看行不?”
2)計算每個三角形的面法線矢量,即通過該三角形的三個頂點組成至少兩條不平行的邊矢量,然后計算其叉積結(jié)果;
3)計算所有三角形的面法線平均值,然后將這個平均值進(jìn)行歸一化之后賦予該頂點;
4)對于模型中的所有頂點,重復(fù)步驟1)-3)的過程。
因為RBF插值計算的過程需要求取輸入點和所有控制點的距離值,因此控制點的數(shù)量會影響到計算的效率;而模型完成變形之后也需要一個后處理的流程來重新計算頂點法線,因此RBF網(wǎng)格變形算法并完全不適合實時交互式的角色定制調(diào)整,它會存在一定的延遲和卡頓問題。但是對于自動批處理流程,或者交互頻次較低的角色實時定制需求而言,該方法比FFD變形的方式更為靈活,控制點定義方式更為明確;模型頂點的變形解算過程也非常穩(wěn)定可靠,不會產(chǎn)生異常的計算結(jié)果。
虛擬角色的控制點分布主要分為兩個區(qū)域,臉部和身體。臉部的控制點如圖2所示,主要設(shè)置在五官和臉型控制的關(guān)鍵位置上,以便快速地改變?nèi)宋锬槻啃蜗蟆?/p>
圖2 虛擬角色臉部控制點
臉部控制點的實際對應(yīng)區(qū)域和變形意義如表1所示。
表1 虛擬角色臉部控制點說明
虛擬角色身體的控制點,如圖3所示。
圖3 虛擬角色身體控制點
身體控制點的實際對應(yīng)區(qū)域和變形意義,如表2所示。
表2 虛擬角色身體控制點說明
上述控制點可以定制和表達(dá)一個正常人體的絕大多數(shù)面部和體態(tài)變化,通過RBF解算線性方程組之后,即可將人體模型的網(wǎng)格頂點傳遞到方程中計算它的變形后位置,進(jìn)而改變整
個模型網(wǎng)格的形態(tài),實現(xiàn)變形效果。
如果需要對人體的細(xì)節(jié)部位再做細(xì)調(diào),例如調(diào)整手臂的粗細(xì),或者調(diào)整手指和腳趾形狀的話,只需要在對應(yīng)的位置增加多個控制點,然后重新解算方程組即可。不過對于本文的研究內(nèi)容而言,上述控制點已經(jīng)足夠完成所需的功能。
虛擬角色的定制變形流程,如圖4所示。
圖4 虛擬角色的定制變形流程
如果需要程序自動調(diào)整控制點位置來批量生成模型,可以預(yù)先定義一些簡單的規(guī)則,例如隨機(jī)調(diào)整臉型、嘴角、眼角和鼻尖的位置,并設(shè)定一個合理的閾值范圍。然后自動隨機(jī)產(chǎn)生閾值內(nèi)的變換值并保存即可。隨機(jī)產(chǎn)生角色的過程中不需要渲染和預(yù)覽模型結(jié)果,定制結(jié)果可以確保穩(wěn)定,不會有嚴(yán)重錯誤或者穿透問題。具體的定制結(jié)果可以隨后應(yīng)用到常規(guī)的建模工具中,快速應(yīng)用于項目。
保存定制后的虛擬角色,可以直接記錄變形后模型的頂點、法線、索引信息,以及骨骼蒙皮等,但是這樣會花費較多的內(nèi)存和磁盤資源,保存后的角色也無法再次進(jìn)行控制點編輯。因此,較為合理的方案是首先存儲一份原始的模型,以及原始的控制點坐標(biāo)列表;然后為每個定制角色存儲一份控制點坐標(biāo)的差值結(jié)果列表。
實際讀取定制角色的結(jié)果時,只需要從磁盤或者內(nèi)存中獲取該差值列表,進(jìn)行RBF插值解算,進(jìn)而計算變形后的模型頂點即可。因為存儲的只是控制點的差值,并且大部分控制點的差值可能都是0,因此最終壓縮保存到磁盤的數(shù)據(jù)量非常之小,這對于大量角色定制模型的批量生成和存儲是非常便捷和實用的。
采用Unity引擎來實現(xiàn)虛擬角色批量生成的原型系統(tǒng),在系統(tǒng)中測試RBF網(wǎng)格變形效果的實現(xiàn),所使用的虛擬角色模型來自于網(wǎng)絡(luò),其基礎(chǔ)形態(tài)如圖5所示。
圖5 定制角色的初始形態(tài)
通過自動調(diào)整控制點,可以快速獲得不同面部和身體特征的定制化角色模型,部分隨機(jī)角色如圖6所示。
圖6 隨機(jī)調(diào)整控制點獲得的定制角色面部形態(tài)(左上圖為原始面部形態(tài))
該角色共有頂點數(shù)5萬個左右,使用本文所述的算法進(jìn)行調(diào)整,每進(jìn)行一次完整的RBF插值和法線平滑所需的時間大概為150ms左右;另一個較為復(fù)雜的角色模型共有頂點數(shù)28萬個左右,進(jìn)行一次完整運算所需的時間約為720ms左右。因為控制點總數(shù)對于任意角色模型都保持一致。因此該系統(tǒng)運行所消耗的時間與模型的總頂點數(shù)成正比關(guān)系。
對于一個角色批處理生成系統(tǒng)來說,這個系統(tǒng)延遲是完全可以接受的。但是如果希望做成可互動式的游戲“捏人”系統(tǒng),那么每次處理都需要150ms左右的時間,會導(dǎo)致整個實時系統(tǒng)只能運行在7-8Hz的幀速率下,暫時無法滿足實時交互的需求。
提出一種基于徑向基函數(shù)(RBF)插值的模型網(wǎng)格變形方法。不同于傳統(tǒng)的模型編輯和定制手段,只需要增加一定數(shù)量的離散控制點,并通過調(diào)整控制點的空間位置來統(tǒng)一改變模型頂點的變形效果。算法的控制點可以是隨意位置和任意數(shù)量,并且因為模型變形位置與控制點很接近,因此完全符合人的主觀操作邏輯,便于非技術(shù)人員使用。
采用所述算法和控制點方案,可以快速地構(gòu)建角色的批量定制系統(tǒng),批量生產(chǎn)外形各異的虛擬人物角色并用于影視、游戲等場合。整個生產(chǎn)過程可以有人為參與,也可以完全通過程序控制完成,因此非常適用于相關(guān)項目應(yīng)用的場合。
但是,所述的插值算法目前也有一定的局限性:主要在于算法本身的執(zhí)行效率不高,調(diào)整任何一個控制點的位置都需要重新進(jìn)行一次整體的網(wǎng)格變形運算,因此不適合在實時交互式系統(tǒng)中使用。此外,使用所述方法調(diào)整得到的網(wǎng)格模型,與之前已經(jīng)綁定完成的骨骼蒙皮系統(tǒng)是否可以直接對接使用,目前也需要更多的測試才能得到結(jié)論。這些都是下一步需要研究和實踐的主要技術(shù)方向。