天天看點

unity 給模型綁定骨骼_Unity 骨骼動畫的運作時重定向

unity 給模型綁定骨骼_Unity 骨骼動畫的運作時重定向

上次我們說到在 IKinema 中添加自定義模型。方法很簡單,就是利用運作時重定向,這次為大家介紹一下具體做法。

Unity 中的重定向(retargeting)大家應該不陌生,重定向使得 Humanoid 模型間可以共享骨骼動畫,大大降低了動畫的制作成本。但是 Unity 系統的重定向是基于檔案的,對于我們使用 Orion 來說,我們需要在 IKinemaMale 模型獲得動作資訊的同時,将這些資訊應用到我們自定義的模型上,這就需要我們在運作時進行重定向。

首先我們需要搞清楚的是,在重定向時發生了什麼。Unity 系統中如何實作重定向我們無從得知,而從一段 UE4 的官方視訊中,我們可以得到蛛絲馬迹:重定向時,(UE4)複制了各關節的旋轉角度,想來 Unity 應該也類似。這其實不難了解,因為人的骨骼關節不能位移隻能旋轉,是以可以忽略位移資訊。同時,即使兩個人的骨骼比例相差很大,如果他們的每個關節都進行了同樣角度的旋轉的話,那他們的身體姿勢應該也是相同的。是以我們需要做的,就是在運作時,将 IKinemaMale 的各個關節的旋轉角度複制到我們的模型上,我們的模型就應該和 IKinameMale 做出同樣的動作。這樣我們就可以在動捕中用到我們的自定義模型了。

知道了如何重定向,我們來看看在 Unity 中的實作。Unity 内部使用四元數進行旋轉運算。根據上面的叙述,我們知道涉及兩種運算。一種是四元數相減,即我們需要在運作時将源模型某個關節的所處角度減去該關節的初始角度,得到它的旋轉量。另一種當然是四元數相加,我們需要将旋轉量,加到目标模型的對應關節上。在四元數中,計算 A 與 B 的差的運算為 A * Inverse(B),而計算 A 與 B 的和則為 A * B。

實際代碼如下。

using 
           

代碼主體就是在 Start() 中記錄下各關節初始角度,然後在 LateUpdate() 複制旋轉角度。

為了測試這段代碼,我們可以在商店中下載下傳 RCP - Caucaisan Character Models。我們将用到其中的 CaucasianMale 模型。之是以選這個模型,是因為它是 AssetStore 中少數幾個免費的、binding pose 為 TPose 的模型。如果你想使用非 TPose 的模型,則需要在在取得初始角度 SetJointsInitRotation() 之前進行一次校正,這裡就略過了。

将 CaucasianMale 加入場景,添加我們的元件,srcModel 置為場景中已有的 IKinemaMale。

unity 給模型綁定骨骼_Unity 骨骼動畫的運作時重定向

啟動 Orion,就能看到兩個模型共舞了。

unity 給模型綁定骨骼_Unity 骨骼動畫的運作時重定向

需要指出的是,上述代碼主要示範骨骼旋轉角度的複制,在實際使用中,我們還需要考慮模型腳部着地,是否為 root motion 等情況,這裡就不展開了。

以上就是在 Unity 中進行運作時重定向的方法,至少兩周前我還是這樣想的,直到發現了 HumanPoseHandler。

根據文檔,HumanPoseHandler 是

A handler that lets you read or write a HumanPose from or to a humanoid avatar skeleton hierarchy.

簡直就是為重定向而生的。于是我們的代碼,由,

unity 給模型綁定骨骼_Unity 骨骼動畫的運作時重定向

變為

using 
           

代碼量減少很多,而且重要的是我們可以不用關心四元數的取逆與交換律了。當然,用四元數處理的好處在于我們可以在 UE4 中如法炮制,因為據筆者了解現在 UE4 中還沒有類似 HumanPoseHandler 的功能。

總的來說,運作時重定向有兩個好處,其一,是在 IKinema Orion 這種隻能對預設模型進行動捕的系統中,也能實時用上我們自己的模型。其二,即便不用 Orion,而是使用 FinalIK 之類的動捕方案,對于身體比例與常人相差較大的模型,如果直接在其上套用 IK,可能很難得到令人滿意的結果,這時,就可以選用正常的人型模型進行 IK,同時将結果重定向到目标模型上去。比如下面的動畫所示。

unity 給模型綁定骨骼_Unity 骨骼動畫的運作時重定向

https://www.zhihu.com/video/1147614851324076032

在這裡我們使用的是 FinalIK 進行全身動捕。圖左的皮卡丘直接進行 IK,中間的皮卡丘,則是通過右側人型模型進行 IK 之後,重定向之後的結果。可以看到中間的皮卡丘姿勢更加自然,穿模現象也少。

最後附上代碼友善取用。

https://github.com/fengkan/RuntimeRetargeting