IK节点详解

IK节点详解

Forawrd kinematics(FK,正向运动学)通过逐个设置每个骨骼的旋转来达到最终姿势,inverse kinematics(IK,逆向运动学)允许给骨骼直接设置一个目标位置,系统会计算其它骨骼的旋转和位置。


TwoBone IK

TwoBoneIk节点的IK计算涉及到3个骨骼,一个End bone(即设置的IK bone,如hand_r),一个joint bone(end bone的父骨骼,如lowerarm_r),一个root bone(joint bone的父骨骼, 如upperarm_r)。


上图表示将hand_r通过TwoBoneIK节点设置到新位置EffectorLocation,虚线连接的骨骼是它们在节点计算后得到的位置,我们需要确定的是lowerarm_r新位置是什么?因为连接3个骨骼的2个臂长是已知不变的,通过余弦定理可以得到夹角y:

cos(y) = (a^2 + dist^2 - b^2) / (2 * a * dist);

f = a * sin(y);

通过勾股定理得到a在DistDir上的投影距离:

ProjDist = FMath::Sqrt(a^2 - f^2);

所以lowerarm_r新位置为:

OutJointPos = RootPos + (ProjDist *DistDir) + (f * JointBlendDir);

其中RootPos为upperarm_r的位置,DistDir为 upperarm_r到EffectorLocation的单位向量,由于在三维空间OutJointPos可以有无数个解,所以需要指定Joint Target Location来确定最适合的那一个,JointBlendDir就是位于Joint Target Location,RootPos和EffectorLocation三个点组成的平面,并且垂直于DistDir的单位向量。


配置:

IKBone: End bone的骨骼名。

Effector Location: 指定End bone最终的位置.

Joint Target Location: 该点和Effector Location、root bone三个点确定的平面将会是joint bone所在的平面,因为通过计算后的joint bone位置可以有无数个,通过指定Joint Target Location可以使joint bone在比较合适平面,Joint Target Location的值需要不断试验来得到最合适的值。

Effector Location Space: EffectorLocation的坐标系,World Space世界坐标系,Component Space组件空间坐标系,Parent Bone Space以EffectorSpaceBoneName配置的骨骼的父骨骼为原点的坐标系,Bone Space以EffectorSpaceBoneName配置的骨骼为原点的坐标系。

Effector Space Bone Name: 如果EffectorLocationSpace选择了Bone Space/Parent Bone Space, 指定是哪一个骨骼。

Joint Target Location Space: 指定Joint Target Location的坐标系。

bAllowStreching: 是否允许调整臂长。


FABRIK

前向和后向到达IK(Forward and Backward Reaching Inverse Kinematics)支持多个骨骼的IK计算,与TwoBoneIk的计算不同,FABRIK通过往前和往后遍历骨骼链的方式使骨骼的位置收敛于解决方案(可能不是最好的,由迭代次数和精度决定)。

下图表示一次骨骼A的IK计算的过程:

图1:初始的骨骼状态;

图2:移动骨骼A(Tip bone)的位置到蓝色实心圆;

图3-4:执行一次前向遍历:根据A的位置调整其它骨骼的位置。由于骨骼A与骨骼B的距离拉长,所以图3需要将骨骼B沿位置着B->A的方向拉回到与A原始距离相同的位置,同理B的移动也导致B到C的距离拉长,图4将C沿着C->B的方向将C拉回到与B原始距离相同的位置;

图5-6:执行一次后向遍历:根据骨骼D(Root bone)的位置调整其它骨骼的位置。图5将C沿着C->D的方向拉回与D原始距离相同的位置,图6将B沿着B->C的方向拉回与C原始距离相同的位置。

(图3-6的遍历过程中骨骼A和D的位置保持不变)。

UE4默认对图3-6的遍历过程迭代10次,因为后向遍历的执行顺序在前向遍历之后,因此在迭代完成或满足精度后,骨骼A与B的距离可能与原始距离不一样,所以最后需要将骨骼A沿着A->B的方向拉回与B原始距离相同的位置。


配置:

Percision(精度):迭代开始前,如果Tip bone的位置与新位置的距离,小于该精度表示不需要进行IK计算;迭代开始后,tip bone的父骨骼到新位置的距离与实际Tip bone臂长的差,小于该精度则停止迭代。

Tip Bone: 指定IK链的末端骨骼,如hand.

Root Bone: 指定IK链的根骨骼,如pelvis.

Max Iteration: 最大迭代次数,默认10。

Effector Transform: Tip bone 新的变换量;

Effector Tansform Space: 指定Effector Transform的值是相对于世界坐标系(World Space),组件坐标系(Component Space),父骨骼坐标系(Parent Bone Space)还是指定的骨骼的坐标系(Bone Space)的。

Effector Transform Bone: 如果Effector Tansform Space选择了Bone Space, 该选项就是指定是哪一个骨骼的。


Hand IK Retargeting

简单的将IKBonesToMove配置的所有骨骼应用相同的偏移量。该偏移量是IKLocation到FKLocation的偏移量。IkLocation是LeftHandIK和RightHandIK之间的插值,HandFKWeight为插值权重:0完全左手,1完全右手。FKLocation的计算同理。

发布于 2018-08-06

文章被以下专栏收录