Unity動畫系統詳解8:IK是什麼?

2021-02-13 洪流學堂

洪流學堂,讓你快人幾步。你好,我是跟著大智學Unity的萌新,我叫小新,這幾周一起來復(yu)習(xi)動畫系統。

「大智,昨天你說要給我講講IK,趁現在有空,你給我講講唄」

「IK你已經明白是什麼意思了吧?」

IK是Inverse Kinematic的縮寫,也就是反向動力學。是根據骨骼的終節點來推算其他父節點的位置的一種方法。比如通過手的位置推算手腕、胳膊肘的骨骼的位置。

「沒錯,那你能想到一些適用的場景麼?」

「嗯。。。我想想:比如角色需要拿各種不同的東西,讓角色的手能符合各種不同的東西的握持位置,這樣就不用針對每種不同的東西單獨製作動畫了!

「非常棒!這是IK最常見的一種用途。其他的用途其實還有比如:角色的頭的旋轉,這樣可以和你視角的方向一致。角色的腳的位置,這樣可以讓角色踩在地面更貼合。

「對對對,我只想到手了。那還有其他的麼?」

Unity中IK能設置的部位就是5個,分別是:頭、左右手、左右腳。所以沒有其他部位的IK了,我們常見的其實也都是這些。」

設置IK

小新:「那具體如何用呢?」
大智:「那我就用實例來給你演示下IK是如何使用的」

頭部IK

小新和大智來到了大智的工作檯前。
大智:「我們先來看看如何設置人物的頭部根據視角旋轉。需要用到這兩個API:Animator.SetLookAtPosition和Animator.SetLookAtWeight,對應的方法為:」

public void SetLookAtPosition(Vector3 lookAtPosition);

「這個方法用來設置頭部看向的位置,比如看向你左邊的窗戶,頭就會相應的旋轉。」
「這個看起來很簡單嘛。」
「對,這個方法確實很簡單,不過還有另外一個:」

public void SetLookAtWeight(float weight, float bodyWeight = 0.0f, float headWeight = 1.0f, float eyesWeight = 0.0f, float clampWeight = 0.5f);

「這個方法用來設置IK的權重,這個IK會和原來的動畫進行混合。如果權重為1,則完全用IK的位置旋轉;如果權重為0,則完全用原來動畫中的位置和旋轉。至少要設置第一個參數,後面的幾個參數都有默認值,但是你也要了解所有參數的含義:」

Weight 全局權重,後面所有參數的係數

bodyWeight 身體權重,身體參與LookAt的程度,一般是0

headWeight 頭部權重,頭部參與LookAt的權重,一般是1

eyesWeight 眼睛權重,眼睛參與LookAt的權重,一般是0(一般沒有眼睛部分的骨骼)

clampWeight 權重的限制。0代表沒有限制(脖子可能看起來和斷了一樣),1代表完全限制(頭幾乎不會動,像是固定住了)。0.5代表可能範圍的一半(180度)。

大智:「有了這兩個方法你就可以實現頭部的IK了,不過還有兩點需要注意:」

1、需要勾選對應Layer的IK Pass選項(在Layer的設置裡)。
2、代碼需要寫在OnAnimatorIK這個事件方法裡面。

void OnAnimatorIK(int layerIndex)
{
    _animator.SetLookAtPosition(pos);
    _animator.SetLookAtWeight(1);
}

上面的代碼就是人物的頭部看向一個位置的代碼。需要注意的是這個OnAnimatorIK方法有一個參數layerIndex,這個就是對應的Layer的序號,只有勾選了IK Pass的layer才會調用到這個方法裡,每個勾選了IK Pass的layer調用一次。

小新:「這樣我就能實現人物的頭跟著視角移動了,哦也」
大智:「是的哦」

手腳IK

小新:「那手腳的IK是不是也跟這個類似的?」
大智:「是的,手腳的IK是和這個類似的,不過API有些不一樣,我們來看看」

public void SetIKPosition(AvatarIKGoal goal, Vector3 goalPosition);
public void SetIKRotation(AvatarIKGoal goal, Quaternion goalRotation);

設置頭部時,因為頭不會移動,所以只需要設置LookAt的位置,頭部跟隨旋轉即可。
但是對於手和腳,需要同時設置位置和旋轉。

goal AvatarIKGoal枚舉類型,包含:

LeftFoot    左腳

RightFoot    右腳

