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