Unity動(dòng)畫系統(tǒng)詳解8:IK是什么闯袒?

摘要:IK是Inverse Kinematic的縮寫,也就是反向動(dòng)力學(xué)仿粹。是根據(jù)骨骼的終節(jié)點(diǎn)來(lái)推算其他父節(jié)點(diǎn)的位置的一種方法搁吓。比如通過手的位置推算手腕、胳膊肘的骨骼的位置吭历。

大話Unity,讓你快人幾步擂橘。你好晌区,我是跟著大智學(xué)Unity的萌新,我叫小新,這幾周一起來(lái)復(fù)(yu)習(xí)(xi)動(dòng)畫系統(tǒng)朗若。

“大智恼五,昨天你說要給我講講IK,趁現(xiàn)在有空哭懈,你給我講講唄”

“IK你已經(jīng)明白是什么意思了吧灾馒?”

IK是Inverse Kinematic的縮寫,也就是反向動(dòng)力學(xué)遣总。是根據(jù)骨骼的終節(jié)點(diǎn)來(lái)推算其他父節(jié)點(diǎn)的位置的一種方法睬罗。比如通過手的位置推算手腕、胳膊肘的骨骼的位置旭斥。

“沒錯(cuò)容达,那你能想到一些適用的場(chǎng)景么?”

“嗯垂券。花盐。。我想想:比如角色需要拿各種不同的東西菇爪,讓角色的手能符合各種不同的東西的握持位置算芯,這樣就不用針對(duì)每種不同的東西單獨(dú)制作動(dòng)畫了!

“非常棒凳宙!這是IK最常見的一種用途也祠。其他的用途其實(shí)還有比如:角色的頭的旋轉(zhuǎn),這樣可以和你視角的方向一致近速。角色的腳的位置诈嘿,這樣可以讓角色踩在地面跟貼合。

“對(duì)對(duì)對(duì)削葱,我只想到手了奖亚。那還有其他的么?”

Unity中IK能設(shè)置的部位就是5個(gè)析砸,分別是:頭昔字、左右手、左右腳首繁。所以沒有其他部位的IK了作郭,我們常見的其實(shí)也都是這些∠掖”

設(shè)置IK

小新:“那具體如何用呢夹攒?”
大智:“那我就用實(shí)例來(lái)給你演示下IK是如何使用的”

頭部IK

小新和大智來(lái)到了大智的工作臺(tái)前。
大智:“我們先來(lái)看看如何設(shè)置人物的頭部根據(jù)視角旋轉(zhuǎn)胁塞。需要用到這兩個(gè)API:Animator.SetLookAtPosition和Animator.SetLookAtWeight咏尝,對(duì)應(yīng)的方法為:”

public void SetLookAtPosition(Vector3 lookAtPosition);

“這個(gè)方法用來(lái)設(shè)置頭部看向的位置压语,比如看向你左邊的窗戶,頭就會(huì)相應(yīng)的旋轉(zhuǎn)编检√ナ常”
“這個(gè)看起來(lái)很簡(jiǎn)單嘛≡识”
“對(duì)厕怜,這個(gè)方法確實(shí)很簡(jiǎn)單,不過還有另外一個(gè):”

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

“這個(gè)方法用來(lái)設(shè)置IK的權(quán)重蕾总,這個(gè)IK會(huì)和原來(lái)的動(dòng)畫進(jìn)行混合粥航。如果權(quán)重為1,則完全用IK的位置旋轉(zhuǎn)谤专;如果權(quán)重為0躁锡,則完全用原來(lái)動(dòng)畫中的位置和旋轉(zhuǎn)。至少要設(shè)置第一個(gè)參數(shù)置侍,后面的幾個(gè)參數(shù)都有默認(rèn)值映之,但是你也要了解所有參數(shù)的含義:”

  • Weight 全局權(quán)重,后面所有參數(shù)的系數(shù)
  • bodyWeight 身體權(quán)重蜡坊,身體參與LookAt的程度杠输,一般是0
  • headWeight 頭部權(quán)重,頭部參與LookAt的權(quán)重秕衙,一般是1
  • eyesWeight 眼睛權(quán)重蠢甲,眼睛參與LookAt的權(quán)重,一般是0(一般沒有眼睛部分的骨骼)
  • clampWeight 權(quán)重的限制据忘。0代表沒有限制(脖子可能看起來(lái)和斷了一樣)鹦牛,1代表完全限制(頭幾乎不會(huì)動(dòng),像是固定住了)勇吊。0.5代表可能范圍的一半(180度)曼追。

