[專欄精選]Unity動畫系統的RootMotion

[專欄精選]Unity動畫系統的RootMotion

來自專欄 Unity探路營6 人贊了文章

洪流學堂,讓你快人幾步。你好,我是鄭洪智。

洪流學堂公眾號回復專欄,查看更多專欄文章。


「智哥,自從用了混合樹來做人物移動,腰不酸腿不疼,思路更清晰了,一口氣能寫12小時代碼!」

「喲,療效這麼好,我看你應該再碼12個小時」

「那也沒問題,你來看看我做的這個人物的混合樹是不是棒極了」

想深入了解大智和小新這對好基友,可以在洪流學堂公眾號回復小新了解他們。

小新信心滿滿地打開混合樹,給大智看。

「嗯,這個混合樹確實做的不錯,比不過你這個角色還不能用啊!」

「怎麼不能用了,你看這個走起來不是走的好好的么?」

「你走到那個坡上去試試」

小新操作人物往坡上走,只見直接穿了進去。

「哎?我好像忘了給人物加碰撞了,等我給他加上」

小新給角色加上Collider和Rigidbody組件,再次操作人物往坡上懟過去。

「智哥,你看現在OK了吧?」

「別急,你再下坡看看」

「哎,這怎麼不受重力啊,怎麼不會掉下去!明明加了剛體組件啊」

「這個是因為動畫在控制人物的Y軸,所以才沒有掉下去」

「但是我不都設置Apply Root Motion了么,咋還這樣呢?」

「那你知道Root Motion到底是什麼?」

「那不就是……人物的動畫會帶動人物移動嘛」

「這只是他的一個表現,這時候你該去好好理解下Root Motion到底是什麼了,這個Unity的文檔中有,你去好好看一下吧!」

「好嘞」

下面是小新的學習筆記。

Root Motion

首先要分清Body Transform和Root Transform。

Body Transform(身體變換)

Body Transform是角色的質心(重心)。用於Mecanim系統的重定向引擎中來提供穩定的模型移動。身體朝向是角色模型在T姿勢下上身和下身朝向的平均值。

Body Transform和朝向存儲在Animation Clip中,這兩個是Animation Clip中存儲的唯二世界空間的曲線,其他的動畫曲線都是以相對body transform的形式存儲的。

T-Pose T姿勢

角色模型的胳膊向外伸直,整個身體呈T字型,一般的角色模型應該為這個姿態。

Root Transform(根變換)

Root Transform是body transform在Y平面上的投影,並且是運行時計算的。每一幀Root Transform的變化實時計算。然後Transform的變化會被應用到GameObject上從而讓物體移動。

調整Root Transform

通過對Animation Clip的設置來控制Body Transform投影到Root Transform的結果。

可以調整的有Root Transform Rotation, Root Transform Position (Y) 和 Root Transform Position (XZ) 。基於設置,Body Transform的部分數值可以轉移到Root Transform中。例如你可以選擇動畫中的Y曲線是Root Motion的一部分,還是Body Transform(pose)的一部分。

Root Transform Rotation

用於設置Root Transform的朝向(旋轉)。

Bake into Pose:選中後,角色的朝向會基於body transform(Pose)。Root Orientation會是一個常量,意味著Animation Clip不會旋轉這個物體。

只有AnimationClip的開始和結束位置旋轉相似的時候,才應該使用這個選項。可以通過右邊的綠燈判斷。通常用於向前直行的走或跑的動畫。

Base Upon:可以設置動畫的朝向基於的地方。

  • Body Orientation:動畫會朝向身體正前方。這個設置適用於大多數身體朝前的動畫,比如走跑跳。但是如果動畫是向左或向右平移的話,會有問題。這時候可以使用下面的Offset來調節角色的朝向。
  • Original:有的動畫師會給動畫手動加上旋轉,確保動畫的朝向正確,這時候可以使用這個選項,一般就不用再手動調整Offset了。

Offset:基於Base Upon的設置,調整偏移量。

Root Transform Position (Y)

用於設置Root Transform位置的Y軸位置。

