反向动力学Ik学习

参考文章:(非本人原创)

英文原文:Inverse Kinematics Techniques in Computer Graphics: A Survey (andreasaristidou.com)

知乎翻译文章:

【游戏开发】逆向运动学(IK)详解 - 知乎 (zhihu.com)

概念

正向运动学(Forward kinematics, FK):利用机器人运动学方程,根据关节的特定参数计算末端受动器(end effector)的位置。正向运动学要求用户为所有涉及的关节设置参数。

逆向运动学(Inverse kinematics, IK):流程与FK相反,利用机器人运动学方程来确定机械手的关节参数,使末端受动器移动到期望的位置。末端受动器可以是关节(如手和脚),也可以是内部关节(如手肘和膝盖),不一定位于末端。IK最早出现在机器人学技术中,现在在许多领域都有应用,比如:工程学、计算机图形学、电子游戏、CG动画。

关于末端受动器:机械手臂抓取末端受动器的位置、角色开门时手的位置、角色行走时脚的位置,这些可以称为末端受动器。

IK问题分析

IK可能有一个解、多个解或无解。

IK问题解决有两步比较重要:

  • 一:分析目标是可达还是不可达。检查目标是否在可达范围内是很重要的,因为避免寻找不存在的解决方案,可以节省大量的处理时间。末端受动器能够到达的目标空间称为可达工作空间。
  • 二:当存在解决方案且没有达到解决方案时,需要添加终止条件来避免在迭代过程中进入无限循环的情况。比如:限制迭代次数、当末端受动器在前一次迭代和当前迭代时的位置差小于指定的公差时终止IK解算器(IK solvers)的计算。

要令IK发挥最好的效果,开始时骨骼最好摆出接近目标的姿势。这样有助于算法专注最接近的解,并能在合理的时间内完成计算。可用解的数量取决于目标位置或运动链的自由度。目标不可达的IK问题被称为过度约束问题。当目标可达时,两个或多个链可能存在多个解决方案。这使得IK问题不受约束(或冗余)——它可能有无限多的解决方案来满足期望的目标。

IK求解算法

IK解算器主要分为四大类,分别是解析法(the Analytic family)、数值法(the Numerical family)、数据驱动法(Data-driven methods)和混合法(the Hybrid family of solvers)。

每个方法的详细讲解看原文~

解析法应用之TwoBoneIK

TwoBoneIK正如其名两个骨骼(不包括根骨骼),使用起来简单,应用也较多,比如:UE4.26的SolveBasicTwoBoneIK、FAnimNode_TwoBoneIK、Advanced Locomotion System V4插件。

由于三个点确定一个平面,所以需要增加一个控制点(也就是UE4中的PoleVector 极坐标点)来解三维空间内的旋转角度。

虚幻引擎的TwoboneIK心得 -- Joint Target - 知乎 (zhihu.com)

关于极向量的设置↑

Joint Target

简介

FK通过关节旋转和长度计算出每一个子骨骼所在的位置,IK则是通过一个目标位置和根节点位置来计算中间关节的位置。IK也是程序化动画的重要部分,有了它才可以把程序计算出来的位置反推出骨骼链的变换。

计算FK很简单,从父骨骼用矩阵乘法乘过去就可以了。

但是IK的计算就没那么简单了。就算是最简单的TwoboneIK,也需要引入一个极坐标的变量来定位Joint骨骼所在的平面,更别说更复杂的多骨骼IK了。

Twobone IK

TwoboneIK的原理其实就是用余弦定理求解角度,然后算出Joint的位置。

基本术语

  • Root Bone,根骨骼,腿部IK的时候叫Hip。
  • Joint Bone,这个中文咋翻译,反正就是中间的骨骼?腿部IK叫knee。
  • End Bone,末端骨骼,腿部IK时候叫heel或者foot。
  • Effector,目标位置,endbone想挪到的位置,有时候需要带旋转来确定endbone的方向。
  • Joint Target,PoleVector,极向量,通过Root-JointTarget-Endbone寻找一个平面放置Joint Bone。

参考文章:IK节点详解 - 知乎 (zhihu.com)

TwoBoneIk节点的IK计算涉及到3个骨骼,一个End bone(即设置的IK bone,如hand_r),一个joint bone(end bone的父骨骼,如lowerarm_r),一个root bone(joint bone的父骨骼, 如upperarm_r)。

配置:

IKBone: End bone的骨骼名。

Effector Location: 指定End bone最终的位置.

Joint Target Location: 该点和Effector Location、root bone三个点确定的平面将会是joint bone所在的平面,因为通过计算后的joint bone位置可以有无数个,通过指定Joint Target Location可以使joint bone在比较合适平面,Joint Target Location的值需要不断试验来得到最合适的值。

