顧乃林,申閆春
(1.宿遷學院法政學院,江蘇 宿遷 223800;2.北京信息科技大學計算機學院,北京 100192)
對于影視行業,游戲制作行業,以及近些年新興的直播行業來說,虛擬人體角色的建模和渲染都是其中重要的一環。但是,虛擬人模型的制作過程比較繁瑣,需要有經驗的美術人員大量參與。從人物設計,構建幾何拓撲結構,到骨骼的構建和綁定,蒙皮系統,以及后續的運動捕捉和動作匹配,都需要專業的美術團隊配合,否則很難保證建模的質量以及成品的可用性。
對于特效電影和游戲中的主角制作而言,由專業美術人員全程進行制作和修改的成本和時間通場都是項目方可以接受的。但是如果項目中需要大量的非主角類角色,例如成百上千的虛擬士兵,或者一場舞會中身著盛裝的人群,此時依然全部交給美術團隊去制作,因此產生的成本恐怕就難以承擔了。
如果可以通過程序化的手段,基于同一個基準角色,快速地隨機修改角色的身高、胖瘦、面部形象以及體表特征,從而快速變形生成大量相似但是又形態各異的虛擬人物的話,那么對于此類項目而言無疑有巨大的使用價值。
傳統的角色網格變形方法,可以在角色身體上添加額外的骨骼關節(這些關節不參與到通場的骨骼動畫中),并通過調整關節的位置和姿態來改變對應的蒙皮頂點位置,從而達到角色模型網格局部變形的效果。但是該方法需要美術人員提前設計和制作相應的骨骼關節,并依次進行蒙皮操作,增加了制作成本,以及后續使用角色的難度。此外,如果制作到半程時有新的網格變形需求,該方法也無法滿足立即更改的需求。
另一種網格變形方法是通過晶格自由變形(Free-Form Deformation,簡稱為FFD),將角色分割為多個立方體空間,并修改立方體的角點來實現角色的整體變形效果,如圖1所示。

圖1 基于FFD方法進行模型網格變形注:黃色點為晶格角點
方法可以相對靈活地調整和定制虛擬角色形象,但是不適合進行精細的調整,只能夠大范圍地進行改動。對于虛擬人來說,這樣很容易造成角色失真;并且無法判斷某個角點與實際變形效果的映射關系,因此無法通過程序化的方法自動化地構建多種形態的角色。
RBF插值的作用是能夠在一些三維的離散點之間進行平滑插值。假設在3維空間中有M個離散點xi,那么RBF可以提供該離散空間中的整體平滑插值函數F(x)。該函數就是M個徑向基函數G(ri)的結果之和,其中ri是估算點和原始點的距離:
其中ai是常量系數,c0,c1,c2,c3為多項式系數。因為已知M個離散控制點X1到XM,因此可以構建M個F(Xi)=Fi。由此可以構建M+4個線性方程組F=GA并求解,這里F=(F1,F2,…,FM,0,0,0,0),A=(a1,a2,…,aM,c0,c1,c2,c3),而G是一個(M+4,M+4)的矩陣。
解算線性方程組得到所有參數之后,再傳入新的X=(x,y,z)坐標值,就可以得到對應的空間基函數插值的結果,也就是頂點X基于該基函數變換后的結果。
在三維空間中預先設置M個控制點,用于控制同一空間中其它模型頂點的變形效果。如果沒有任何控制點發生變化,則認為對應的模型頂點P也都位于原處不變;當某個或者多個控制點發生坐標位置的變化時,計算其差值得到M個矢量數據,基于這組矢量數據解算RBF方程,即可得到插值變形后的模型頂點差值d,則新模型頂點坐標P′=P+d。
在預處理過程中解算方程組得到所有的RBF參數之后,傳入模型頂點P,即可通過上述公式得到變換后的模型頂點P′。此時該頂點的法線矢量可能也發生了改變,如果不做處理的話,會造成模型的光照效果不正確,因此在處理完所有的模型頂點之后,需要重新進行法線的計算。
模型的三維法線矢量自動計算方法為:
1)對于模型的每一個頂點,獲取頂點所在的所有三角形信息;
“有這樣的稀罕事?”陳主任右手掌掻了掻后腦勺,“不瞞你說,這樣的事情我還是頭一回聽說。不是我不相信你,耳聽為虛,眼見為實,我想實地核實一下,你看行不?”
2)計算每個三角形的面法線矢量,即通過該三角形的三個頂點組成至少兩條不平行的邊矢量,然后計算其叉積結果;
3)計算所有三角形的面法線平均值,然后將這個平均值進行歸一化之后賦予該頂點;
4)對于模型中的所有頂點,重復步驟1)-3)的過程。
因為RBF插值計算的過程需要求取輸入點和所有控制點的距離值,因此控制點的數量會影響到計算的效率;而模型完成變形之后也需要一個后處理的流程來重新計算頂點法線,因此RBF網格變形算法并完全不適合實時交互式的角色定制調整,它會存在一定的延遲和卡頓問題。但是對于自動批處理流程,或者交互頻次較低的角色實時定制需求而言,該方法比FFD變形的方式更為靈活,控制點定義方式更為明確;模型頂點的變形解算過程也非常穩定可靠,不會產生異常的計算結果。
虛擬角色的控制點分布主要分為兩個區域,臉部和身體。臉部的控制點如圖2所示,主要設置在五官和臉型控制的關鍵位置上,以便快速地改變人物臉部形象。

