呂依娜
(四川大學計算機學院,成都610065)
近些年來,隨著電影、游戲和虛擬現實應用的快速發展,計算機三維動畫技術因為能夠創造逼真的視覺效果,而被廣泛用于這些行業之中。在動畫領域中,骨骼動畫技術因其控制簡單高效的優點,成為最常見的虛擬人動畫技術之一。而如何讓動畫中的三維虛擬角色更加栩栩如生成為目前熱門的研究方向之一。
骨骼動畫的核心思想是在虛擬角色內部構建一副具有層次結構的骨架,為骨骼和皮膚網格頂點定義一種映射關系,使皮膚網格頂點與骨骼綁定,這個過程也稱為蒙皮。蒙皮完成后,就可以用骨架來驅動附著在其上的皮膚運動,生成虛擬角色動畫。骨架的運動數據可以由動畫師定義,也可以通過動捕設備獲得。常見的蒙皮方法有LBS(Linear Blend Skinning)[1]和DQS(Dual Quaternion Skinning)[2],它們的優點是計算快速,但都有關節塌陷和走樣的問題。通過幾何蒙皮技術實現的骨骼動畫,雖然能實現流暢的動作,但無法模擬人體軟組織的運動效果,例如脂肪的抖動和碰撞引起的皮膚變形。這些軟組織運動和皮膚變形,能帶來更豐富更逼真的視覺效果,也是創造真實感動畫的關鍵。
為了模擬在運動過程中虛擬角色皮膚抖動和變形的效果,在過去動畫師們需要手動在關鍵幀處理虛擬角色的皮膚變形,雖然能達到真實的視覺效果,但過程非常繁瑣耗時。所以研究人員們提出了基于物理的蒙皮方法,采用自動模擬的方式增強角色變形的真實感。傳統的仿真方法主要通過3D 掃描人體結構,構建具有骨骼、肌肉和脂肪組織的多層次人體解剖模型,然后通過有限元方法(FEM)[3]對模型體積網格進行受力分析和求解。這種仿真方法符合現實中人體動力學,能模擬非常逼真的肌肉組織運動。但建模復雜且難度高,只適合人體模型的仿真運動,不適用于虛擬卡通角色。除此之外,近些年還提出了基于樣本數據學習的模擬方法,例如SMPL 模型(Skinned Multi-Person Linear model)[4]能實現具有脂肪抖動物理效果的多人蒙皮動畫。基于樣例的方法需要輸入一系列模型不同姿勢的樣本,然后訓練學習如何通過各種姿勢進行混合蒙皮。這種方法依賴大量訓練姿勢的樣本,訓練后的模型只適用于特定的骨架和皮膚網格,換一套骨架和網格可能需要重新訓練。
本文提出了一種通用的分層體素框架,能實時模擬皮膚的彈性行為,如脂肪和軟組織抖動等效果。給定任意的模型網格及對應靜態骨骼數據,本框架可以將網格體素化后的結果分為骨骼部分和可變形的軟體部分。整個角色的蒙皮動畫分為兩個步驟,首先使用經典的線性混合算法對骨骼部分進行初次變形,然后利用基于網格的形狀匹配算法[5]將運動傳遞到軟體部分,最終形成平滑的蒙皮。本框架主要有以下幾個特點:
●可以自由調整體素模型的分層結構,改變骨骼部分和軟體部分的比例。通過改變兩個部分的比例可以獲得不同的變形效果;
●骨骼部分的蒙皮權重不需要手動計算,通過體素網格方法可以自動獲得;
●相比于傳統的軟體模擬方法具有更好的穩定性,且滿足實時的性能需求。
如圖1 所示是本文的基本流程。輸入是模型的網格和初始骨骼數據,首先對網格進行體素化并進行分層。根據用戶指定的比例,體素被分為骨骼體素和軟體體素。然后根據最短體素距離[6]可以計算骨骼體素的蒙皮權重,蒙皮權重在線性混合算法中會被用到。初始化過程結束后,輸入骨骼每幀的運動數據,進入實時的動畫過程。此過程主要包含兩次變形,第一次是針對骨骼體素進行線性混合蒙皮[6],使骨骼體素產生初次運動。第二次變形是根據形狀匹配算法[5]將骨骼層的運動平滑的傳遞到軟體層,調整剛度系數可以改變變形的軟硬程度。最后通過線性插值將體素的運動映射回原模型網格頂點,改變頂點位置,完成骨骼驅動的蒙皮動畫。

圖1 算法流程
本節介紹了初始化的主要兩個流程,包括模型體素化分層以及骨骼體素的權重計算。
本文采用基于GPU 的方法[7]將模型網格體素化,使得體素占據了封閉網格包含的整個空間。體素化分辨率可由用戶指定。如圖2 所示體素化完成后,輸入初始骨骼數據(一種樹形結構),進行分層操作。與骨骼線段相交的體素被默認的劃分到骨骼層中。用戶也可以指定一個距離h用來控制骨骼層體素的數量,與骨骼相交體素的最短曼哈頓距離為h的所有體素也屬于骨骼層,剩下的體素被自動劃分到軟體層中。h越大,骨骼層體素的數量越多,相對的軟體層的體素數量就越少。骨骼層和軟體層的比例會影響最后的蒙皮效果,用戶可根據不同模型采取不同的比例進行分層。

