骨骼反向動力學(INVERSE IK)的實現
Kinematics,FK);而IK則是先確定子骨骼的方位,反向推導出(chū)其繼承鏈上n級父骨骼方(fāng)位的方法。
IK在遊戲裏常見的應用是foot
placement,就(jiù)是當角色站在一個(gè)不平的表(biǎo)麵上(台階,斜坡)時,自動調(diào)整兩腳的高低(當然,同時會影響小腿和大腿的姿態)以便看上(shàng)去腳是真正“踩”在地麵上(shàng)的,而不是浮在空氣中或者陷入地麵以(yǐ)下。
如果不用IK的話,要解決這個問題就隻(zhī)能為所有可能的地形起伏情況製作不同的角色動作,其工(gōng)作量是不可想象的。另外的應用(yòng)就是(shì)象《波斯王子》,《古(gǔ)墓麗影(yǐng)》這樣的遊戲,經(jīng)常會需要主角向前躍起然後抓住一樣東西,比如(rú)一根旗杆。主角的彈跳能(néng)力通(tōng)常(cháng)是固定的,遊戲也不可能要求玩家控製角色(sè)在一(yī)個準確的特定地點(diǎn)朝一個準確的特定方向跳躍,一般都是允(yǔn)許一個誤差範圍。那麽問題就出現了,當主角飛到(dào)旗杆(gǎn)附近時,可能旗杆在頭頂上,也可能在肩膀之(zhī)下,或者偏左偏右都有可(kě)能,這時IK就可以(yǐ)使主角的雙手自然地伸(shēn)向旗杆,不管它在哪裏(當然,必須physically
possible,也就是在(zài)生理學上夠得著的距離內(nèi))。
Coordinate
Descent,中文不知道(dào)叫什麽),這是一種迭代的方法,在絕大多(duō)數情況下,目標骨骼的位置都會收斂到指定位置。見下圖,即使不寫程序,自(zì)己拿幾根火柴(chái)棍也很容易(yì)驗證這個算法的有效性。
對所(suǒ)有受IK影(yǐng)響的骨骼,按從(cóng)子骨骼到(dào)父(fù)骨骼的順序執行迭代操作:旋轉當前骨骼,使當前骨骼位置到目標骨骼的連線(xiàn)指向IK目標位置。由於所有骨骼是(shì)從一個特定狀態出發開始IK計算,所得到的結(jié)果也會比較穩定。通常5~10次迭代之(zhī)後(hòu)就能得到很好的結果。
目前為止,指定骨骼到達指定位置已經沒問題了,但通常這是不夠的。如果是人體骨骼的話,不(bú)是所有(yǒu)的關節都可以向任意方(fāng)向旋轉(zhuǎn),所以我們必須對骨骼的旋轉加(jiā)以限製,比如肘關節實際(jì)上隻有一個軸的自由(yóu)度,而且(qiě)不(bú)能向後彎(wān)曲。由於通(tōng)常骨骼動畫都是用四元(yuán)數來(lái)表示旋(xuán)轉(zhuǎn),而關節的角度限製隻能用歐拉角來表示,所以在迭代過程(chéng)中每次算出骨骼的旋轉後都要轉成歐(ōu)拉角,看是否超過很(hěn)限值,如果超過則需(xū)要校正,然後再轉回四元(yuán)數進(jìn)行計算。
限製了旋轉角之後,結果看起來就很好了。但是還有一個細節需要注意,當(dāng)所有需要(yào)IK控製的骨骼正好在一條直線上,而IK目標位置正(zhèng)好在也落(luò)在這條直線上時(如下圖),算法就會失(shī)敗,因為不論迭代多少次,每一個骨骼都會認為自己不需要(yào)旋轉。所以一個小技巧(qiǎo)是,如果發現骨骼鏈“很直”,就向骨骼允許的任(rèn)意方向加一些細微的旋轉;或者幹脆在骨骼的限製角度數據中就禁止完全“伸直”。
- 上一(yī)篇:簡單的IK骨骼動畫IK解算方法(fǎ) 2018/11/15
- 下一篇:motionbuilder 導入動(dòng)捕動作數據教學 2018/10/17