Unity開發筆記-LookAtIK功能研究


0x0

LookAt在RPG中是不可或缺的功能,對話系統中聽者朝向說話者注視,主角路過npc,npc會朝向主角注視。目前有以下幾種解決方法。

1.只轉動頭部

讓我們來看看實際效果,以下是原神的某一個對話劇情,可以看出,只轉動頭部,效果差強人意,接近90度后,顯得很不自然。另外這段動畫中可以看到頭部轉動是勻速的,實際情況很少有勻速轉動頭部的情況,這個問題可以通過曲線緩動解決。

2.多骨骼IK

除了頭部參與lookat之外,可以讓頸部,胸骨等也參與lookat。
這里有2種實現。現在假設有3個骨骼共同參與lookat,分別是head->neck->spine

1.使用權重同時轉動

所有joint同時轉動。所有參與lookat的joint各自分配一個權重,比如頭部權重是1,表示任何情況下都完全看向目標,spine胸骨權重0.3,表示不完全看向目標。FinalIK和unity內置的Animator.SetLookAtPosition采用的就是這種方法。

2.層級轉動,上層關節到達限制角度后,移動下層關節。

從head開始,嘗試轉動看向目標,當達到最大限制角度但任然不能看向目標,則轉動neck。如果head在最大角度限制內可以看向目標,則不需要轉動neck。這個過程對neck,spine也一樣適用。DOOM采用了這個算法。

Unity商城中Perfect Look At的插件也是使用該方法。插件的作者也很負責的在文檔中說明了為何如此設計,和算法的思路。插件作者的博客地址

這里引用插件作者的文檔:

想象以下你想用你的鍵盤寫一些東西。當你按動按鍵,你主要用手指,而你的手臂和肘部很少移動。這體現了生物力學中的基本規則:如果你可以使用小肌肉干某事,你不會去使用大肌肉。使用更大的肌肉意味着消耗更多的能量,非必要的時候盡可能避免這么做。

現在想象你的正前方有一幅畫。你可以僅移動你的雙眼看它而不移動頭部。現在把畫朝你的左側移動幾厘米。你任然可以用你的雙眼看到然而你感到你的眼部肌肉正在拉扯並感覺疲勞了。繼續把畫朝左移動,繼續試着看畫,你感到你不能只用雙眼了因為你的雙眼肌肉已完全緊綳,但是畫任然超出了眼睛的范圍,所以你需要使用脖子和頭部去看畫。繼續這么做讓畫原理你,甚至是朝着你的背部移動。你會觀察到你的頭和頸部的關節和肌肉都已完全緊綳。你需要轉動脊椎和胸椎去看目標。

以下是2種lookat ik的效果對比

0x1 保留動畫

為什么用了lookat動畫感覺怪怪的?一般我們在LateUpdate中實現IK的計算過程,這會導致Animation的動畫被覆蓋掉。試想以下一個帶有點頭動畫的Lookat,經過IK算法的調整,動畫的rotation被覆蓋,講導致點頭動畫丟失。
因此在Lookat計算完后,還需要把原先的點頭動畫給疊加回去。

讓我們來看下GDC中DOOM的動圖,怪物帶有很誇張的腰部轉動動作,如果腰部被IK控制而不把原先的動畫疊加回去,怪物將不會彎腰:

下面的動圖是根據GDC的方案的復刻,動畫循環按照 無ik的原版動畫->不保留動作的IK->保留動作的IK循環播放。可以看到,如果不把原先的動畫疊加回去,動畫的仰頭和后仰的旋轉動畫被覆蓋,導致人物動作僵直。

0x2 功能對比

todo

0x3 Unity內置的Animator.SetLookAtPosition注意事項

官方文檔鏈接

todo


免責聲明!

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



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