IK的概念

动力学分为正向动力学(FK)和反向动力学(IK)

其中正向动力学(FK)主要是通过父骨骼的变换,再由矩阵乘法得到子骨骼的最终变换

而反向动力学(IK)主要是通过子骨骼的变换,从而倒推出父骨骼应该怎么变换,而父骨骼产生变换之后,此时子骨骼会受到父骨骼变换的影响,子骨骼和目标点产生新的差距,此时需要迭代使用IK算法,直至趋近目标点

IK的应用

比如人物模型要抓住一个东西(如武器)的时候,我们一般是直接控制手部骨骼去抓东西,同时也希望骨骼间的结构产生“抓”这个动作的影响

比如人物模型站在不平坦的地面上时,我们需要调整脚上的骨骼,保证不会穿模,看起来脚是站在不平坦的地面上的,这时候我们也希望人物模型的腿部产生一定的影响

常见的IK算法

启发式法

启发式算法子家族实现了解决IK问题的简单方法,而不使用复杂的方程和计算。这些算法通常由简单的操作组成,以一种迭代的方式,逐渐推出IK解决方案。启发式IK算法具有较低的计算成本,因此通常很快就能得到最终的姿态,并且非常适合于简单的问题,特别是对于非人体测量骨骼(如蜘蛛、昆虫)。它们的主要局限之一是,即使满足了所有的关节约束,它们也会产生非自然或生物力学上不可行的动作和手势。启发式解算器不考虑附近关节之间的时空修正,因为它们独立地处理每个关节的约束,而不考虑全局约束。

CCD IK(循环坐标下降逆动态学)

原理:一次转换一个关节变量来最小化位置和姿态误差。

策略思路:每个骨骼都以自身轴点到尾叶子节点的方向旋转到自身轴点到目标点方向,开始趋近

举例说明:

[P3,P4]:首先计算[P3,P4]的向量与[P3,目标点]的向量,得出向量之间的夹角旋转角度,此时将[P3,P4]进行角度旋转

[P2,P3]:计算[P2,P4]的向量与[P2,目标点]的向量,得出向量之间的夹角旋转角度,此时将[P2,P3]进行角度旋转,同时注意子骨骼会受到该旋转的影响产生偏移

[P2,P1]:计算[P1,P2]的向量与[P1,目标点]的向量,得出向量之间的夹角旋转角度,此时将[P2,P1]进行角度旋转,同时注意子骨骼会受到该旋转的影响产生偏移

进行了这一次迭代之后可以发现P4此时和目标点又会产生旋转角度的偏差,因此可以继续进行迭代,当迭代到一定次数之后,就会逼近目标点

  • 多次迭代图

  • 骨骼演算核心参考代码
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 targetQuaternion 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);}
}

参考文章

https://blog.csdn.net/f980511/article/details/123316988

https://zhuanlan.zhihu.com/p/499405167

https://zhuanlan.zhihu.com/p/469221237

https://www.twblogs.net/a/5ee13245cd139eebd77e9dd0/?lang=zh-cn

IK学习笔记(1)——CCD IK相关推荐

  1. ElasticSearch学习笔记之十一 Anayle API和IK分词器

    ElasticSearch学习笔记之十一 Anayle API和IK分词器 Anayle API IK分词器 IK分词器版本支持 安装 下载或者编译 选择一 选择二 重启ElasticSearch I ...

  2. 反向动力学(Inverse kinematics) 学习笔记

    反向动力学(Inverse kinematics) 学习笔记 1 背景 1.1 骨骼动画 将动画分为两个部分:用于绘制外观的蒙皮,以及用于控制动作的骨架(摘自维基百科).这些骨架以树状结构组织,每片骨 ...

  3. SVO 学习笔记(深度滤波)

    SVO 学习笔记(深度滤波) 这篇博客 论文中的深度滤波 深度滤波的代码流程 更新Seed对象 初始化Seed对象 结尾 这篇博客  这篇博客将介绍SVO论文中的Mapping部分,主要介绍深度滤波器 ...

  4. 【学习笔记】超简单的快速数论变换(NTT)(FFT的优化)(含全套证明)

    整理的算法模板合集: ACM模板 目录 一.前置知识 二.快速数论变换(NTT) 三.NTT证明(和FFT的关系) 四.NTT模板 数组形式的实现 vector形式的实现 点我看多项式全家桶(●^◡_ ...

  5. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  6. GTSAM Tutorial学习笔记

    GTSAM Tutorial学习笔记 GTSAM Tutorial学习笔记 1. 基本原理 2. Demo代码 3. LIO-SAM中部分代码分析 3.1 预积分因子图 3.2 关键帧因子图 GTSA ...

  7. 统计学习方法 学习笔记(十):决策树

    这一个学习笔记将要了解决策树,在研一上机器学习这门课的时候,老师在讲到这一节的时候,举了一个例子我现在还能记得:你们坐在这里上课,就像这个决策树一样,在你人生中的每一个重要结点,你都做出了选择,经过多 ...

  8. 《多元统计分析》学习笔记之主成分分析

    鄙人学习笔记 文章目录 主成分分析 主成分分析的基本原理 总体主成分及其性质 主成分 主成分的性质 相关问题讨论 关于由协方差矩阵或相关矩阵出发求解主成分 主成分分析不要求数据来自于正态总体 主成分分 ...

  9. 【theano-windows】学习笔记十一——theano中与神经网络相关函数

    前言 经过softmax和MLP的学习, 我们发现thenao.tensor中除了之前的博客[theano-windows]学习笔记五--theano中张量部分函数提到的张量的定义和基本运算外, 还有 ...

最新文章

  1. UVa12096.The SetStack Computer
  2. Java多线程并发常用类实例之:exchanger
  3. 百练OJ:1017:装箱问题
  4. oclick vue 传参 函数_详解Vue计算属性和侦听属性
  5. 数据库:内联接,外联接,空值和联接
  6. 『 编程思维』之我见
  7. 【渝粤教育】国家开放大学2018年秋季 0692-22T化工设备机械基础 参考试题
  8. Linux(debian7)操作基础(十三)之shell脚本同时执行多个应用程序
  9. 点击home键_iPhone小技巧:无Home键iPhone11如何强制重启?
  10. 梯度锐化拉普拉斯锐化比较_锐化斧头
  11. remote connect openshift mysql
  12. ui做成html格式,使用element-ui的table组件时,渲染为html格式
  13. inDesign入门教程,如何添加阴影效果?
  14. 服务消费(Ribbon)
  15. 绫辻行人《杀人偶人馆》读后感
  16. 解决CSDN无法上传资源问题
  17. linux解压时,z x v f分别代表什么意思
  18. Android 实现点击输入框以外的区域隐藏软键盘
  19. Flutter开发之——Card
  20. colored manual page

热门文章

  1. 最后,我想对你说一句:我爱你
  2. Arria 10上进行DDR3管脚分配
  3. 软件制作:QQPenguin辅助工具
  4. 演讲口才培训:如何风趣幽默的演讲?
  5. 提升效率的tmux初始化脚本
  6. 158道软件测试面试题及答案!金九银十求职必备!
  7. js 监听手机输入法弹出
  8. SSID设置问题面面观
  9. CSS3实现列表无限滚动/轮播
  10. 思维拓展--斐波那契问题