动画_IK概述

0. 写在前面

本文为个人学习的笔记整理,如有错误,望不吝指出。

1. TwoBoneIK

限制IK的骨链只能有2根骨骼和一个关节(2根以上不可用),在这种限制下,几何法(TwoBoneIK)就是最佳解法。
解算器的目标:通过余弦定理求各关节的角度
1.推导过程
在这里插入图片描述

2.排除目标无法到达的情况
|L1-L2|≤LT≤L1+L2
其中L1和L2是两根骨骼的长度,LT是Target到Base的距离
两个距离必须满足上述不等式

3.可行解不唯一
在这里插入图片描述

二维:可求出两个解,并且是相对于起始关节点指向目标位置的向量对称。可以通过约束关节旋转的角度来排除一个非法的解。
三维:在以(起始关节点指向目标位置的向量)为轴的特定圆上都是可行解,即有无数解。UE4中是通过外部指定一个参考平面,来确定一个唯一解。

4.UE4的TwoBoneIK
在这里插入图片描述
(图片引用自参考资料[1])

  • Effector Location: 指定的Target位置
  • DistDir:由起始位置指向Target位置的向量,并且可以直接拿到长度dist
  • Joint Target Location:外部输入的一个顶点,很关键,用来在三维空间中的无数解中固定一个解的参数。
  • JointBlendDir:位于Joint Target Location(指定点),RootPos(关节起点)和EffectorLocation(目标终点)三个点组成的平面,并且垂直于DistDir的单位向量。

由于终点位置和起始位置都是固定的,只需要求中间关节的位置即可

cos(y) = (a^2 + dist^2 - b^2) / (2 * a * dist);         				===>> 余弦定理求第一个关节的旋转角度,即上述的cos(θ1-θr)
f = a * sin(y);                                                         ===>> 求f的长度,用于后面求投影距离
ProjDist = FMath::Sqrt(a^2 - f^2);                        				===>> 勾股定理求a在DistDir上的投影距离
OutJointPos = RootPos + (ProjDist *DistDir) + (f  * JointBlendDir);     ===>>  最后通过向量加关节起始点位置,得到最后要求的中间关节的位置。

2. FABRIK

FABRIK:前向和后向到达IK(Forward and Backward Reaching Inverse Kinematics)
支持多根骨骼IK,但主要是控制骨骼的位置,不负责控制骨骼的旋转
通过往前和往后遍历骨骼链的方式使骨骼的位置收敛于解决方案(可能不是最好的,由迭代次数和精度决定)

1.解算思路

  • 先计算整条骨骼链的长度,判断目标点是否可达,如果不可达,则要求根骨骼移动。
  • 从末端骨骼开始,直接把骨骼拆下来,把末端效应器放到Target目标位置,并且这根骨骼的两端,和剩余骨骼的末端与Target的连线要处于同一直线。
  • 依次拆下剩余的骨骼,并按照1的规则来放置拆下来的骨骼。
  • 当1~2步都执行完毕后(这就是前向遍历到达(Forward Reaching)),以原Target位置为骨链的起始位置,原Base设置为Target位置,再执行1~2步,这就是后向遍历到达(Backward Reaching)
  • 重复1~3步,直到末端效应器到达目标点的一定阈值内,或者达到迭代次数(UE4默认为10)停止。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/2ec67e9ae06b4a139b362d900ebda06e.png在这里插入图片描述

3. CCDIK

CCD:Cyclic Coordinate Descent 循环坐标下降法
支持多根骨骼IK,但主要是控制骨骼旋转达到IK的效果,和FABRIK相反

1.解算思路

  • 从骨骼链靠近末端效应器的第一个节点开始
  • 求当前节点指向末端效应器的向量,与当前节点指向Target目标位置的向量的夹角
  • 把这个夹角应用到该节点的旋转(如果是中间节点,其子关节也要基于这个变换),一直计算到Root节点
  • 再从第一个节点开始循环
    在这里插入图片描述

4. Jacobia IK

TODO

5. Fullbody IK

TODO

6. 参考资料

[1] https://zhuanlan.zhihu.com/p/41425611
[2] https://blog.csdn.net/noahzuo/article/details/80188366

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值