[專欄精選]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遊戲引擎 |