Effector Location Space: EffectorLocation的坐标系,World Space世界坐标系,Component Space组件空间坐标系,Parent Bone Space以EffectorSpaceBoneName配置的骨骼的父骨骼为原点的坐标系,Bone Space以EffectorSpaceBoneName配置的骨骼为原点的坐标系。

Effector Space Bone Name: 如果EffectorLocationSpace选择了Bone Space/Parent Bone Space, 指定是哪一个骨骼。

Joint Target Location Space: 指定Joint Target Location的坐标系。

bAllowStreching: 是否允许调整臂长。

FABRIK

前向和后向到达IK(Forward and Backward Reaching Inverse Kinematics)支持多个骨骼的IK计算,与TwoBoneIk的计算不同,FABRIK通过往前和往后遍历骨骼链的方式使骨骼的位置收敛于解决方案(可能不是最好的,由迭代次数和精度决定)。

下图表示一次骨骼A的IK计算的过程:

配置:

Percision(精度):迭代开始前,如果Tip bone的位置与新位置的距离,小于该精度表示不需要进行IK计算;迭代开始后,tip bone的父骨骼到新位置的距离与实际Tip bone臂长的差,小于该精度则停止迭代。

Tip Bone: 指定IK链的末端骨骼,如hand.

Root Bone: 指定IK链的根骨骼,如pelvis.

Max Iteration: 最大迭代次数,默认10。

Effector Transform: Tip bone 新的变换量;

Effector Tansform Space: 指定Effector Transform的值是相对于世界坐标系(World Space),组件坐标系(Component Space),父骨骼坐标系(Parent Bone Space)还是指定的骨骼的坐标系(Bone Space)的。

Effector Transform Bone: 如果Effector Tansform Space选择了Bone Space, 该选项就是指定是哪一个骨骼的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/133773.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】线程的概念

文章目录 📖 前言1. 线程的引入1.1 执行流:1.2 线程的创建:1.3 线程的等待: 2. 查看线程2.1 链接线程库:2.2 ps -aL: 3. 页表的认识3.1 二级页表:3.2 页表的实际大小: 4. 再看线程4.…

WPF——Control与Template理解

文章目录 一、前言二、控件三、模板3.1 DataTemplate3.2 ControlTemplate3.3 ContentPresenter 四、结语 一、前言 最近又翻看了下刘铁猛的《深入浅出WPF》,发现对模板章节中的部分内容有了更深的体会,所以写篇文扯扯。 文章标题是Control与Template&a…

Linux vim的常见基本操作

目录 vim是一款多模式的编辑器 命令模式下: 用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格 gg:定位到代码第一行 nshiftg 定位到任意一行/最后一行 「 $ 」:移动到光标所在行的结尾 「 ^ 」&…

python基础开发篇3——线上环境部署Django项目

文章目录 一、基本了解二、打包本地项目三、服务器环境准备四、安装web服务4.1 使用uwsgi代理4.2 使用nginx代理(推荐) 五、部署daphne 一、基本了解 部署思路: Nginx服务接收浏览器的动态请求,再通过uwsgi模块将请求转发给uwsgi服…

利用html+css+js实现回到顶部小功能

本章教程,主要是实现一个网站中比较常见的小功能,这个功能就是回到顶部。 功能描述:当浏览器右侧的滚动条,滑动到某个位置的时候,显示回到顶部图标,回到顶部之后,图标作隐藏处理,本文…

c++数据类型

基本数据类型简介 位、字节和内存寻址 最小的内存单位是二进制数字(也称为位),它可以保存 0 或 1 的值。你在现代计算机体系结构中,每个位都没有自己唯一的内存地址。这是因为内存地址的数量有限,并且很少需要逐位访…

目标检测笔记(十四): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)

文章目录 一、目标检测介绍二、YOLOv8介绍三、源码获取四、环境搭建4.1 环境检测 五、数据集准备六、 模型训练6.1 方式一6.2 方式二6.3 针对其他任务 七、模型验证八、模型测试九、模型转换9.1 转onnx9.1.1 方式一 9.2 转tensorRT9.2.1 trtexec9.2.2 代码转换9.2.3 推理代码 一…

《JDK17新特性和代码案例演示》

《JDK17新特性和代码案例演示》 🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全…

酷开系统音乐频道,用音乐治愈你!

音乐作为娱乐生活中的一部分,它可以起到调节心情让身体放松的作用,同时还可以舒缓压力,给大脑一个休息的时间。有句话说得好:“耳机是人类的避难所,音乐是心脏的救命丸”。音乐是一种疗愈身心的存在,耳机线…

