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

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

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

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

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

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

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

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

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



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