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

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

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

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

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

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

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

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

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

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



    自愉色色,亚洲色孩,jk无遮拦,日日夜夜7799天天综合,999夜夜,7799天天综合天天综合网精品视频,日日夜夜精品视频7799,天天综合7799精品影视