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

2021-09-19 19:19:28 字數 2088 閱讀 7521

目前實現捏臉功能的方式主要有兩種。乙個是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爪爪學院查詢。鏈結也可以加入unity學習討論群935714213

近期更有資深開發人士直播分享unity開發經驗,詳情請進入官網或加入qq群了解

自定義角色外觀之捏臉

它其實是單個網格變形以實現許多預定義形狀和任何數量之間組合的技術,在maya 3ds max 中我們稱它為變形目標,例如單個網格是預設形狀的基本形狀 例如無表情的面 並且基本形狀的其他形狀用於混合 變形,是不同的表達 笑 皺眉 閉合眼皮 這些被統稱為混合形狀或變形目標。聽上去原理和anmimtor的...

網易 已在招聘虛擬場景建造師 虛擬角色捏臉師等職位

程式設計客棧 www.cppcns.com 11月17日 訊息 在xrxtd昨日的2021年第三季度財報 會議上,網易創始人丁磊表示,網易已做好元宇宙的技術和xrxtd規劃準備,在技術 規劃各個層面上,網易可能跑的比誰都快。據科創板程式設計客棧 報道,對此,網易方面透露稱,已在招聘虛擬場景搭建的建造...

Unity面試整理

1 什麼是drawcall,有什麼方法可以減少drawcall drawcall是啥?其實就是對底層圖形程式 比如 opengl es 介面的呼叫,以在螢幕上畫出東西。在每次呼叫draw call之前,cpu需要向gpu傳送很多內容,包括資料,狀態,命令等。在這一階段,cpu需要完成很多任務作,例如...