亚洲人成欧美中文字幕,男人狂躁进女人下面免费视频,99re热视频这里只精品,99久久99久久久精品齐齐

  • 骨骼反向動力學(xué)(INVERSE IK)的實(shí)現(xiàn)

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

    Kinematics,F(xiàn)K);而IK則是先確定子骨骼的方位,反向推導(dǎo)出其繼承鏈上n級父骨骼方位的方法。

    IK在游戲里常見的應(yīng)用是foot 
    placement,就是當(dāng)角色站在一個(gè)不平的表面上(臺階,斜坡)時(shí),自動調(diào)整兩腳的高低(當(dāng)然,同時(shí)會影響小腿和大腿的姿態(tài))以便看上去腳是真正“踩”在地面上的,而不是浮在空氣中或者陷入地面以下。

    如果不用IK的話,要解決這個(gè)問題就只能為所有可能的地形起伏情況制作不同的角色動作,其工作量是不可想象的。另外的應(yīng)用就是象《波斯王子》,《古墓麗影》這樣的游戲,經(jīng)常會需要主角向前躍起然后抓住一樣?xùn)|西,比如一根旗桿。主角的彈跳能力通常是固定的,游戲也不可能要求玩家控制角色在一個(gè)準(zhǔn)確的特定地點(diǎn)朝一個(gè)準(zhǔn)確的特定方向跳躍,一般都是允許一個(gè)誤差范圍。那么問題就出現(xiàn)了,當(dāng)主角飛到旗桿附近時(shí),可能旗桿在頭頂上,也可能在肩膀之下,或者偏左偏右都有可能,這時(shí)IK就可以使主角的雙手自然地伸向旗桿,不管它在哪里(當(dāng)然,必須physically 
    possible,也就是在生理學(xué)上夠得著的距離內(nèi))。

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

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

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

    限制了旋轉(zhuǎn)角之后,結(jié)果看起來就很好了。但是還有一個(gè)細(xì)節(jié)需要注意,當(dāng)所有需要IK控制的骨骼正好在一條直線上,而IK目標(biāo)位置正好在也落在這條直線上時(shí)(如下圖),算法就會失敗,因?yàn)椴徽摰嗌俅危恳粋€(gè)骨骼都會認(rèn)為自己不需要旋轉(zhuǎn)。所以一個(gè)小技巧是,如果發(fā)現(xiàn)骨骼鏈“很直”,就向骨骼允許的任意方向加一些細(xì)微的旋轉(zhuǎn);或者干脆在骨骼的限制角度數(shù)據(jù)中就禁止完全“伸直”。



    主站蜘蛛池模板: 开远市| 博野县| 甘肃省| 五河县| 鄂伦春自治旗| 久治县| 寿阳县| 古丈县| 林西县| 武清区| 调兵山市| 乐东| 仪陇县| 华阴市| 宜州市| 高阳县| 罗甸县| 浦江县| 宣武区| 巴林右旗| 兴仁县| 临夏市| 砀山县| 交口县| 昌宁县| 壤塘县| 霍林郭勒市| 鞍山市| 井冈山市| 色达县| 樟树市| 通城县| 简阳市| 斗六市| 家居| 五台县| 卫辉市| 金平| 南陵县| 墨脱县| 永福县|