LeftHand    左手

RightHand 右手

goalPosition/goalRotation IK目標位置/旋轉

同樣還有設置權重的API:

public void SetIKPositionWeight(AvatarIKGoal goal, float value);
public void SetIKRotationWeight(AvatarIKGoal goal, float value);

goal AvatarIKGoal枚舉類型
value IK的權重,1代表完全使用IK值,0代表使用原動畫的值

常見的設置手部IK的代碼是(一般需要4行代碼設置一個部位):

void OnAnimatorIK(int layerIndex)
{
    _animator.SetIKPosition(AvatarIKGoal.LeftHand, position);
    _animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);

    _animator.SetIKRotation(AvatarIKGoal.LeftHand, rotation);
    _animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);
}

小新:「謝謝智哥,這樣我就明白很多了。我要去改造一下我的人物角色的頭部方向和握槍!」
說著小新就跑回了自己的房間。

IK位置/旋轉調節小技巧

小新:「大智,這個IK的位置好難調整啊,我想讓角色拿槍的手能夠貼合這個槍,有沒有什麼簡單的辦法?我這調了一個多小時了,還不是特別完美。。。」
大智:「調IK是個慢活,不過呢,確實有一些小技巧在裡面。IK相關的代碼涉及到位置和旋轉,這時候不要傻傻的直接定義一個位置和旋轉來手動設置,最好的辦法是設置兩個參照物,作為IK的位置和旋轉的參考,這樣只需要調這兩個參照物就可以了。」
小新:「對對對,這樣的話就不用去修改位置和旋轉的值,而是直接修改這倆參照物的位置和旋轉就可以了。我來試一下。」

運行時調整IK的參考位置.gif

小新:「太棒了,這樣我就能在運行時調整這個參考位置,調到一個完美的位置和角度。」

小新三下五除二,就調到了一個合適的位置和角度。

「調好了!」小新高興地喊道,隨即退出了Play狀態。

大智:「高興早了吧?你這麼就退出來了,修改的能保存下來麼?」

小新:「啊。。。我給忘了,那這怎麼辦,運行時的修改保存不下來啊。。。」

大智:「快想想,我之前教過你一個小技巧,可以保存運行時的數據,不能這麼快就給忘了吧?」

小新:「我有印象你教過我,不過這麼久一直沒實際用到過,哪能記得清啊」

大智:「那我再教你一遍,這次可得記好了。」

小新:「一定一定,再忘了我就……我就……再問你一遍,哈哈哈哈」

大智:「皮一下很開心?記好了,點擊Transform組件右上角的小圖標,可以Copy Component,在運行時點擊,退出運行後,再點擊小圖標,選擇Paste Component Values,這樣就可以將數據粘貼回來了。」

Play模式下修改了位置

小新:「哦~~我回憶起來了,這次絕對不會再忘記了」

總結

小新:「有了IK,人物就能更符合遊戲的需要了,而且可以根據不同的情形動態調整,人物就不會那麼呆呆的了。」
「看來小新對IK的理解還是挺深的。」

今日思考題

大智:「給你布置個作業,去用IK把你人物的視角以及拿槍的手部位置實現一下吧」
「收到!我去也!」
「收穫別忘了分享出來!也別忘了分享給你學Unity的朋友,也許能夠幫到他。」

擴展閱讀

【擴展學習】洪流學堂公眾號回復動畫可以閱讀本系列所有文章,更有視頻教程等著你!

呼~ 今天小新絮絮叨叨的真是夠夠的了。沒講清楚的地方歡迎評論,咱們一起探索。

我是大智(微信:zhz11235),你的技術探路者,下次見!

別走!點讚收藏哦!

好,你可以走了。

掃描識別上圖二維碼查看課程詳細內容

《大話Unity | 動畫系統詳解》包含在《大話Unity》系列專欄中。《大話Unity》系列專欄,包含數十個專題(包括ShaderGraph、Addressable等最新Unity技術)。

《大話Unity》直達連結:https://edu.hongliu.cc

