IK学习笔记(1)——CCD IK
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相关推荐
- ElasticSearch学习笔记之十一 Anayle API和IK分词器
ElasticSearch学习笔记之十一 Anayle API和IK分词器 Anayle API IK分词器 IK分词器版本支持 安装 下载或者编译 选择一 选择二 重启ElasticSearch I ...
- 反向动力学(Inverse kinematics) 学习笔记
反向动力学(Inverse kinematics) 学习笔记 1 背景 1.1 骨骼动画 将动画分为两个部分:用于绘制外观的蒙皮,以及用于控制动作的骨架(摘自维基百科).这些骨架以树状结构组织,每片骨 ...
- SVO 学习笔记(深度滤波)
SVO 学习笔记(深度滤波) 这篇博客 论文中的深度滤波 深度滤波的代码流程 更新Seed对象 初始化Seed对象 结尾 这篇博客 这篇博客将介绍SVO论文中的Mapping部分,主要介绍深度滤波器 ...
- 【学习笔记】超简单的快速数论变换(NTT)(FFT的优化)(含全套证明)
整理的算法模板合集: ACM模板 目录 一.前置知识 二.快速数论变换(NTT) 三.NTT证明(和FFT的关系) 四.NTT模板 数组形式的实现 vector形式的实现 点我看多项式全家桶(●^◡_ ...
- OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC
OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...
- GTSAM Tutorial学习笔记
GTSAM Tutorial学习笔记 GTSAM Tutorial学习笔记 1. 基本原理 2. Demo代码 3. LIO-SAM中部分代码分析 3.1 预积分因子图 3.2 关键帧因子图 GTSA ...
- 统计学习方法 学习笔记(十):决策树
这一个学习笔记将要了解决策树,在研一上机器学习这门课的时候,老师在讲到这一节的时候,举了一个例子我现在还能记得:你们坐在这里上课,就像这个决策树一样,在你人生中的每一个重要结点,你都做出了选择,经过多 ...
- 《多元统计分析》学习笔记之主成分分析
鄙人学习笔记 文章目录 主成分分析 主成分分析的基本原理 总体主成分及其性质 主成分 主成分的性质 相关问题讨论 关于由协方差矩阵或相关矩阵出发求解主成分 主成分分析不要求数据来自于正态总体 主成分分 ...
- 【theano-windows】学习笔记十一——theano中与神经网络相关函数
前言 经过softmax和MLP的学习, 我们发现thenao.tensor中除了之前的博客[theano-windows]学习笔记五--theano中张量部分函数提到的张量的定义和基本运算外, 还有 ...
最新文章
- UVa12096.The SetStack Computer
- Java多线程并发常用类实例之:exchanger
- 百练OJ:1017:装箱问题
- oclick vue 传参 函数_详解Vue计算属性和侦听属性
- 数据库:内联接,外联接,空值和联接
- 『 编程思维』之我见
- 【渝粤教育】国家开放大学2018年秋季 0692-22T化工设备机械基础 参考试题
- Linux(debian7)操作基础(十三)之shell脚本同时执行多个应用程序
- 点击home键_iPhone小技巧:无Home键iPhone11如何强制重启?
- 梯度锐化拉普拉斯锐化比较_锐化斧头
- remote connect openshift mysql
- ui做成html格式,使用element-ui的table组件时,渲染为html格式
- inDesign入门教程,如何添加阴影效果?
- 服务消费(Ribbon)
- 绫辻行人《杀人偶人馆》读后感
- 解决CSDN无法上传资源问题
- linux解压时,z x v f分别代表什么意思
- Android 实现点击输入框以外的区域隐藏软键盘
- Flutter开发之——Card
- colored manual page