http://www.xuanyusong.com/archives/2264
IK动画全名是Inverse Kinematics 意思是反向动力学,就是子骨骼节点带动父骨骼节点运动。比如跳街舞的少年用手撑着身体在地上转圈,手就是子骨骼,胳膊身体就是它的父骨骼,这时运动手就需要带动胳膊身体来移动。
IK动画可以在3DMAX 或者Maya中制作(不在本篇的讨论范围内),本篇我么说说在程序中如何动态调用IK动画。IK动画需要使用Unity4新版的动画系统,如果对新版的动画系统不是很了解的朋友建议看看上一篇。Unity3D研究院之在项目中使用Unity4新Mecanim动画(五十三)
如下图所示,设置模型的骨骼并且给模型添加AnimatorController控制器。如果不会添加详细请看上一篇文章。
在Unity导航菜单栏中打开Window->Animator打开动画控制器窗口,在这里勾选IK Pass。
代码方面直接使用API中的,我懒得写了,我给大家详细的解释一下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
using
UnityEngine
;
using
System
;
using
System
.
Collections
;
[
RequireComponent
(
typeof
(
Animator
)
)
]
public
class
IKCtrl
:
MonoBehaviour
{
//动画控制
protected
Animator
animator
;
//是否开始IK动画
public
bool
ikActive
=
false
;
//右手子节点参考的目标
public
Transform
rightHandObj
=
null
;
void
Start
(
)
{
//得到动画控制对象
animator
=
GetComponent
<
Animator
>
(
)
;
}
//a callback for calculating IK
//它是回调访法。
//前提是在Unity导航菜单栏中打开Window->Animator打开动画控制器窗口,在这里必须勾选IK Pass!!!
void
OnAnimatorIK
(
)
{
if
(
animator
)
{
//if the IK is active, set the position and rotation directly to the goal.
//即或IK动画后开始让右手节点寻找参考目标。
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)
//设置骨骼的权重,1表示完整的骨骼,如果是0.5哪么骨骼权重就是一半呢,可移动或旋转的就是一半,大家可以修改一下参数试试。
animator
.
SetIKPositionWeight
(
AvatarIKGoal
.
RightHand
,
1f
)
;
animator
.
SetIKRotationWeight
(
AvatarIKGoal
.
RightHand
,
1f
)
;
//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
//如果取消IK动画,哪么重置骨骼的坐标。
else
{
animator
.
SetIKPositionWeight
(
AvatarIKGoal
.
RightHand
,
0
)
;
animator
.
SetIKRotationWeight
(
AvatarIKGoal
.
RightHand
,
0
)
;
}
}
}
}
|
如下图所示,图中哪个小球就是子节点参考的目标。,在Scene视图中移动哪个小球,你会发现主角的右手开始IK动画。
上面代码中我们IK的是主角的右手,实际上IK动画支持两个手和两个脚。
1
2
3
4
5
6
|
// AvatarIKGoal.RightHand 右手
// AvatarIKGoal.LeftHand 左手
// AvatarIKGoal.LeftFoot 左脚
// AvatarIKGoal.RightFoot 右脚
animator
.
SetIKPosition
(
AvatarIKGoal
.
RightHand
,
rightHandObj
.
position
)
;
animator
.
SetIKRotation
(
AvatarIKGoal
.
RightHand
,
rightHandObj
.
rotation
)
;
|