Bake into Pose:選中後,動畫的Y軸的運動會保留在Body Transform(Pose)上。Root Transform的Y軸會是一個常數(不會受動畫影響變化),也就是意味著動畫不會改變物體位置的Y值。右邊有一個綠燈指示動畫起始位置和結束位置的高度是否一致,可以看齣動畫是否適合使用此選項。

大多數的動畫應該選中此選項,除了那些會改變物體高度的動畫比如跳起、跳下這些動畫。

注意:Animator.gravityWeight是由Bake Into Pose position Y控制的。選中時gravityWeight = 1,不選中時gravityWeight = 0。gravityWeight用來在state轉換時進行混合。

Base Upon:和Root Transform Rotation設置類似,除了Original 或 Mass Center (Body)選項外,還有一個Feet選項。Feet選項非常適合改變物體高度的動畫(不勾選Bake Into Pose)。使用Feet時,Root Transform Position Y會匹配骨骼中腳部的Y位置(更低的那個)。Feet選項可以避免混合或轉換時浮空的現象。

Offset:可以設置高度的偏移量。

Root Transform Position (XZ)

用於設置Root Transform位置的XZ軸位置。

Bake Into Pose:通常用於原地不動的動畫(動畫在XZ軸上的位置為0)。可以用來去除動畫循環累計的誤差,造成位置的移動。也可以通過設置Based Upon Original來強制使用動畫師設置的位置,否則會使用角色的重心作為Root。

Loop Pose

Loop Pose(比如混合樹或Transition中的混合)會基於Root Transform。Root Transform在每幀被計算出來後,動畫的位置會相對Root Transform。開始幀和結束幀的差別會被計算出來,然後分布到動畫的0-100%。完全沒看明白,得問大智了

Generic Root Motion

Generic和Humanoid基本是類似的,但是Generic的動畫的Root Transform是手動設置的Root Node屬性。


「大智,我看完Root Motion的文檔了,不過還是有點雲里來霧裡去的,你能不能用簡單的幾句話說說設置Root Transform的作用是什麼?」

「簡單來說,如果不設置Root Transform中的Bake Into Pose,動畫中的曲線會影響物體的Root Transform,而勾選了Bake Into Pose以後,動畫的曲線就不會影響物體的Root Transform。再直白點說,比如勾選了Root Transform Position (Y)的Bake Into Pose,那動畫就不會影響物體的Y軸位置了。對於你遇到的剛體不會掉落的問題,也能解決了。」

「emmm,大概能明白,我還是得去試一試看看不同的效果。第二個問題:什麼是重定向?」

「重定向就是把A角色做的動畫用到B角色上。如果A和B兩個角色的骨骼結構完全一樣,那動畫可以直接重用。但是如果A和B的骨骼結構不一樣,但是是Humanoid類型的,可以使用Unity中的Retargeting系統,這個文檔里也有,建議你先去看看。」

「哦,我現在貌似還用不到,等我用到的時候去查一下。最後一個問題哈,Loop Pose的作用是什麼?我看了半天也沒看明白是什麼意思」

「看不明白很正常,文檔中那個解釋確實有些不太直觀。這個作用是,如果一個循環動畫的首尾幀有差別,選中這個選項Unity會給你插值,讓首尾幀看起來是連貫的,循環起來沒有縫隙,但是可能會看起來有些奇怪。不過我們使用的動畫,一般動畫師都會做成無縫循環的動畫,所以這個選項也不經常使用。

「這麼一說我就能明白很多了,看來文檔也有不靠譜的時候啊」

總結

「文檔有時確實有描述不太準確或者晦澀的時候,這時候就需要你多動手。你看這個知道的『知』字,左邊是矢,也就是箭矢,右邊是口,靶子也就是目標。這個字是說:不斷地練習,命中目標才是知。所以要多實踐。」

「哇,智哥你當個程序員虧了,應該去研究哲學去。」

今日思考題

「我也有此意,哈哈。給你布置個思考題,試下動畫加上不同的Root Motion設置以後會有什麼不同的效果。」

「收到!我去也!」

「收穫別忘了分享出來!也別忘了分享給你學Unity的朋友,也許能夠幫到他。」

洪流學堂公眾號回復專欄,查看更多專欄文章。

推薦閱讀:

TAG:Unity遊戲引擎 |