正向动力学与反向动力学
2014年01月12日 16:10:22
阅读数:8708
角色动画中的骨骼运动遵循动力学原理,定位和动画骨骼包括两种类型的动力学:正向动力学(FK)和反向动力学(IK)
要理解反向动力学(Inverse kinematics)系统,应该首先明白正向动力学(forward kinematics)系统。FK是一种让动画制作者可以将层级的节点摆出一个类似一副骨架的形状的方法。
节点的概念。它是一个用于电脑动画产业的通用术语。就角色动画骨骼来说。一个节点代表层级内外的任何物体,例如一个大腿骨骼,或者一个辅助点,或者一个球体
在一套FK系统中,一般的规则是:层级里的一个父节点驱动任意子节点的运动。例如,如果你移动前臂(父),手腕(子)就会随之运动。但是,如果你移动腕节点,前臂还将停留在原处。
使用FK方法制作动画的过程非常像摆放动作造型:当你摆放肢体(子)造型的时候,可以移动人物的躯干(父)以及所有保持与父节点的相对位置的肢体。
这是制作动画物体(例如一个行走的角色)的手臂的一种简单、直观的方法,因为动画制作者只需要考虑手臂相对应父节点的运动,而不是相对于整个空间的运动。同时应该注意的是,在使用FK制作动画时要给每一个为特定姿势而旋转的关节设置旋转关键帧。不过,当角色手臂需要抓住场景里的某些物体时,如楼梯的扶手,FK就不是最好的使用方法了。
那么与之相比。IK就是一种子节点驱动父节点运动的动画制作方法。
依然使用手臂做为例子,如果使用IK移动手腕,计算机将计算如何移动和旋转手臂的其他父节点,以使其完成想要的造型。
一般情况下,使用一条IK链需要更多的元素进行操作。手腕的位置代表一个被称为末端受动器(End Effector)的位置。末端受动器是一个IK节点,它代表一种IK解决方案的最终结果。另外,目标的物体代表末端受动器的所需位置。动画制作者操纵目标只是为了最终定位手腕,因为IK解算器总是将末端受动器的位置匹配到目标物体上。如图所示。在某些情况下,如手臂关节旋转或者只是手臂的长度太短,可能会将目标移动到某些末端受动器无法匹配的位置。
使用IK方法的一大好处之一就是可以安置末端受动器。如果你把手腕目标移动到楼梯扶手的某个位置上,并随后移动角色的躯干,手腕将会留在扶手上,因为手臂关节会自动改变到适合手腕和身体新位置的地方。使用FK完成这样的工作将会非常乏味和繁琐。而且与FK相比,默认情况下在一个IK链上制作目标物体的动画会设置目标物体的位置关键帧,但不在IK链的关节上设置旋转关键帧。
这两种方法各有其优点和缺点。一般的解决方案包括在角色的上部躯干使用FK,腿部使用IK.但是如果角色使用手掌行走呢。。。。。。。。
理想的解决方案是拥有一套你可以在其中根据需要在FK和IK之间来回切换的系统。比如强大的CS骨骼系统。
百度百科:
前向动力学(FK,forward kinematics,也称为正向动力学):
角色动画中的骨骼运动遵循动力学原理,定位和动画骨骼包括两种类型的动力学:前向动力学(FK)和反向动力学(IK)。
前向动力学是指完全遵循父子关系的层级,用父层级带动子层级的运动。
前向动力学的优点是:计算简单,运算速度快,缺点是:需指定每个关节的角度和位置,而由于骨架的各个节点之间有内在的关联性,直接指定各关节的值很容易产生不自然协调的动作。
反向动力学:Inverse kinematics
一种通过先确定子骨骼的位置,然后反求推导出其所在骨骼链上n级父骨骼位置,从而确定整条骨骼链的方法。
区别:
在前向动力学系统中,每一个子关节的位置、方向都是由父关节所支配的。在电脑动画软件的发展初期,关节动画都是正向链接系统,它的特点是软件开发容易,最致命的弱点便是工作效率太低。
与前向动力学正好相反,反向动力学是依据某些子关节的最终位置、角度,来反求出整个骨架的形态。它的特点是工作效率高,大大减少了需要手动控制的关节数目,缺点是求解方程组需要耗费较多的计算机资源,在关节数增多的时候尤其明显。
FK正向动力学,是根据父关节的旋转来计算得出每个子关节的位置
IK反向动力学,是根据末端子关节的位置移动来计算得出每个父关节的旋转 两个原理正好相反
原理::
前向动力学与反向动力学
来源: Michael的日志
前向动力学与反向动力学是骨骼动画中很重要的方法,那么它的原理和实现究竟是怎样的呢,我写了一篇关于前向动力学与反向动力学的教程,希望对大家有帮助!
一、前向动力学的特点:
1、具有层次的骨骼结构,比如说当我们举起手臂的时候,我们的手肘跟着运动,手腕跟着手肘运动,手指跟着手腕运动,这就是一个典型的具有层次的骨骼运动,也就说,当父骨骼运动时,所有的子骨骼也随之运动
2、每一根骨骼都是由定义在其父骨骼关节坐标空间中的旋转角度ri和固定的位移ti决定的
设R={r0, r1, r2, r3,……}
那么骨骼链中的最末端的骨骼的位置E(Ex,Ey,Ez)(终端效应)
E=f(R)
那么在一般2D情况下
考虑以下的骨骼链:
可以看见骨骼链的末端骨骼的位置和旋转就是由r0, r1, r2, r3和t0, t1, t2, t3决定的,由于t0, t1, t2, t3是固定的,因此实际是仅有r0, r1, r2, r3所决定。那么我们可以简单研究一下二维平面上的骨骼旋转,请看下图:
设骨骼1,骨骼2,骨骼3的长度分别为L1,L2, L3
设骨骼1,骨骼2,骨骼3的位置二维向量分别为T1,T2, T3
设骨骼1,骨骼2,骨骼3的夹角分别为R1,R2, R3
关节2的位置为T2=(T1.x+L1*cos(R1),T1.y+L1*sin(R1))
关节3的位置为T3=(T2.x+-L2*cos(R2-R1),T2.y+L2*sin(R2-R1))
终端感应器的位置为E=(T2.x+L3*cos(R3-R2-R1),T2.y+L3*sin(R3-R2-R1))
二、反向动力学
反向动力学
前向动力学是给定一系列骨骼的状态值r0, r1, r2, r3和t0, t1, t2, t3那么最终骨骼的形态就决定了,终端感应器即最后一根骨骼的位置和旋转也就确定了。但有时候在实际应用中往往是这样一种情况,即确定了一个目标位置,让骨骼通过旋转,使得最后终端感应器能够处于目标位置之上。那么在中情况下就需要进行反向动力学求解了。即已知E(Ex,Ey,Ez),求R ={r0, r1, r2, r3,。。。。}
在前向动力学中E=f(R)
那么在反向动力学中R=f-1(E)
反向动力学的求解通常有那么几种方法:
解析求解:通过对方程式进行直接求解,并选择最优解,但在应用中并不可行
数值分析法:通常代价昂贵,不精确,但是在应用中往往是可行的唯一方法
三种常用方法:
1、雅克比矩阵法(数值分析法)
2、圆柱坐标法(数值分析法)
3、三角函数法(解析求解)
雅克比矩阵法
雅克比矩阵法是由整个系统各个参数R ={r0, r1, r2, r3,。。。。}的偏导数əR ={ər0, ər1, ər2, ər3,。。。。}
那么当系统中R ={r0, r1, r2, r3,。。。。}发生ΔR ={Δr0, Δr1, Δ r2, Δr3,。。。。}
变化时,对应E发生的变化ΔE= əRΔR,ΔE={ΔEx,ΔEy,ΔEz}
实际上,这里只是线性近似,为什么呢,请看下图
雅克比矩阵为:
əEx/r0 əEx/r1 … əEx/rn
j= əEy/r0 əEy/r1 … əEy/rn
əEz/r0 əEz/r1 … əEz/rn
已知ΔE={ΔEx,ΔEy,ΔEz}求ΔR ={Δr0, Δr1, Δ r2, Δr3,。。。。},在J为方型矩阵的情况下,ΔR=J-1ΔE, J-1为雅克比矩阵J的逆矩阵
雅克比矩阵的问题:
1、如果系统是个高约束系统或者过低约束系统
2、雅克比矩阵不可逆,即系统无解
3、雅克比矩阵不一定为方阵
为了解决这个问题:
我们引入矩阵J+= (JT J)-1 JT
(JT J)-1是方阵,并且可逆,那么我们就可以了利用(JT J)-1,而且这是可行的,为什么呢,我们先看看此公式的推导:
JΔR=ΔE
那么J JTΔR= JTΔE,两边同时乘上(J JT)-1,最后得到
ΔR=(J JT)-1 JTΔE,取J+= (JT J)-1 JT