FinalIK 中 CCDIK 算法解析


在这里插入图片描述

1.算法分析

CCD(Cyclic Coordinate Descent),中文翻译是循环坐标下降

1.1 骨骼位置演算

(1)从倒二个骨骼节点开始,不断递减,传入下一个步骤
(2)计算该骨骼节点与最后一个骨骼节点连成的方向向量与当前骨骼节点到目标点的方向向量的夹角
(3)将该骨骼节点旋转(2)求得的角度
(4)多次重复(1)迭代靠近目标位置

在这里插入图片描述

2.实现

2.1 逻辑流

在这里插入图片描述
在Update中触发初始化,如果未初始化,则调用IKSolver.Initiate->IKSolverCCD.OnInitiate->IKSolverHeuristic.InitiateBones,主要初始化数据;初始化完成后,将会调用IKSolverCCD.OnUpdate->IKSolverCCD.Solve,做下面骨骼演算

2.2 核心代码

2.2.1 骨骼演算核心代码

for (int i = bones.Length - 2; i > -1; i--) {
	// Slerp if weight is < 0
	//CCD tends to overemphasise the rotations of the bones closer to the target position. Reducing bone weight down the hierarchy will compensate for this effect.
	float w = bones[i].weight * IKPositionWeight;

	if (w > 0f) {
		Vector3 toLastBone = bones[bones.Length - 1].transform.position - bones[i].transform.position;
		Vector3 toTarget = targetPosition - bones[i].transform.position;
						
		// Get the rotation to direct the last bone to the target
		Quaternion targetRotation = Quaternion.FromToRotation(toLastBone, toTarget) * bones[i].transform.rotation;
						
         if (w >= 1) bones[i].transform.rotation = targetRotation;
			else bones[i].transform.rotation = Quaternion.Lerp(bones[i].transform.rotation, targetRotation, w);
		}
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值