大智:“有了這兩個(gè)方法你就可以實(shí)現(xiàn)頭部的IK了,不過還有兩點(diǎn)需要注意:”

1汉规、需要勾選對(duì)應(yīng)Layer的IK Pass選項(xiàng)(在Layer的設(shè)置里)礼殊。
2、代碼需要寫在OnAnimatorIK這個(gè)事件方法里面针史。

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

上面的代碼就是人物的頭部看向一個(gè)位置的代碼晶伦。需要注意的是這個(gè)OnAnimatorIK方法有一個(gè)參數(shù)layerIndex,這個(gè)就是對(duì)應(yīng)的Layer的序號(hào)啄枕,只有勾選了IK Pass的layer才會(huì)調(diào)用到這個(gè)方法里婚陪,每個(gè)勾選了IK Pass的layer調(diào)用一次。

小新:“這樣我就能實(shí)現(xiàn)人物的頭跟著視角移動(dòng)了射亏,哦也”
大智:“是的哦”

手腳IK

小新:“那手腳的IK是不是也跟這個(gè)類似的近忙?”
大智:“是的竭业,手腳的IK是和這個(gè)類似的智润,不過API有些不一樣及舍,我們來(lái)看看”

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

設(shè)置頭部時(shí),因?yàn)轭^不會(huì)移動(dòng)窟绷,所以只需要設(shè)置LookAt的位置锯玛,頭部跟隨旋轉(zhuǎn)即可。
但是對(duì)于手和腳兼蜈,需要同時(shí)設(shè)置位置和旋轉(zhuǎn)攘残。

goal AvatarIKGoal枚舉類型,包含:

  • LeftFoot 左腳
  • RightFoot 右腳
  • LeftHand 左手
  • RightHand 右手

goalPosition/goalRotation IK目標(biāo)位置/旋轉(zhuǎn)

同樣還有設(shè)置權(quán)重的API:

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

goal AvatarIKGoal枚舉類型
value IK的權(quán)重为狸,1代表完全使用IK值歼郭,0代表使用原動(dòng)畫的值

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

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位置/旋轉(zhuǎn)調(diào)節(jié)小技巧

小新:“大智漾根,這個(gè)IK的位置好難調(diào)整啊泰涂,我想讓角色拿槍的手能夠貼合這個(gè)槍,有沒有什么簡(jiǎn)單的辦法辐怕?我這調(diào)了一個(gè)多小時(shí)了逼蒙,還不是特別完美。寄疏。是牢。”
大智:“調(diào)IK是個(gè)慢活陕截,不過呢驳棱,確實(shí)有一些小技巧在里面。IK相關(guān)的代碼涉及到位置和旋轉(zhuǎn)艘策,這時(shí)候不要傻傻的直接定義一個(gè)位置和旋轉(zhuǎn)來(lái)手動(dòng)設(shè)置蹈胡,最好的辦法是設(shè)置兩個(gè)參照物,作為IK的位置和旋轉(zhuǎn)的參考朋蔫,這樣只需要調(diào)這兩個(gè)參照物就可以了罚渐。”
小新:“對(duì)對(duì)對(duì)驯妄,這樣的話就不用去修改位置和旋轉(zhuǎn)的值荷并,而是直接修改這倆參照物的位置和旋轉(zhuǎn)就可以了。我來(lái)試一下青扔≡粗”

運(yùn)行時(shí)調(diào)整IK的參考位置.gif

小新:“太棒了翩伪,這樣我就能在運(yùn)行時(shí)調(diào)整這個(gè)參考位置,調(diào)到一個(gè)完美的位置和角度谈息≡狄伲”

小新三下五除二,就調(diào)到了一個(gè)合適的位置和角度侠仇。

“調(diào)好了轻姿!”小新高興地喊道,隨即退出了Play狀態(tài)逻炊。

大智:“高興早了吧互亮?你這么就退出來(lái)了,修改的能保存下來(lái)么余素?”