相關焦點

  • Unity動畫系統詳解10:子狀態機是什麼?
    你好,我是跟著大智學Unity的萌新,我叫小新,這是復(yu)習(xi)動畫系統的最後一節。小新:「大智,除了使用Layer還有沒有更好的組織狀態的方式呢?感覺一個Layer裡面狀態多的時候,還是很顯得很亂」大智:「可以嘗試使用Sub-State Machines,也就是子狀態機,可以將一些狀態放到子狀態機裡。我把連結發給你,你先去看看。」
  • Unity動畫系統詳解9:Target Matching是什麼?
    你好,我是跟著大智學Unity的萌新,我叫小新,這幾周一起來復(yu)習(xi)動畫系統。小新:「大智,我有一個需求,感覺可以用IK去實現,但是使用IK會有問題,我就不知道怎麼辦了。」大智:「具體是什麼需求呢?」小新:「絕地求生裡面人物可以雙手撐牆跳過一個堵牆或者窗戶,我想讓角色的雙手能恰好放到牆上,這個應該怎麼做呢?」
  • Unity動畫系統詳解5:BlendTree混合樹是什麼?
    你好,我是跟著大智學Unity的萌新,我叫小新,這幾周一起來復(yu)習(xi)動畫系統。「智哥,我用Animator做了一個人物移動的狀態機,怎麼看怎麼不順眼,這也太複雜了,你來看看?」**Adjust Time Scale > Homogeneous Speed ** 可以將動畫的速度調整對應到參數的最小值和最大值,但是保持動畫的初始相對速度。這句話看得我欲生欲死,得問問大智是什麼意思按鈕可以將動畫的播放速度調整到動畫列表中所有動畫速度的平均值。Mirroring 鏡像
  • Unity動畫系統詳解6:如何做好角色的移動動畫?(Root Motion詳解)
    你好,我是跟著大智學Unity的萌新,我叫小新,這幾周一起來復(yu)習(xi)動畫系統。「智哥,自從用了混合樹來做人物移動,腰不酸腿不疼,思路更清晰了,一口氣能寫12小時代碼!」「喲,療效這麼好,我看你應該再碼12個小時」「那也沒問題,你來看看我做的這個人物的混合樹是不是棒極了」小新信心滿滿地打開混合樹,給大智看。
  • 在綁定之中,你應該知道的一種綁定技術,IK的線性綁定秘密
    首先,我們先要搞明白什麼是ik,在我們進行骨骼的綁定之中,ik這個東西應該經常聽到,他對我們不僅僅擁有的是一個點性控制的基礎,而且ik在骨骼的搭建裡邊,是可以進行方向性操控的,也就是說,在我們進行很多人體關節處的時候,ik都是非常有用的存在,甚至在很多時候我們都可以用他進行點的操控。
  • 微信名中的ik是什麼意思?
    微信名ik就是喜歡的意思,一般情侶之間,或是有自己喜歡的愛豆,都喜歡在自己的微信名字裡加上ik。如果微信名字裡面有ik,ik後面是誰就是他/她喜歡的人的名字或名字字母簡寫。一般情況下,ik前面是自己名字或者字母簡寫,ik後面是喜歡的人的名字,比如自己名字的首字母+ik+喜歡的人的名字最後一個字母,這樣的網名寓意就是說,自己喜歡這個人,要從頭愛到尾。比如我姓張,一直追的愛豆是蔡徐坤,那我可以起個網名:zikkk,意思就是張一直愛坤坤。
  • 微信名ik什麼意思
    而修改之後,很多用戶的微信號裡面,都有「ik」的字樣。那麼,微信名裡面帶有「ik」,究竟是什麼樣子呢?實際上,這是一種婉約的命名方法。「ik」,實際上是「i like you」的縮寫,意思就是喜歡。所以,微信名裡面有ik,無論是微信號還是微信的名稱,基本都是喜歡某個人的意思。
  • [專欄精選]Unity剛體詳解
    小新找到了自己的師兄大智,這位師兄有8年Unity開發經驗,想向師兄請教一下學習的方向。沒想到師兄特別熱情,是一個技術布道者,喜歡研究傳播技術,從此小新跟著大智開啟了他的Unity學習之旅。大智告訴小新,叫我「大智」就好了,以後不要叫師兄了哈。Rigidbody 剛體「大智,昨天我學習了物理系統,知道了碰撞體,那物理系統裡面還有別的東西麼?」
  • 新手如何從零開始學習unity
    (一)  首先unity的腳本可以用很多語言來寫,比如java,js,c#,用C#,很多人說自己沒有C#的基礎,其實自己自學也能夠學會,在unity中學會簡單的遊戲邏輯開發,其實不需要太多的C#知識,unity用的VS編輯器其實是在C#裡面調用unity的API,因為它在創建腳本的時候引入了一個 unityEngine的空間,這個空間就是unity的 C# API,那麼新手只需要去學習
  • 微信名ik什麼意思?看我來給你解答
    說到微信名ik,熟悉的朋友肯定會知道,不過仍有一大部分人不知道ik是什麼意思?ik就是英文I like 的縮寫,翻譯過來就是我喜歡。現在網絡詞彙非常多,很多人也喜歡這種方式來表達自己的想法,自己的主張、自己的見解、更多是自己的個性。
  • UGUI整體解決方案-基礎篇(Unity 2019)
    課程介紹:本課程是UGUI系列課程的第一篇:基礎篇主要是講解UGUI的基礎組件及接口的使用方法,目前UGUI是unity
  • 使用unity製作RPG遊戲3——2D精靈
    ,在根目錄下打開可執行文件進入unity。此時自動創建了一個遊戲物體,其有一個Sprite Renderer組件用來顯示人物,還有一個Animator組件,用來控制動畫依次製作動畫。0到8是背面(Stop_down)9到17是左面(Stop_left)18到26是前面(Stop_up)27到35是右面(Stop_right)選中前面的動畫,重命名player
  • 3D場景編輯導出-LayaAir引擎Unity插件使用詳解
    signup=true國際下載地址:https://unity3d.com/get-unity/download/archive需要登陸,再找到對應的歷史版本(國內打開國際地址需要翻牆)2.2 、下載LayaAir的unity插件2.2.1 下載地址LayaAir引擎unity插件下載地址:https://ldc2.layabox.com/layadownload
  • ElasticSearch-hard插件及IK分詞器安裝
    我們先來看看使用插件後的效果:ElasticSearch-head是什麼?ElasticSearch-head:是集群管理、數據可視化、增刪改查、查詢語句可視化工具。那麼怎麼安裝呢?操作步驟如下圖:IK分詞器安裝:我們先來看看什麼式分詞?為什麼需要使用分詞器?
  • Lucene集成IK Analyzer中文分詞器
    IK Analyzer 2012特性:1.採用了特有的「正向迭代最細粒度切分算法「,支持細粒度和智能分詞兩種切分模式;2.在系統環境:Core2 i7 3.4G雙核,4G內存,window 7 64位, Sun JDK
  • unity什麼意思
    unity什麼意思unity,聯合、統一、團結、和睦。學單詞,只記住意思可不行,會用才行,小夥伴們可以在評論區造句,我們一起學習哦!我先來:造句:Unity is strength.elasticity什麼意思
  • Unity PBR Standard Shader 實現詳解 (三)
    話不多說,接下來點讚上車1.LightingStandard_GI函數看看這個函數長什麼樣子inline void LightingStandard_GI (SurfaceOutputStandard, data.lightmapUV.xy); half3 bakedColor = DecodeLightmap(bakedColorTex); #ifdef DIRLIGHTMAP_COMBINED fixed4 bakedDirTex = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd,
  • 博主營地 | Unity3D 實用技巧 - 理論知識庫(一)
    如果支持的話需要注意什麼? 僅能從主線程中訪問Unity3D的組件,對象和Unity3D系統調用支持;如果同時你要處理很多事情或者與Unity的對象互動小可以用thread,否則使用coroutine。
  • Unity漸進式光照貼圖烘焙詳解|unity
    如果本文中遺漏了什麼問題,大家可以在留言區留言,我們可以下次通過文章或者B站視頻(B站搜索「Unity官方」)的方式集中回答。什麼是光照貼圖(Lightmap)?為什麼要用光照貼圖?場景中的光照信息大致可以分成兩類:直接光照和間接光照。
  • 動畫16級《數字交互基礎》課程作業展示
    《數字交互基礎》將藝術與技術深度融合,培養學生數字互動設計能力,課程學習難度大。創作說明:一直以來,我都很喜歡密室逃脫類的遊戲,這次的作業也是圓了我的一個夢想,自己親手做出了它。ptag=qqbrowser 動畫1602班   楊帆作品簡介:利用unity軟體與腳本實現交互功能。首先我們需要了解Unity3D的菜單,視圖界面。這些是基礎中的基礎,可以像學word操作一樣,大致能明白有幾個菜單,幾個基本的視圖,各自起什麼作用就可以了。理解場景裡面的坐標系統,輸入系統,簡單的向量概念。