譯者:劉超(君臨天下)
審校:梁君(君兒)

你可能聽(tīng)說(shuō)過(guò)逆向運(yùn)動(dòng)學(xué)(Inverse Kinematics, IK)。IK是Unity以及計(jì)算機(jī)圖形學(xué)中的一個(gè)十分流行的工具。但是如果這是你第一次嘗試創(chuàng)建或者使用逆向運(yùn)動(dòng)學(xué)系統(tǒng),那么你可能想要了解更多的細(xì)節(jié)。在本文,我將會(huì)解釋IK是什么,對(duì)它進(jìn)行定義并對(duì)它的使用方法進(jìn)行介紹。

有哪些在理解IK方面必須要掌握的詞匯?

在我們開(kāi)始真正了解IK的核心之前,我們需要定義一些與IK相關(guān)的詞匯。IK是一種應(yīng)用于鉸鏈連接體(Articulated Body)的方法。那么什么是鉸鏈連接體呢?

鉸鏈連接體(Articulated Body)

一個(gè)鉸鏈連接體能夠表達(dá)大多數(shù)的可以運(yùn)動(dòng)的物體,例如人類或者動(dòng)物的骨骼。簡(jiǎn)而言之,一個(gè)鉸鏈連接體是一個(gè)由許多連在一起的鉸鏈組成的樹(shù)。這些連接的鉸鏈由運(yùn)動(dòng)副和構(gòu)件組成,其中每一個(gè)構(gòu)件都是一個(gè)圓柱形的剛體。圖1展示了一個(gè)使用鉸鏈連接體表達(dá)的骨骼。

164743tuc799p8z1ozant8.jpg 骨骼鉸鏈連接體
盡管封面圖上一個(gè)簡(jiǎn)單的玩具代表了一個(gè)鉸鏈連接體。但是它缺少了肘關(guān)節(jié)和膝關(guān)節(jié)。

運(yùn)動(dòng)副的類型

對(duì)于運(yùn)動(dòng)副,包含兩種類型。第一種類型的運(yùn)動(dòng)副是旋轉(zhuǎn)副。它連接到一個(gè)可以旋轉(zhuǎn)的關(guān)節(jié)上。如圖2所示展示了一個(gè)旋轉(zhuǎn)副。

164744ept84etk64v4wb6m.jpg 旋轉(zhuǎn)副
旋轉(zhuǎn)副非常類似于時(shí)鐘的表心——以時(shí)鐘的指針作為關(guān)節(jié)。

164744o08pi0mp90fffdp5.jpg 時(shí)鐘金色的表心是一個(gè)旋轉(zhuǎn)副.
移動(dòng)副是一種可以延伸或者縮短被連接的關(guān)節(jié)的運(yùn)動(dòng)副. 如圖3所示展示了一個(gè)移動(dòng)副。

164744tn9q3mewnnepefq4.jpg 移動(dòng)副
移動(dòng)副的運(yùn)動(dòng)更像是你的行李箱上的可以伸縮的拉桿。如果你仔細(xì)的觀察,可伸縮的行李箱拉桿有4個(gè)移動(dòng)副。其中有2個(gè)移動(dòng)副有一半位于拉桿的下方,另外2個(gè)移動(dòng)副的所有的部分位于行李箱頂部的拉桿之上。

164744z6ytyadnmmgdanni.jpg 紅色的四個(gè)箭頭表示出了行李箱拉桿上的四個(gè)移動(dòng)副
如果你對(duì)移動(dòng)副的理解有一些迷惑,請(qǐng)不要擔(dān)心。它們?cè)谀嫦蜻\(yùn)動(dòng)學(xué)中并不經(jīng)常使用到,正如你可能會(huì)說(shuō)到的那樣,沒(méi)有一個(gè)人的構(gòu)成具有移動(dòng)副——他們僅包含旋轉(zhuǎn)副。

層次結(jié)構(gòu)