最新版WPS 2023 加载Zotero方法

安装wps2019vba.exe,获取链接:链接:https://pan.baidu.com/s/1eeoc6Tmwyzxh3n1MFQTVeA 提取码:6431 –来自百度网盘超级会员V8的分享 打开WPS的工具的加载项 添加文件路径,我的在: C:\Users\Administrat…

Vue3+Ts中使用Jquery

1、安装jquery:npm i jquery --save 2、在vue.config.js文件中添加如下代码: const { defineConfig } require(vue/cli-service) const webpack require(webpack)module.exports defineConfig({configureWebpack: {plugins: [// 配置jQuerynew webp…

【C++ 学习 ㉑】- 详解 map 和 set(上)

目录 一、C STL 关联式容器 二、pair 类模板 三、set 3.1 - set 的基本介绍 3.2 - set 的成员函数 3.1.1 - 构造函数 3.1.2 - 迭代器 3.1.3 - 修改操作 3.1.4 - 其他操作 四、map 4.1 - map 的基本介绍 4.2 - map 的成员函数 4.2.1 - 迭代器 4.2.2 - operator[] …

解决出现的java: 无法访问org.springframework.boot.SpringApplication问题~

错误描述如下所示&#xff1a; 错误原因&#xff1a;版本号匹配不一致导致的&#xff0c;61.0对应jdk17&#xff0c;52.0对应jdk8。 而我本地的java为java8&#xff0c;因此需要降低版本&#xff0c;即可解决该问题 <groupId>org.springframework.boot</groupId>…

EndNote21 | 安装及库的创建

EndNote21 | 安装及库的创建 一、EndNote21安装二、EndNote21库的创建 一、EndNote21安装 软件安装界面&#xff0c;双击“EndNote 21.exe”程序&#xff1b; 图1 安装软件界面点击next&#xff0c;选择30天试用&#xff0c;点击next&#xff1b; 图2 安装过程点击next&…

深入理解Linux网络笔记(一):内核是如何接收网络包的

本文为《深入理解Linux网络》学习笔记&#xff0c;使用的Linux源码版本是3.10&#xff0c;网卡驱动是Intel的igb网卡驱动 Linux源码在线阅读&#xff1a;https://elixir.bootlin.com/linux/v3.10/source 1、内核是如何接收网络包的 1&#xff09;、Linux网络收包总览 在TCP/I…

腾讯mini项目-【指标监控服务重构】2023-08-20

今日已办 PPT制作 答辩流程 概述&#xff1a;对项目背景、架构进行介绍&#xff08;体现我们分组的区别和需求&#xff09;人员&#xff1a;小组成员进行简短的自我介绍和在项目中的定位&#xff0c;分工进展&#xff1a;对项目进展介绍&#xff0c;其中a、b两组的区别和工作…

Azure + React + ASP.NET Core 项目笔记一:项目环境搭建(二)

有意义的标题 pnpm 安装umi4 脚手架搭建打包语句变更Visual Studio调试Azure 设置变更发布 pnpm 安装 参考官网&#xff0c;或者直接使用npm安装 npm install -g pnpmumi4 脚手架搭建 我这里用的umi4&#xff0c;官网已附上 这里需要把clientapp清空&#xff0c;之后 cd Cl…

YUVToRGB(CUDA Conversion)库的学习

目录 前言1. YUVToRGB1.1 Supported Feature1.2 Performance1.2.1 Performance Table1.2.2 How to Benchmark1.2.3 How to Verify the Accuracy 1.3 User Integration1.4 Summary 2. YUVToRGB案例2.1 环境配置2.2 run案例 3. YUVToRGB浅析4. 补充知识4.1 YUV不同格式区别4.2 Lu…

代码随想录算法训练营Day60 | 84. 柱状图中最大的矩形

文章目录 84. 柱状图中最大的矩形首尾加 0双指针 84. 柱状图中最大的矩形 题目链接 | 解题思路 本题和接雨水的题目相互呼应&#xff0c;但是难度略有提升&#xff0c;同样是一道非常棒的题&#xff01; 在接雨水中&#xff0c;需要找到每一列的左侧最大值和右侧最大值&…

Mybatis基础知识(一)

Mybatis基础知识(一) Mybatis基础知识 Mybatis基础知识(一)一、MyBatis特性二、和其它持久化层技术对比三、MyBatis的简单使用1、创建maven工程2、创建pojo对象3、创建MyBatis的核心配置文件①properties②typeAliases③environments:④mappers:引入映射文件 4、创建mapper接口…