• 骨骼反向(xiàng)動力學(INVERSE IK)的(de)實現(xiàn)

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

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

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

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

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

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

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

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



    AV永久天堂网_奇米狠狠色_亚洲欧美日韩动漫_欧美日韩视频在线观看免费一区二区_日韩精品一二三区_国产AV网站18禁止人_久久久久久精品人妻免费网站不卡_国产最新视频_另类免费视频在线视频二区_久久精品免视国产