164745arc0odfro7rkcdff.jpg
對(duì)于每一個(gè)鉸鏈連接體都有一個(gè)根部運(yùn)動(dòng)副(root joint)。該根部運(yùn)動(dòng)副是整個(gè)結(jié)構(gòu)的基礎(chǔ)。對(duì)于形狀來(lái)講,根部運(yùn)動(dòng)副通常位于臀部的中心。鉸鏈連接體是由一個(gè)運(yùn)動(dòng)副關(guān)節(jié)樹(shù)來(lái)構(gòu)成的,一般從根部運(yùn)動(dòng)副開(kāi)始。每一個(gè)新的運(yùn)動(dòng)副或者新的關(guān)節(jié)類似于樹(shù)上的一個(gè)新的分支。一個(gè)內(nèi)部關(guān)節(jié)/運(yùn)動(dòng)副是指的在該鉸鏈連接體的樹(shù)狀結(jié)構(gòu)中更靠近根部運(yùn)動(dòng)副的那些關(guān)節(jié)/運(yùn)動(dòng)副,由于它和給定的關(guān)節(jié)/運(yùn)動(dòng)副更加關(guān)系密切。一個(gè)外部關(guān)節(jié)/運(yùn)動(dòng)副是指的在該鉸鏈連接體的樹(shù)狀結(jié)構(gòu)中遠(yuǎn)離根部運(yùn)動(dòng)副的那些關(guān)節(jié)/運(yùn)動(dòng)副。在圖4中,運(yùn)動(dòng)副A是根部運(yùn)動(dòng)副,關(guān)節(jié)1是運(yùn)動(dòng)副B的內(nèi)部關(guān)節(jié),而關(guān)節(jié)2是運(yùn)動(dòng)副B的外部關(guān)節(jié)。

末端執(zhí)行器

末端執(zhí)行器位于最外側(cè)的關(guān)節(jié)的最外側(cè)的位置。它是交替連接的運(yùn)動(dòng)副和關(guān)節(jié)中能夠自由移動(dòng)的終端。然而,末端執(zhí)行器并非是一個(gè)運(yùn)動(dòng)副。末端執(zhí)行器僅僅是一個(gè)位于鉸鏈連接體的末端的東西。一個(gè)鉸鏈連接體可以有多個(gè)末端執(zhí)行器,就像是一個(gè)二叉樹(shù)可以有很多個(gè)葉子節(jié)點(diǎn)一樣。

164745uvwn50e0vw8rra7z.jpg 圖中綠色部分表示一個(gè)末端執(zhí)行器

銜接和位置(Articulationsand Poses)

銜接指的是移動(dòng)一個(gè)互相連接的關(guān)節(jié)來(lái)實(shí)現(xiàn)運(yùn)動(dòng)副的旋轉(zhuǎn)或者平移。例如,在圖5中,運(yùn)動(dòng)副A是一個(gè)角度為45°的銜接,運(yùn)動(dòng)副B是一個(gè)角度為15°的銜接,運(yùn)動(dòng)副C是一個(gè)角度為-60°的銜接。另一方面,位置是一些運(yùn)動(dòng)副銜接的組合用來(lái)定位鉸鏈連接體。換句話說(shuō),位置是一個(gè)向量而不是一個(gè)標(biāo)量。例如,在圖4中,該鉸鏈連接體的位置是<45°,15°,-60°>。

164745c2leqotkzwo6w1l0.jpg A作為根部運(yùn)動(dòng)副的鉸鏈連接體
什么是前向運(yùn)動(dòng)學(xué)?

在我們開(kāi)始進(jìn)行逆向運(yùn)動(dòng)學(xué)的學(xué)習(xí)之前,我們首先需要弄清楚什么是前向運(yùn)動(dòng)學(xué)。前向運(yùn)動(dòng)學(xué)的函數(shù)/算法是將關(guān)節(jié)的位置作為輸入,來(lái)計(jì)算末端執(zhí)行器的位置作為輸出。前向運(yùn)動(dòng)學(xué)是逆向運(yùn)動(dòng)學(xué)的反函數(shù)。使用前向運(yùn)動(dòng)學(xué),你需要定義鉸鏈連接體的所有的整體姿態(tài)作為輸入用于提供給函數(shù)/算法。這意味著,你需要定義鉸鏈連接體上的每一個(gè)運(yùn)動(dòng)副的銜接關(guān)系。如果運(yùn)動(dòng)副數(shù)量較少,這可能是沒(méi)有問(wèn)題的,但是當(dāng)運(yùn)動(dòng)副的數(shù)目變多時(shí),這往往變得非常乏味。

什么是逆向運(yùn)動(dòng)學(xué)?

現(xiàn)在,假想一下如果你想要你的鉸鏈連接體的末端執(zhí)行器到達(dá)一個(gè)指定的目標(biāo)位置。這意味著你要知道你要到達(dá)的目標(biāo)的末端執(zhí)行器的位置,但是你并不知道為了讓末端執(zhí)行器到達(dá)該位置應(yīng)該具有什么樣的鉸鏈連接體的位置。這就是逆向運(yùn)動(dòng)學(xué)發(fā)揮作用的地方。

