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

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

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

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

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

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

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

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

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



    网站地图 正能量网-传播正能量弘扬主旋律-免费正能量网站www正能量-免费正能量网站www正能量下载在线观看官网