• 您(nín)的位置:首頁 > 新(xīn)聞動態 > 技術文章

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

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

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

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

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

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

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

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

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



    91影视免费版下载-91麻豆国产福利精品-91麻豆精品一二三区在线-国产91系列视频在线观看