圖2 虛擬角色臉部控制點
臉部控制點的實際對應區域和變形意義如表1所示。

表1 虛擬角色臉部控制點說明
虛擬角色身體的控制點,如圖3所示。

圖3 虛擬角色身體控制點
身體控制點的實際對應區域和變形意義,如表2所示。

表2 虛擬角色身體控制點說明
上述控制點可以定制和表達一個正常人體的絕大多數面部和體態變化,通過RBF解算線性方程組之后,即可將人體模型的網格頂點傳遞到方程中計算它的變形后位置,進而改變整
個模型網格的形態,實現變形效果。
如果需要對人體的細節部位再做細調,例如調整手臂的粗細,或者調整手指和腳趾形狀的話,只需要在對應的位置增加多個控制點,然后重新解算方程組即可。不過對于本文的研究內容而言,上述控制點已經足夠完成所需的功能。
虛擬角色的定制變形流程,如圖4所示。

圖4 虛擬角色的定制變形流程
如果需要程序自動調整控制點位置來批量生成模型,可以預先定義一些簡單的規則,例如隨機調整臉型、嘴角、眼角和鼻尖的位置,并設定一個合理的閾值范圍。然后自動隨機產生閾值內的變換值并保存即可。隨機產生角色的過程中不需要渲染和預覽模型結果,定制結果可以確保穩定,不會有嚴重錯誤或者穿透問題。具體的定制結果可以隨后應用到常規的建模工具中,快速應用于項目。
保存定制后的虛擬角色,可以直接記錄變形后模型的頂點、法線、索引信息,以及骨骼蒙皮等,但是這樣會花費較多的內存和磁盤資源,保存后的角色也無法再次進行控制點編輯。因此,較為合理的方案是首先存儲一份原始的模型,以及原始的控制點坐標列表;然后為每個定制角色存儲一份控制點坐標的差值結果列表。
實際讀取定制角色的結果時,只需要從磁盤或者內存中獲取該差值列表,進行RBF插值解算,進而計算變形后的模型頂點即可。因為存儲的只是控制點的差值,并且大部分控制點的差值可能都是0,因此最終壓縮保存到磁盤的數據量非常之小,這對于大量角色定制模型的批量生成和存儲是非常便捷和實用的。
采用Unity引擎來實現虛擬角色批量生成的原型系統,在系統中測試RBF網格變形效果的實現,所使用的虛擬角色模型來自于網絡,其基礎形態如圖5所示。

圖5 定制角色的初始形態
通過自動調整控制點,可以快速獲得不同面部和身體特征的定制化角色模型,部分隨機角色如圖6所示。

圖6 隨機調整控制點獲得的定制角色面部形態(左上圖為原始面部形態)
該角色共有頂點數5萬個左右,使用本文所述的算法進行調整,每進行一次完整的RBF插值和法線平滑所需的時間大概為150ms左右;另一個較為復雜的角色模型共有頂點數28萬個左右,進行一次完整運算所需的時間約為720ms左右。因為控制點總數對于任意角色模型都保持一致。因此該系統運行所消耗的時間與模型的總頂點數成正比關系。
對于一個角色批處理生成系統來說,這個系統延遲是完全可以接受的。但是如果希望做成可互動式的游戲“捏人”系統,那么每次處理都需要150ms左右的時間,會導致整個實時系統只能運行在7-8Hz的幀速率下,暫時無法滿足實時交互的需求。
提出一種基于徑向基函數(RBF)插值的模型網格變形方法。不同于傳統的模型編輯和定制手段,只需要增加一定數量的離散控制點,并通過調整控制點的空間位置來統一改變模型頂點的變形效果。算法的控制點可以是隨意位置和任意數量,并且因為模型變形位置與控制點很接近,因此完全符合人的主觀操作邏輯,便于非技術人員使用。
采用所述算法和控制點方案,可以快速地構建角色的批量定制系統,批量生產外形各異的虛擬人物角色并用于影視、游戲等場合。整個生產過程可以有人為參與,也可以完全通過程序控制完成,因此非常適用于相關項目應用的場合。
但是,所述的插值算法目前也有一定的局限性:主要在于算法本身的執行效率不高,調整任何一個控制點的位置都需要重新進行一次整體的網格變形運算,因此不適合在實時交互式系統中使用。此外,使用所述方法調整得到的網格模型,與之前已經綁定完成的骨骼蒙皮系統是否可以直接對接使用,目前也需要更多的測試才能得到結論。這些都是下一步需要研究和實踐的主要技術方向。