骨骼动画反向动力学(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的负担.帧动画模型在这 ...
随机推荐
- ASP.NET车辆管理系统100%源代码
系统开发环境为VS2010.採用ASP.NET框架.数据库採用SQL Server.系统採用Ajax,具有:GPS导航(实时监控报警).申请审核.流程查看及短信息发送等功能.这个系统界面和功能是我认为 ...
- EasyNVR将如何能够把内网各种各样的监控摄像机对接到公网云平台
需求 传统监控行业里面,监控客户端.服务器端,设备端都在一个内网里面,搞个电脑开个监控终端,顶多再配一个NVR做一做摄像机的录像存储.上个电视墙(个人感觉这功能除了面子工程,没啥实用的,还特费电!), ...
- RTSPClient工具EasyRTSPClient支持H.265,支持海思等各种芯片平台
EasyRTSPClient是EasyDarwin开源流媒体团队开发.提供的一套非常稳定.易用.支持重连的RTSPClient工具,接口调用非常简单,再也不用像调用live555那样处理整个RTSP ...
- 九度OJ 1122:吃糖果 (递归)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1522 解决:1200 题目描述: 名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N ...
- 远程访问Linux的常见方式
访问方式 不加密文字界面:telnet.rsh 加密文字界面:SSH 图形界面:Xdmcp.RDP.VNC SSH SSH用来取代finger.R shell(rlogin.rcp.rsh).teln ...
- Javascript学习之三元运算符详解
本文主要是通过实例为大家介绍javascript三元运算符相关内容,希望对初学者学习这部分内容有所帮助. 实例 <!DOCTYPE html> <html> <head& ...
- ABAP内存运用
(1)ABAP 内存运用语句: EXPORT LT_ITAB TO MEMORY ID ‘MM’. IMOIRT LT_ITTAB FROM MEMORY ID ‘MM’. (2)SAP内 ...
- 安装MySQLdb出现的问题
枫竹梦的环境是自己编译安装的MySQL,安装目录在/usr/local/mysql. 下载MySQLdb,由于网络上大多数的链接都是指向比较老的sourceforge上,而我们安装最新的1.2.5,h ...
- TCP/IP,HTTP,Socket初识
在大学时候学过网络通信这一块,奈何已经还给老师,苍天饶过谁,该拾起来看看学学的还是要学,先简单了解了下这方面的知识,后续会继续通过看书来充实这方面的知识. 手机能够联网是手机底层实现了TCP/IP协议 ...
- LR-虚拟用户以进程和线程模式运行的区别
进程方式和线程方式的优缺点: 如果选择按照进程方式运行, 每个用户都将启动一个mmdrv进程,多个mmdrv进程会占用大量内存及其他系统资源,这就限制了可以在任一负载生成器上运行的并发用户数的数量,因 ...