Unity 捏臉整理及基於骨骼的捏臉功能實現


目前實現捏臉功能的方式主要有兩種。一個是Blendshape(融合變形),一個是基於骨骼驅動的方式,通過修改骨骼矩陣(bindpose)來影響SkinMesh。這兩種方式的最終原理都是在shader 生效之前修改頂點。

融合變形

優點:可以控制非常細微的變化,通常用於面部動畫。

缺點:Blendshape在捏臉制作上工作量非常大,我想把一個結構捏的多么細微就要制作多少張臉,這個細微度和工作量是成正比的。這樣會導致后期修改不方便,更重要的是性能消耗非常大。另外跟我們第三方動畫軟件不兼容。

骨骼驅動

優點:制作量比較少,性能消耗相對少些,和現有動畫系統兼容,另外捏臉骨骼和動畫骨骼是同一套骨骼,就通過MorphemeConnect動畫軟件跟面部骨骼做了融合。當你捏出來任何形狀的臉都可以套用同一個動畫,這樣也減少很大的工作量。

缺點:權重分配受限較多,捏臉的細致程度有限。

由於大多數使用Unity 開發的游戲都希望最終部署在移動平台上,綜合考量時間成本,性能消耗和實際需求,以下介紹基於骨骼驅動的捏臉方案。(后續會整理出融合變形的方案)

什么是骨骼?為什么通過骨骼能夠調整臉型?

骨骼是一些具有層次結構的“關節”點(在Unity 中是僅有一個根節點的樹狀的空物體)構成的,其引入最初是希望能籍此方便實現仿生動畫,其核心原理簡而言之就是通過骨骼帶動“皮膚”(mesh)來運動,也就是通過移動骨骼(對骨骼做動畫)並根據骨骼和皮膚的關系來計算mesh 跟隨骨骼運動后所在的位置。

骨骼及蒙皮機制:

1.將綁定姿勢(即模型原始狀態,如人形模型的T型結構)狀態下的模型(蒙皮)頂點(世界坐標)變換到各個骨骼空間下。

2.將骨骼變換(移動、旋轉、平移)到新位置。

3.根據骨骼和蒙皮關系,將綁定姿勢下的模型(蒙皮)頂點(骨骼空間下)變換到新的世界位置。

初始位置(綁定姿勢)

骨骼變換后位置

1.計算小臂上一點S在小臂空間中的位置。

這個就要根據初始的骨骼位置和mesh上頂點的位置來計算了,也就是常說的綁定姿勢狀態。先說一下該例中每個坐標的意義:

(x1,y1,z1):左肩關節SL的世界坐標。

(x2,y2,z2):左肘關節在以左肩關節為原點的坐標系本地坐標。

(x3,y3,z3):附着於左小臂上的皮膚上的一點S的世界坐標。

這里為了簡單,假設所有的關節都沒有經過平移和縮放。實際上的變換一般會通過矩陣來表示。在Unity 中可以通過transform 之間的父子關系及子節點的local 信息組合出模型矩陣(即將骨骼空間坐標轉到世界空間下的矩陣),然后通過求其逆矩陣獲得綁定姿勢矩陣(如果無法理解建議補充矩陣和空間變換的基本圖形學知識):

綁定姿勢矩陣

根據綁定姿勢矩陣,我們可以將蒙皮上的頂點的世界坐標轉化到骨骼空間下。

2.計算EL順時針旋轉90°后S點的位置。

直接通過左肩SL,左肘關節EL的縮放、旋轉、平移信息計算小臂LA空間的模型矩陣,使用上一步算出的小臂LA空間坐標乘以該模型矩陣即算出了該點收到骨骼移動的影響后的位置。

模型矩陣反推變換后的蒙皮頂點世界坐標

3.頂點混合

頂點可能不止受到一個骨骼的影響,需要根據權重混合多個骨骼計算出新的世界坐標點。這也是為什么頂點受到骨骼影響越多,性能越差的原因。

總結:利用蒙皮與骨骼相對位置不變的性質,通過不變的bindpose 矩陣和變化的model 矩陣將蒙皮的世界坐標變換到實際的位置。

更多unity2018的功能介紹請到paws3d爪爪學院查找。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM