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

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

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

    Kinematics,FK);而IK則是先確定子骨骼的方位,反(fǎn)向(xiàng)推導出(chū)其繼承(chéng)鏈上n級父(fù)骨骼方(fāng)位的方法。

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

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

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

    對所有受IK影響的(de)骨骼,按從子骨骼(gé)到(dào)父骨骼的(de)順序執行迭代操作(zuò):旋轉當前骨骼,使當前骨骼位(wèi)置(zhì)到目(mù)標骨骼的連線指向IK目標位置。由於所有骨骼是從一個特定狀態出發開(kāi)始(shǐ)IK計算,所得到的結果也會比較穩定。通常5~10次迭(dié)代之(zhī)後就能(néng)得到很好的結果。

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

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



    日本中出视频|午夜免费福利在线|亚洲精品亚洲人成在线下载|国产高潮流白浆免费观看不卡|偷拍亚洲欧美|亚洲中文字幕久爱亚洲伊人|久久久久香蕉视频|国产欧美日韩一区|久久国产成人亚洲精品影院老金|久久久久中文字幕