• 您的位置:首頁 > 新聞動態 > 技術文章

    骨骼反向動力學(INVERSE IK)的實現

    2018/11/15      點擊:
    反向動力學,Inverse Kinematics,簡稱IK。簡單地說,由父骨骼的方位和子骨骼的相對變換得到子骨骼(gé)的方位,稱為正向動力學(Forward 

    Kinematics,FK);而IK則是先確定子骨骼的方位,反向推導出其繼承鏈上n級父骨骼方位的方法。

    IK在(zài)遊戲裏常見的應用是foot 
    placement,就是當角色站在一個不平的表(biǎo)麵上(台階,斜坡)時,自動調整(zhěng)兩腳的高低(當(dāng)然,同時會影(yǐng)響小腿和大腿的(de)姿態)以便看(kàn)上去腳是真正“踩”在地麵上的,而不是浮在空氣中或者陷入地(dì)麵以(yǐ)下。

    如果不用IK的話,要解決這個(gè)問題就(jiù)隻能為所有可能的地形(xíng)起伏情況製作(zuò)不同的角色動作,其工作量是不(bú)可想象的。另外的應用就是象《波斯王子》,《古墓麗影(yǐng)》這樣的遊戲,經(jīng)常會需要主角向前躍起然後(hòu)抓住一樣東西,比如一根旗杆。主角的彈(dàn)跳能(néng)力通常是固定的,遊戲也不可能要求玩家控製角色在一個(gè)準確的特定地點(diǎn)朝一個準(zhǔn)確的特(tè)定方向跳躍,一般都是允許(xǔ)一個誤差範圍。那麽問題就出現了,當(dāng)主角飛到旗杆(gǎn)附近時,可(kě)能旗杆在頭頂上(shàng),也可能(néng)在肩膀之下,或者偏左偏右都有可能,這時IK就可以使主角的雙手自然地伸向旗杆,不管它在哪裏(當然,必須physically 
    possible,也就是在生理學上夠得著的距離內)。

    如何實(shí)現IK呢?容易想到的是求解方程,但這(zhè)樣通常會得(dé)到無窮多的解。用自己的身體試驗一下,即使手和肩膀都(dōu)不動,小臂和大(dà)臂(bì)仍然可以自由靈活的(de)轉動,更不用說(shuō)涉及超過2級骨骼的IK了。現在(zài)常用(yòng)的IK實現方法稱為CCD(Cyclic 
    Coordinate 
    Descent,中文不知道叫什麽),這是一種迭代(dài)的方法,在絕大多數情(qíng)況下(xià),目(mù)標骨骼的位置都會收斂(liǎn)到指定位置。見下圖,即使不寫程(chéng)序,自己拿(ná)幾根火柴(chái)棍也很容易驗證這(zhè)個(gè)算法的有效性。

    對所有受IK影響的骨骼,按從子骨骼到父骨骼的(de)順序(xù)執行迭代操作:旋轉(zhuǎn)當前骨骼,使當前骨骼位置到目標骨骼的連線指向IK目標位置。由於所有骨骼是從一個特定狀(zhuàng)態(tài)出發開始IK計算,所(suǒ)得到的結果也會比較穩定。通常5~10次迭代之後就能得到很好的結果(guǒ)。

    目前為止,指定骨骼到達指定位置已經沒問題了,但通常這(zhè)是不夠的。如果是人體骨骼的話,不是所有的關(guān)節都可以向任意方向旋轉,所以我們必須對骨骼的(de)旋轉(zhuǎn)加以限製,比如肘關節實際上隻有一個軸的自由度,而且不能向後彎曲。由於通常骨骼動畫都是用四元數來表示旋轉,而關節的(de)角度(dù)限製隻能用歐拉角來(lái)表示,所以在迭代過程中每(měi)次算出(chū)骨骼的旋轉後都要轉成歐拉角,看是否超過很(hěn)限值,如果超(chāo)過則需要校正,然後再(zài)轉回四元數進行計算。

    限製了旋轉角之後,結(jié)果看起來就很好(hǎo)了。但是還有一(yī)個細節(jiē)需要注(zhù)意,當所有需要IK控製的骨骼正好在一條直(zhí)線上,而IK目標位置正好在也落在這條直線上時(如下圖),算法(fǎ)就會失敗,因為不論迭代多少次,每一個骨骼都會認為自己不需要旋轉(zhuǎn)。所以一個小技巧(qiǎo)是,如果發(fā)現骨骼鏈“很直”,就向骨骼允許的任意方向加一些細微的旋轉(zhuǎn);或者(zhě)幹脆在骨骼的限製角度數據中就(jiù)禁止完全“伸直”。



    91网站入口_91视频导航_91短视频在线_91视频在线免费观看