Unity-反向動(dòng)力學(xué)
大多數(shù)動(dòng)畫是通過(guò)將骨架中的關(guān)節(jié)角度旋轉(zhuǎn)到預(yù)定值來(lái)生成的。子關(guān)節(jié)的位置根據(jù)父關(guān)節(jié)的旋轉(zhuǎn)而改變,因此可從父關(guān)節(jié)包含的各個(gè)關(guān)節(jié)的角度和相對(duì)位置來(lái)確定關(guān)節(jié)鏈的終點(diǎn)。這種構(gòu)建骨架的方法被稱為正向動(dòng)力學(xué)。
然而,從相反視角看待構(gòu)建關(guān)節(jié)的任務(wù)通常很有用:在空間中選擇一個(gè)位置后,向后找到一種有效的關(guān)節(jié)定位方法,使終點(diǎn)落在該位置。如果您希望角色觸摸位于用戶選定位置的對(duì)象或讓角色的雙腳牢牢扎入不平坦的表面,這種方法可能很有用。此方法稱為_(kāi)_反向動(dòng)力學(xué)__ (IK),可在 Mecanim 中用于_已正確配置的任何人形Avatar骨骼。

要為角色設(shè)置 IK,通常要在場(chǎng)景周圍放置與角色互動(dòng)的對(duì)象,然后通過(guò)腳本(尤其是,諸如?SetIKPositionWeight、?SetIKRotationWeight、?SetIKPosition、?SetIKRotation、?SetLookAtPosition、?bodyPosition、?bodyRotation之類的 Animator 函數(shù))來(lái)設(shè)置 IK
在上圖中,我們展示了一個(gè)抓住圓柱形物體的角色。我們?nèi)绾螌⑵鋵?shí)現(xiàn)?
我們從擁有有效的 Avatar角色開(kāi)始。
下一步創(chuàng)建 Animator Controller,使其包含該角色的至少一個(gè)動(dòng)畫。然后,在 Animator 窗口的 Layers 面板中,單擊層的齒輪設(shè)置圖標(biāo),并選中彈出框中的 IK Pass 復(fù)選框。

確保已將 Animator Controller 分配給角色的 Animator 組件 (Animator Component):

接下來(lái),為其附加一個(gè)實(shí)際處理 IK 的腳本,將此腳本命名為?IKControl。此腳本為角色的右手設(shè)置 IK 目標(biāo),并設(shè)置角色的觀察位置以使其觀看所持物體:
因?yàn)槲覀儾淮蛩阕尳巧氖稚斓轿矬w內(nèi)部中心(圓柱的軸心點(diǎn)),所以放置一個(gè)空的子對(duì)象(在此情況下,命名為“Cylinder Grab Handle”(圓柱抓握把手)),確保手應(yīng)該放在圓柱上,并將其相應(yīng)旋轉(zhuǎn)。然后,這只手瞄準(zhǔn)此子對(duì)象。

然后,應(yīng)將此“抓握把手”游戲?qū)ο蠓峙錇?IKControl 腳本的“Right Hand Obj”屬性
在此示例中,我們把觀察目標(biāo)設(shè)置為圓柱本身,因此即使把手靠近底部,角色也會(huì)直接看向物體的中心。

進(jìn)入播放模式,然后應(yīng)該會(huì)看到 IK 變?yōu)楝F(xiàn)實(shí)。單擊?IKActive?復(fù)選框時(shí),觀察角色抓取和放開(kāi)物體,并嘗試在播放模式中四處移動(dòng)圓柱以觀察手臂和手跟隨物體移動(dòng)的情況。