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)停止。
,一直计算到Root节点
- 再从第一个节点开始循环
4. Jacobia IK
TODO
5. Fullbody IK
TODO
6. 参考资料
[1] https://zhuanlan.zhihu.com/p/41425611
[2] https://blog.youkuaiyun.com/noahzuo/article/details/80188366