反向动力学,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)的实现的更多相关文章

  1. Unity (反向动力学)IK动画

  2. Unity---动画系统学习(6)---Avatar Mask动画融合、Layers动画分层、IK反向动力学

    1. 介绍 Avatar Mask(动画融合) 前面我们一直介绍的都是动画混合,一般用于解决边跑边转弯的问题.而动画融合一般用于解决例如边跑边挥手的问题. 简单说就是让跑步去控制腿的骨骼,挥手控制手的 ...

  3. 2D骨骼动画工具DragonBones的使用教程

    怎样用更少的美术成本创造出更生动的动画效果?今天就为大家介绍一套开源的2D骨骼动画框架和工具--DragonBones,它包含了桌面骨骼动画制作工具DragonBonesPro和一套多语言版本的Dra ...

  4. Unity3D之Mecanim动画系统学习笔记(七):IK(反向动力学)动画

    什么是IK? IK(Inverse Kinematics)即反向动力学,即可以使用场景中的各种物体来控制和影响角色身体部位的运动,一般来说骨骼动画都是传统的从父节点到子节点的带动方式(即正向动力学), ...

  5. [摘译] IK: 操纵关节式物体的反向动力学和几何约束

    原文: INVERSE KINEMATICS AND GEOMETRIC CONSTRAINTS FOR ARTICULATED FIGURE MANIPULATION http://graphics ...

  6. Spine(2D骨骼动画)

    点击进入Spine官网 Spine 是一款针对游戏的 2D 骨骼动画编辑工具. Spine 旨在提供更高效和简洁 的工作流程,以创建游戏所需的动画. 功能: 1.摄影表 Dopesheet 在动画制作 ...

  7. Unity即将内置骨骼动画插件Anima2D

    Unity一直在寻找新的方法来帮助开发者,并为他们提供最好的工具.在此我们向大家宣布,Unity将内置流行的骨骼动画插件Anima2D,从2017年1月开始免费供所有Unity开发者使用! 同时也欢迎 ...

  8. 引擎设计跟踪(九.14.2b) 骨骼动画基本完成

    首先贴一个介绍max的sdk和骨骼动画的文章, 虽然很早的文章, 但是很有用, 感谢前辈们的贡献: 3Ds MAX骨骼动画导出插件编写 1.Dual Quaternion 关于Dual Quatern ...

  9. Spine Skeleton Animation(2D骨骼动画)

    骨骼动画 首先我们来看到底什么是骨骼动画: 在早期的机器上,渲染本身已经占用了很多CPU资源,因此,对于渲染,往往采取的是一种空间换时间的策略,以避免在模型的渲染中继续加重CPU的负担.帧动画模型在这 ...

随机推荐

  1. 通过WindowManager图片切换的效果

    最近为这个事情焦头烂额,原因无他.原来打算是把ViewPager放在WindowManager中,再设定一个定时器,让图片自动切换,但是搞了很久,发现无论如何,这个图片只显示一张.虽然日志看得出来图片 ...

  2. Android笔记之启动界面的设置

    默认情况下,启动界面是白屏 我们自定义一个启动界面如下,3秒钟后进入主界面并结束启动页 SplashActivity.java package com.bu_ish.myapp; import and ...

  3. flex平分测试

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  4. python berkeley DB操作——打开btree索引文件中的database

    打开BDB中某个索引中的数据库代码: from bsddb3 import db import bsddb3 as bsddb print db.DB_VERSION_STRING mydb = db ...

  5. 树堆(Treap)

    平衡树 简介: 平衡二叉树(Balanced Binary Tree)具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.平衡二叉树的常用实现方 ...

  6. hdu-5762 Teacher Bo(抽屉原理+暴力)

    题目链接: Teacher Bo Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  7. Java中的final和static

    final final可以用在类.方法.变量上. 1.final用在类上,表明当前类它不能被继承,没有子类. 2.final用在方法上,表明当前方法不能被override,不能被重写. 3.final ...

  8. python装饰器精髓代码

    #!/usr/bin/env python #-*- coding:utf-8 -*- import time def foo(func): def inner(): print('fs...') f ...

  9. No java virtual machine ....

    运行Eclipse提示No java virtual machine   版权声明:本文原创作者:一叶飘舟 作者博客地址:http://blog.csdn.net/jdsjlzx http://blo ...

  10. js some和filter用法和区别

    some方法 array1.some(callbackfn[, thisArg]) 对数组array1中的每个元素调用回调函数callbackfn,当回调函数返回true或者遍历完所有数组后,some ...