小新:“啊豹休。。桨吊。我給忘了威根,那這怎么辦,運(yùn)行時(shí)的修改保存不下來(lái)啊屏积。医窿。〈读郑”

大智:“快想想姥卢,我之前教過你一個(gè)小技巧,可以保存運(yùn)行時(shí)的數(shù)據(jù)渣聚,不能這么快就給忘了吧独榴?”

小新:“我有印象你教過我,不過這么久一直沒實(shí)際用到過奕枝,哪能記得清啊”

大智:“那我再教你一遍棺榔,這次可得記好了“溃”

小新:“一定一定症歇,再忘了我就……我就……再問你一遍,哈哈哈哈”

大智:“皮一下很開心谭梗?記好了忘晤,點(diǎn)擊Transform組件右上角的小圖標(biāo),可以Copy Component激捏,在運(yùn)行時(shí)點(diǎn)擊设塔,退出運(yùn)行后,再點(diǎn)擊小圖標(biāo)远舅,選擇Paste Component Values闰蛔,這樣就可以將數(shù)據(jù)粘貼回來(lái)了痕钢。”

Play模式下修改了位置
  • 在Inspector的Transform的右上角序六,點(diǎn)擊齒輪小圖標(biāo)任连,選擇Copy Component Values
  • 退出Play模式
  • 在Inspector的Transform的右上角,點(diǎn)擊齒輪小圖標(biāo)难咕,選擇Paste Component Values

小新:“哦~~我回憶起來(lái)了课梳,這次絕對(duì)不會(huì)再忘記了”

總結(jié)

小新:“有了IK距辆,人物就能更符合游戲的需要了余佃,而且可以根據(jù)不同的情形動(dòng)態(tài)調(diào)整,人物就不會(huì)那么呆呆的了跨算”粒”
“看來(lái)小新對(duì)IK的理解還是挺深的≈畈希”

今日思考題

大智:“給你布置個(gè)作業(yè)步势,去用IK把你人物的視角以及拿槍的手部位置實(shí)現(xiàn)一下吧”
“收到!我去也背犯!”
“收獲別忘了分享出來(lái)坏瘩!也別忘了分享給你學(xué)Unity的朋友,也許能夠幫到他漠魏【蠓”

擴(kuò)展閱讀

Unity6動(dòng)畫系統(tǒng)詳解【合集】


呼~ 今天小新絮絮叨叨的真是夠夠的了。沒講清楚的地方歡迎評(píng)論柱锹,咱們一起探索哪自。

我是大智,你的技術(shù)探路者禁熏,下次見壤巷!

別走!點(diǎn)贊瞧毙,收藏哦胧华!

好,你可以走了宙彪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末矩动,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子您访,更是在濱河造成了極大的恐慌铅忿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灵汪,死亡現(xiàn)場(chǎng)離奇詭異檀训,居然都是意外死亡柑潦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門峻凫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)渗鬼,“玉大人,你說我怎么就攤上這事荧琼∑┨ィ” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵命锄,是天一觀的道長(zhǎng)堰乔。 經(jīng)常有香客問我,道長(zhǎng)脐恩,這世上最難降的妖魔是什么镐侯? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮驶冒,結(jié)果婚禮上苟翻,老公的妹妹穿的比我還像新娘。我一直安慰自己骗污,他們只是感情好崇猫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著需忿,像睡著了一般诅炉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贴谎,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天汞扎,我揣著相機(jī)與錄音,去河邊找鬼擅这。 笑死澈魄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仲翎。 我是一名探鬼主播痹扇,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼溯香!你這毒婦竟也來(lái)了鲫构?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤玫坛,失蹤者是張志新(化名)和其女友劉穎结笨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炕吸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年伐憾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赫模。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡树肃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瀑罗,到底是詐尸還是另有隱情蛮寂,我是刑警寧澤米母,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布络断,位于F島的核電站尖啡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏停忿。R本人自食惡果不足惜驾讲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望席赂。 院中可真熱鬧,春花似錦时迫、人聲如沸颅停。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)癞揉。三九已至,卻和暖如春溺欧,著一層夾襖步出監(jiān)牢的瞬間喊熟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工姐刁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芥牌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓聂使,卻偏偏與公主長(zhǎng)得像壁拉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柏靶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容