164746syttdtvlkc9klfll.jpg 目標(biāo)位置使用紅色圓圈進(jìn)行表示,目標(biāo)位置被定義為輸入,計(jì)算位置作為輸出用于末端執(zhí)行到達(dá)目標(biāo)位置。
逆向運(yùn)動(dòng)學(xué)是前向運(yùn)動(dòng)學(xué)的逆函數(shù)/算法。前向運(yùn)動(dòng)學(xué)函數(shù)/算法將目標(biāo)位置作為輸入,并且計(jì)算所需的位置用于末端執(zhí)行器到達(dá)目標(biāo)位置——該位置作為輸出。

正如你所見(jiàn),輸入和輸出是在FK和IK之間進(jìn)行切換。對(duì)于逆向運(yùn)動(dòng)學(xué),你不需要定義鉸鏈連接體的整個(gè)位置——這些可以通過(guò)逆向運(yùn)動(dòng)學(xué)計(jì)算而得到。使用IK,你只需要定義一個(gè)位置作為輸入。

逆向運(yùn)動(dòng)學(xué)在計(jì)算位置時(shí)完成了所有的具有挑戰(zhàn)性的計(jì)算工作。圖6很好的進(jìn)行了闡述。在前一個(gè)場(chǎng)景中,具有一個(gè)鉸鏈連接體和一些已知的位置。它定義了末端執(zhí)行器想要到達(dá)的目標(biāo)位置。一旦IK算法應(yīng)用于鉸鏈連接體,我們可以得到接下來(lái)的場(chǎng)景。下面的場(chǎng)景展示了一個(gè)計(jì)算得到的新的位置,這使得末端執(zhí)行器現(xiàn)在位于目標(biāo)位置。

IK有哪些用處?

對(duì)于這一點(diǎn),我們知道IK適用于鉸鏈連接體,我們了解了一個(gè)鉸鏈連接體是由哪些部分組成的,以及我們知道了IK和FK之間的不同之處。到目前為止,我們對(duì)IK有了一個(gè)很好的概述,但是我們還要介紹關(guān)于IK的非常實(shí)用的例子。IK可以被用于模仿人類的手臂來(lái)移動(dòng)至一個(gè)目標(biāo)或者對(duì)象,正如我們所見(jiàn)到的一樣。IK同樣也可以用于腳步,這樣我們可以告訴腳應(yīng)該走到哪里,然后IK將會(huì)計(jì)算出如何對(duì)腳的運(yùn)動(dòng)副進(jìn)行配置。IK通常不被用于動(dòng)畫(huà)本身(到達(dá)一個(gè)目標(biāo)位置),但是更多的是用于動(dòng)畫(huà)工具。因此,如果你正在實(shí)現(xiàn)一個(gè)行走的循環(huán),那么你可以通過(guò)使用IK來(lái)創(chuàng)建一些動(dòng)畫(huà)的關(guān)鍵幀。

164746ri0a1v71v7csvtkb.jpg IK用于腳的旋轉(zhuǎn)作為目標(biāo)。運(yùn)動(dòng)副L和R進(jìn)行旋轉(zhuǎn)使得符合傾斜面
關(guān)于IK的另一個(gè)關(guān)鍵點(diǎn)是你的目標(biāo)不僅局限于位置本身——你的目標(biāo)也可以被定義為旋轉(zhuǎn)。例如,如果你的腳需要根據(jù)不平坦的地面進(jìn)行旋轉(zhuǎn),那么你的IK旋轉(zhuǎn)目標(biāo)可以基于地面法線進(jìn)行定義。如圖7所示,這樣就會(huì)使得你的腳符合傾斜平面。請(qǐng)注意,你也可以使用IK來(lái)使得你的頭(或者眼睛)朝向某一個(gè)方向。如果你想要你的頭部跟隨者某一個(gè)對(duì)象,你可以使用IK讓你的頭部跟隨者該物體。

IK 示例

我將會(huì)展示一些IK的示例來(lái)完成這篇文章。這個(gè)角色通過(guò)移動(dòng)IK的目標(biāo)位置來(lái)實(shí)現(xiàn)左手和右腿的移動(dòng)。

none.gif Unity3D中的IK示例
我想要感謝計(jì)算機(jī)圖形學(xué)碩士Eric Haines, Ed Angel, 和RickParent 對(duì)本文非常重要的反饋。

via:Gad




銳亞教育

銳亞教育,游戲開(kāi)發(fā)論壇|游戲制作人|游戲策劃|游戲開(kāi)發(fā)|獨(dú)立游戲|游戲產(chǎn)業(yè)|游戲研發(fā)|游戲運(yùn)營(yíng)| unity|unity3d|unity3d官網(wǎng)|unity3d 教程|金融帝國(guó)3|8k8k8k|mcafee8.5i|游戲蠻牛|蠻牛 unity|蠻牛