找回密碼
 注冊帳號

掃一掃,訪問微社區

反向動力學 (inverse kinematics)(僅限專業版 (pro))

2015-1-8 17:40| 發布者: 楊炎| 查看: 2101| 評論: 0|原作者: 蠻牛|來自: unity3d腳本manual

摘要: 反向動力學 (inverse kinematics)(僅限專業版 (pro))大多數動畫通過旋轉調整骨架中關節的角度為預定值來制作。子關節的位置根據其父關節的旋轉而改變,因此,關節鏈的端點由其所包含的單個關節的角度和相對位置決 ...

反向動力學 (inverse kinematics)(僅限專業版 (pro))

大多數動畫通過旋轉調整骨架中關節的角度為預定值來制作。子關節的位置根據其父關節的旋轉而改變,因此,關節鏈的端點由其所包含的單個關節的角度和相對位置決定。這種構成骨架的方法稱為正向動力學。

因此,從相反的角度查看構成關節的任務通常十分有用 – 在空間中給出一個選擇的位置,逆向操作,找到一種定向關節的有效方式,這樣端點就落在該位置。想要角色在用戶選擇的某一點觸摸一個物體或者將角色雙腳穩穩地固定在不平坦的表面上時,這種方式非常有效。這種方式稱為反向動力學 (inverse kinematics)(ik),支持 mecanim,可用于任何含有正確配置的 avatar的類人角色。

要為角色設置ik,通常需要擁有與角色互動的場景四周的物體,然后通過腳本設置 ik,特別是通過此類動畫器 (animator) 功能:setikpositionweight、setikrotationweight、setikposition、setikrotation、setlookatposition、bodyposition、bodyrotation

在上圖中,我們展示了一個角色正抓住一個圓柱形物體。我們如何才能做到這一點?

我們先從一個擁有有效 avatar 的角色入手,然后向該角色附加一個實際上處理 ik 的腳本(我們就稱它為ikctrl):

using unityengine;

using system;

using system.collections;

[requirecomponent(typeof(animator))]

public class ikctrl :monobehaviour {

protected animator animator;

public bool ikactive = false;

public transform righthandobj = null;

void start ()

{

animator = getcomponent();

}

//a callback for calculating ik

void onanimatorik()

{

if(animator) {

//if the ik is active, set the position and rotation directly to the goal.

if(ikactive) {

//weight = 1.0 for the right hand means position and rotation will be at the ik goal (the place the character wants to grab)

animator.setikpositionweight(avatarikgoal.righthand,1.0f);

animator.setikrotationweight(avatarikgoal.righthand,1.0f);

//set the position and the rotation of the right hand where the external object is

if(righthandobj != null) {

animator.setikposition(avatarikgoal.righthand,righthandobj.position);

animator.setikrotation(avatarikgoal.righthand,righthandobj.rotation);

}

}

//if the ik is not active, set the position and rotation of the hand back to the original position

else {

animator.setikpositionweight(avatarikgoal.righthand,0);

animator.setikrotationweight(avatarikgoal.righthand,0);

}

}

}

}

由于我們不打算讓角色用手抓住整個物體,我們在圓柱體上放置了一個手抓的球體,并相應轉動該球體。

該球體然后被列為 ikctrl 腳本的“右手對象 (right hand obj)” 屬性

點擊ikactive復選框,觀察角色抓取、松開物體的過程

(返回mecanim 簡介)

相關閱讀

文章點評
相關文章
女校游泳队彩金 吉林十一选五开奖结 沂南东方大酒店小姐 德国股票指数 新十一选五基本走势图 15选5走势图开奖 微乐龙江棋牌安卓版 福利彩票29选7中奖概 微乐江西麻将外挂 宁夏十一选五开奖查 皇冠比分90vs localhost 东方6+1走势图 奥运网球比分直播 广东11选5直播 北京快3 河北十一选五遗漏一 澳洲幸运5开奖体育彩查询