转载:http://www.cnblogs.com/skyman/archive/2008/11/25/ik.html
角色动画是构建虚拟世界(游戏和虚拟社区)一个比较重要的内容。因为虚拟世界最关键的是人与虚拟角色(即“化身”,Avatar)之间的交互,会动的世界才有生机。角色动画可分两种:预定义动画(predefined animation)和程序动画(procedural animation)。预定义动画是事先由美术师制作好的动画序列,程序运行时只能播放,不能改变;程序动画是在程序运行时实时生成。相比预定义动画,程序动画能实现更好的交互。
程序动画可以用来实现物理动画(physics animation),物理动画可以让角色根据物理规律对外界作出相应的反应动作。物理动画现在已经开始应用到3D游戏里了。比如Crytek公司的CRYENGINE 2引擎就采用了这项技术,例如角色可以根据地形的坡度来自动调整站立的身姿,如下图所示:
IK就是一种实现程序动画的方法。骨络动画分为FK(正向运动学,Forward Kinematics)和IK(逆向运动学, Inverse Kinematics)两种。FK这里就不细讲了,是最常用的设置动画的方法。这里主要讲一下IK,IK和FK相反,它是给定末端作用器的位置或方向,来反求各节点的位置。如下图所示:
IK主要用于程序动画中,比如跑步时人的腿根据地形进行自适应,用手拿东西,用手握扶手开门等。如下图所示:
IK计算有2种方法:解析法和迭代法。解析法速度快,但只适用于节点较少的情况;迭代法通用性强,但有时容易得到局部极小值。所以一般是这两种方法混用。IK的解的个数有多种情况:
(a) 无解 (b) 唯一解 (c) 两个解 (d) 许多解
若节点数大于2个,就会出现有许多解的情况,那么如何选择最佳解呢,对人的手和腿来说,每个关键都有约束(转动角度的范围),那么就要考虑这些解有没有满 足这些约束。但是可能满足这些约束的解不止一个,这时就要选择一个最佳的,比如视觉效果最好的。一种方法是选择消耗能量最少的那个(比如手臂各关节抬得最 低)。
FK可以实现比较自然的动画效果;IK可以用在程序中实时生成骨络的关键帧,这样就可以使角色根据外界环境实时的作出动作的反应,更真实。因为FK和IK各有优缺点,所以往往FK和IK混用(FK/IK blend)。
上面说到IK能够更好的实现交互效果。比如在虚拟世界(游戏或虚拟社区)中,你可以让一个角色替你拿某样东西,等等,IK就能实现这种需求,这样会使我们 和虚拟角色的交互更加有趣。下面是我最近做的一个小demo,演示的就是你把红色小球放在某一个地方,虚拟角色都可以用手摸到它。技术要点主要是:实时 IK求解器和FK/IK混合。