圖2 模型體素化
本文只對骨骼層體素進行蒙皮權重計算,此蒙皮權重將用于初次變形。假設骨骼樹中某塊骨骼為b,骨骼層某體素為i。我們定義db-i為骨骼層體素i到骨骼b的最短曼哈頓距離[6],可通過Dijkstra 算法得到。根據公式(1)和公式(2)可以計算出骨骼b對體素i的影響權重:

其中,ε是一個較小的值,可以避免公式(1)中的分母為0。α是屬于0-1 的常數,用于調整距離對權重的影響。增大α的值,可以降低遠處骨骼對體素的影響。在本文的實驗中設為0.7 較為合適。通過以上公式可以計算每個體素受每塊骨骼的影響權重,一般來說,我們選取權重最大的四塊骨骼做蒙皮計算,權重之和為1。
初始化過程結束后,可對骨骼層體素進行初次變形。本文采用線性混合蒙皮算法進行此步驟。輸入數據是骨骼每幀的運動數據,包含旋轉和平移信息,可用變換矩陣Tb表示骨骼b的運動數據。假設骨骼體素i受四塊骨骼影響,并且根據初始化步驟已經得到了影響權重w。那么在運動過程中,體素i的位置可由以下公式得到:

其中,p0b-i是體素i在初始狀態時相對于骨骼b的局部位置。體素受4 塊骨骼影響,乘上每塊骨骼的變換矩陣就能得到四個相應的新位置,再乘上對應的權重然后相加就能得到一個平均位置。這個平均加權位置就是骨骼體素初次變形后的位置。
初始變形結束后,骨骼層的體素根據骨骼數據的驅動已經移到了新的位置。接下來進入二次變形的步驟,二次變形不再改變骨骼體素的位置,改變的是軟體層體素的位置。本文采用基于塊區域的形狀匹配算法,將骨骼體素的運動傳遞到軟體體素。基于塊區域的形狀匹配算法的核心思想是將模型的所有體素劃分為一個個重疊的塊區域,當骨骼體素發生位置的變化時,對每個塊區域進行一次形狀匹配,估計每個塊區域的運動。由于塊區域是重疊的,因此骨骼體素位置的改變會引起所在塊區域的變形,也會影響到重疊的其他塊區域發生形變。如圖3 所示是算法的示意圖,當塊區域中的體素發生位置變化時,運動會平滑過渡到其他塊區域,使整個物體發生平滑的形變,形成軟體效果。
我們首先需要為每個體素i生成一個塊區域Ri,這里不區分骨骼體素和軟體體素。我們定義一個距離n,塊區域Ri包含了到體素i距離為n的所有體素。當n=1 時,Ri就是i以及它的一環鄰居。n越大,塊區域包含的體素數量就越多。由于塊區域間有重疊,一個體素可能被多個塊區域共享,因此體素i的質量需要除以所屬的塊區域的總個數,即m'i=mi/ |Ri|。每個塊區域的質心可以通過以下公式得到:


圖3 基于塊區域的形狀匹配[5]
其中,C0r是初始狀態的質心,Cr是當前的質心。Mr是塊區域內所有體素的總質量。xi0是體素初始位置,xi是當前位置。那么,每個塊區域r的最優線性變換矩陣A為:

我們只關心A中的旋轉分量。而最優旋轉矩陣R可由A通過極分解獲得,因此每個塊區域相對于初始狀態的最優線性變換T,可通過旋轉矩陣和平移矩陣相乘獲得,即T=R(cr-Rc0r)。那么,根據每個塊區域的最優線性變換T,可以得到該區域內每個體素的移動位置為:

由于一個體素可能被多個塊區域共享,因此它的最終位置是所屬塊區域的移動位置的平均值,即:

硬件配置:Intel Core i7-3770 CPU,3.4GHz,8G 內存,NVIDIA GeForce GTX-560 顯卡;開發環境:Visual Studio 2017,Blender,C++編程,OpenGL 圖形開發。
經實驗證明,本文提出的方法在滿足實時性能需求的同時,能得到視覺可信的軟體模擬效果。如圖4所示是一個胖子模型的骨骼動畫截圖,胖子模型的肚子會隨著運動發生變形和抖動,符合預期效果。

圖4 蒙皮動畫結果
此外,本文還使用了不同模型分別進行了實驗,測試其性能表現。經實驗結果表明,模型體素化的分辨率越高,蒙皮動畫的效果越真實,但相應的性能也會大幅度下降。因此體素化分辨率的選擇需要在視覺效果和效率之間做權衡。復雜的模型可能需要更精細的體素化,例如人體的手指需要較小的體素來表現皮膚的變形行為。在實時的蒙皮過程中,時間消耗最大的是二次變形。因為每個體素都會生成一個塊區域,每個塊區域都會進行形狀匹配計算,形狀匹配算法中最優線性矩陣的計算通常需要迭代獲得,因此比較耗時。二次變形是個串行計算過程,也是影響性能的主要瓶頸。
本文提出一種后處理蒙皮的方法,將經典幾何蒙皮和軟體模擬結合在一起,把動畫管線中的蒙皮過程分成了兩個步驟。本文將線性混合蒙皮用于骨骼層體素,進行剛性變形。然后利用形狀匹配算法將骨骼層體素的運動傳遞到其他層次,模擬其他層的軟體運動,形成以骨骼驅動的軟體變形效果。經實驗表明,此方法達到了視覺可信的變形效果,且適用于實時的應用。在以后的研究中,我們會嘗試加入一些幾何約束來增強變形的真實性。在性能方面,我們會嘗試尋找基于GPU 的實現方法來提高復雜模型動畫的效率。