骨骼动画反向动力学(IK)的实现
反向动力学,Inverse Kinematics,简称IK。简单地说,由父骨骼的方位和子骨骼的相对变换得到子骨骼的方位,称为正向动力学(Forward Kinematics,FK);而IK则是先确定子骨骼的方位,反向推导出其继承链上n级父骨骼方位的方法。
IK在游戏里最常见的应用是foot placement,就是当角色站在一个不平的表面上(台阶,斜坡)时,自动调整两脚的高低(当然,同时会影响小腿和大腿的姿态)以便看上去脚是真正“踩”在地面上的,而不是浮在空气中或者陷入地面以下。
如果不用IK的话,要解决这个问题就只能为所有可能的地形起伏情况制作不同的角色动作,其工作量是不可想象的。另外的应用就是象《波斯王子》,《古墓丽影》这样的游戏,经常会需要主角向前跃起然后抓住一样东西,比如一根旗杆。主角的弹跳能力通常是固定的,游戏也不可能要求玩家控制角色在一个精确的特定地点朝一个精确的特定方向跳跃,一般都是允许一个误差范围。那么问题就出现了,当主角飞到旗杆附近时,可能旗杆在头顶上,也可能在肩膀之下,或者偏左偏右都有可能,这时IK就可以使主角的双手自然地伸向旗杆,不管它在哪里(当然,必须physically
possible,也就是在生理学上够得着的距离内)。
下面是去年写的一个demo视频
如何实现IK呢?最容易想到的是求解方程,但这样通常会得到无穷多的解。用自己的身体试验一下,即使手和肩膀都不动,小臂和大臂仍然可以自由灵活的转动,更不用说涉及超过2级骨骼的IK了。现在最常用的IK实现方法称为CCD(Cyclic Coordinate Descent,中文不知道叫什么),这是一种迭代的方法,在绝大多数情况下,目标骨骼的位置都会收敛到指定位置。见下图,即使不写程序,自己拿几根火柴棍也很容易验证这个算法的有效性。

对所有受IK影响的骨骼,按从子骨骼到父骨骼的顺序执行迭代操作:旋转当前骨骼,使当前骨骼位置到目标骨骼的连线指向IK目标位置。由于所有骨骼是从一个特定状态出发开始IK计算,所得到的结果也会比较稳定。通常5~10次迭代之后就能得到很好的结果。
目前为止,指定骨骼到达指定位置已经没问题了,但通常这是不够的。如果是人体骨骼的话,不是所有的关节都可以向任意方向旋转,所以我们必须对骨骼的旋转加以限制,比如肘关节实际上只有一个轴的自由度,而且不能向后弯曲。由于通常骨骼动画都是用四元数来表示旋转,而关节的角度限制只能用欧拉角来表示,所以在迭代过程中每次算出骨骼的旋转后都要转成欧拉角,看是否超过极限值,如果超过则需要校正,然后再转回四元数进行计算。
限制了旋转角之后,结果看起来就很好了。但是还有一个细节需要注意,当所有需要IK控制的骨骼正好在一条直线上,而IK目标位置正好在也落在这条直线上时(如下图),算法就会失败,因为不论迭代多少次,每一个骨骼都会认为自己不需要旋转。所以一个小技巧是,如果发现骨骼链“很直”,就向骨骼允许的任意方向加一些细微的旋转;或者干脆在骨骼的限制角度数据中就禁止完全“伸直”。

骨骼动画反向动力学(IK)的实现的更多相关文章
- Unity (反向动力学)IK动画
- Unity---动画系统学习(6)---Avatar Mask动画融合、Layers动画分层、IK反向动力学
1. 介绍 Avatar Mask(动画融合) 前面我们一直介绍的都是动画混合,一般用于解决边跑边转弯的问题.而动画融合一般用于解决例如边跑边挥手的问题. 简单说就是让跑步去控制腿的骨骼,挥手控制手的 ...
- 2D骨骼动画工具DragonBones的使用教程
怎样用更少的美术成本创造出更生动的动画效果?今天就为大家介绍一套开源的2D骨骼动画框架和工具--DragonBones,它包含了桌面骨骼动画制作工具DragonBonesPro和一套多语言版本的Dra ...
- Unity3D之Mecanim动画系统学习笔记(七):IK(反向动力学)动画
什么是IK? IK(Inverse Kinematics)即反向动力学,即可以使用场景中的各种物体来控制和影响角色身体部位的运动,一般来说骨骼动画都是传统的从父节点到子节点的带动方式(即正向动力学), ...
- [摘译] IK: 操纵关节式物体的反向动力学和几何约束
原文: INVERSE KINEMATICS AND GEOMETRIC CONSTRAINTS FOR ARTICULATED FIGURE MANIPULATION http://graphics ...
- Spine(2D骨骼动画)
点击进入Spine官网 Spine 是一款针对游戏的 2D 骨骼动画编辑工具. Spine 旨在提供更高效和简洁 的工作流程,以创建游戏所需的动画. 功能: 1.摄影表 Dopesheet 在动画制作 ...
- Unity即将内置骨骼动画插件Anima2D
Unity一直在寻找新的方法来帮助开发者,并为他们提供最好的工具.在此我们向大家宣布,Unity将内置流行的骨骼动画插件Anima2D,从2017年1月开始免费供所有Unity开发者使用! 同时也欢迎 ...
- 引擎设计跟踪(九.14.2b) 骨骼动画基本完成
首先贴一个介绍max的sdk和骨骼动画的文章, 虽然很早的文章, 但是很有用, 感谢前辈们的贡献: 3Ds MAX骨骼动画导出插件编写 1.Dual Quaternion 关于Dual Quatern ...
- Spine Skeleton Animation(2D骨骼动画)
骨骼动画 首先我们来看到底什么是骨骼动画: 在早期的机器上,渲染本身已经占用了很多CPU资源,因此,对于渲染,往往采取的是一种空间换时间的策略,以避免在模型的渲染中继续加重CPU的负担.帧动画模型在这 ...
随机推荐
- babylon使用3dsmax导出的obj文件时模型偏暗
将模型的material的diffuseTexture设置为null即可
- MVC入门——编辑页
添加Action EditUserInfo using System; using System.Collections.Generic; using System.Linq; using Syst ...
- memcmp和strcmp的返回值
注意,无论是内存比较还是字符串比较,这两个函数的返回值的意义是一样的. 如果相同,返回0 如果前面大于后面,返回大于0 如果前面小于后面,返回小于0 一定要注意,相同的时候是0,不是true.
- !推荐:下载abap 源代码
转自http://blog.sina.com.cn/s/blog_4d1570de0100pvhd.html *@------------------------------------------- ...
- STM32 ~ STM32 TIM重映射
复用功能 没有重映射 部分重映射 完全重映射 TIM3_CH1 PA6 PB4 PC6 CH2 PA7 PB5 PC7 CH3 PB0 PB0 PC8 CH4 PB1 PB1 PC9 /**重映射 t ...
- [zjoi2003]密码机
一台密码机按照以下的方式产生密码:首先往机器中输入一系列数,然后取出其中一部分数,将它们异或以后得到一个新数作为密码.现在请你模拟这样一台密码机的运行情况,用户通过输入控制命令来产生密码.密码机中存放 ...
- Appium——adb 启动问题Invalid argument: cannot open transport registration socketpair could not read ok from ADB Server failed to start daemon * error: cannot connect to daemon
adb启动问题:Invalid argument: cannot open transport registration socketpair could not read ok from ADB S ...
- MySQL学习笔记(六)—— MySQL自连接
有的时候我们需要对同一表中的数据进行多次检索,这个时候我们可以使用之前学习过的子查询,先查询出需要的数据,再进行一次检索. 例如:一张products表,有产品id,供应商id(vend_id),产品 ...
- smarty模板引擎基础(二)
smarty模板引擎所需文件夹共可分为存放页面缓存的(cache).存放配置文件的(configs).存放模板扩充插件的(plugins).存放模板文件的(templates).存放编译后的模板文件的 ...
- 精选Java面试题(二)
Java中的方法覆盖重写(Overriding)和方法重载(Overloading)是什么意思? Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况.与此相对,方法 ...