方形物体绕中心旋转的扭力_三维旋转
本篇文章主要介绍三维空间下旋转的三种表示形式:四元数、矩阵和欧拉角,阐述了三种旋转表示的数学原理并且对比了它们的优缺点。目录结构:
- 四元数
- 旋转矩阵
- 欧拉角
- 参考
1. 四元数
四元数(Quaternion)是由爱尔兰数学家威廉•卢云•哈密顿在1843年发现的数学概念,在图形学中有重要的应用。在3D程序中,通常用四元数来计算3D物体的旋转角度,与矩阵相比,四元数更加高效,占用的储存空间更小,此外也更便于插值。
任意一个四元数可以表示为:
其中,
四元数本质上是复数(Complex Number),复数就存在一个共轭的概念。若两个复数的实部相等,虚部互为相反数,则称这两个复数互为共轭(Conjugate),
四元数间的运算,遵循复数间运算法则。
加减法:
与系数的乘积:
点积:
四元数点积与向量点积相似,也可以计算四元数之间的角度差,即:
四元数间的乘积不遵守交换律,表示为:
等式展开得:
其中,
任意一个四元数可以分解为向量和标量两部分,即
根据欧拉旋转定理,任何坐标系的相对定向,可以用四个数来规定。四元数原理的核心也在于:三维空间内,所有的旋转都可以用四个数来表示。通过四元数来计算旋转,它能减少所需的工作,并减小舍入误差。在电脑图形学里,四元数的插值计算是很简单的,这有非常重要的应用价值。
在三维空间上,物体绕着任意一条轴旋转
其中,
相反,给定一个四元数
其中,若
假设存在一个向量
把等式(10)代入等式(13),且由拉格朗日公式
若对向量
可以简化为:
最后,介绍下四元数的球面插值。以线性插值为例,如图2所示,在两个向量
四元数的球面插值(Spherical Linear Interpolation)仍然只用于表示旋转,它是关于单位四元数构成的球表面上的操作。如图3所示,作辅助线,经过点
同理,可以计算出:
四元数的球面插值可以表示为:
四元数广泛的应用在3D游戏动作的旋转表示,四元数表示旋转不直观,但是更健壮、更高效。四元数只有4个值,矩阵有9个,花费更少的空间和时间。当使用浮点数对矩阵进行大量的操作,浮点数的误差就会不断累积到矩阵,误差的累积会使得旋转的计算发生错误,四元数的计算更少,误差也会相应的更少,也不会出现欧拉角中出现的万向节死锁。
2. 旋转矩阵
在二维空间上,绕着原点,沿着逆时针方向旋转
在三维空间上,绕着
其中,沿着坐标轴相反的方向观察,
如果希望三维空间上的物体能绕着
在三维空间上,物体绕着任意一条轴旋转
- i. 把轴
进行两次旋转变换,即和,使得轴与轴方向相同;
- ii. 绕着
轴旋转度,即;
- iii. 与第i步相反的旋转变换,使得轴
恢复到最初方向。
组合上述5个旋转变换,总的变换可以表示为
把等式(21)中的变换等式代入(23)中,可以得到总的变换等式
其中,
相反,若给定一个旋转矩阵
由等式(24),可以计算出旋转的角度为
轴
旋转矩阵
- i.
- ii.
- iii.
单位四元数
旋转矩阵在图形渲染中占据着非常重要的作用,它支持传递性,使用起来很简单方便,但是不直观,比较浪费内存,至少需要12个参数矩阵插值的实现难度很大。
3. 欧拉角
欧拉角是用于描述刚体在三维空间的朝向,它是相对于指定参考坐标系的旋转,一个刚体的朝向,依赖于参考坐标系,按一定顺序,做出的三个欧拉角的旋转而构成的。
欧拉角包括3个旋转,根据这3个旋转来指定一个刚体的朝向。这3个旋转分别绕x轴,y轴和z轴,分别称为Pitch,Yaw和Roll,如图4所示。欧拉角可以表示成z-x-z,x-y-x,z-y-z等形式,旋转的顺序影响结果。
欧拉角很重要的一个优点就是直观,容易理解,但是也存在一些致命的缺点。旋转的顺序会影响旋转的结果,不同的应用又可能使用不同的旋转顺序,旋转顺序无法统一。3个旋转的角度可以不受限制,即可以是10000度,也可以是-1500度。还可能造成万向节死锁(Gimbal Lock)。
如图5所示,当两个环发生重叠的时候,就会丢失了一个自由度,也正是由于锁的存在,无法使用欧拉角实现球面平滑的插值。万向节死锁可以参考[6]提供的视频,对知识点的介绍非常的形象生动。
参考
[1] F. Hill, and S. Kelley. Computer Graphics Using OpenGL, 3/E, Pearson, 2007.
[2] WIKIPEDIA. “Quaternions and spatial rotation. website<https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation>
[3] WIKIPEDIA. “Quaternions.” website< https://en.wikipedia.org/wiki/Quaternion>.
[4] WIKIPEDIA. “Euler angles.” website< https://en.wikipedia.org/wiki/Euler_angles>.
[5] Fletcher Dunn and Ian Parberry. 3D math primer for graphics and game development. CRC Press, 2015.
[6] Youku, “欧拉旋转.”, website<https://v.youku.com/v_show/id_XNzkyOTIyMTI=.html>.
方形物体绕中心旋转的扭力_三维旋转相关推荐
- 方形物体绕中心旋转的扭力_转轴扭力测试方案
什么是转轴扭力?转轴是连接产品能够承受弯矩以及承受扭矩的轴:扭力,指扭转物体使物体产生形变的力.扭力计施力于轴上或旋转臂所产生之旋转力:力臂长x磨擦力量之大小为扭力值. 转轴可分为无扭力式和扭力式: ...
- unity三维向量变化为角度_三维旋转
chopper:目录zhuanlan.zhihu.com 本篇文章主要介绍三维空间下旋转的三种表示形式:四元数.矩阵和欧拉角,阐述了三种旋转表示的数学原理并且对比了它们的优缺点.目录结构: 四元数 ...
- JAVA梅森旋转随机算法_梅森旋转算法
概念 梅森旋转算法(Mersenne twister),可以快速产生高质量的伪随机数,修正了古典随机数发生算法的很多缺陷. 常见的两种为基于32位的 MT19937和基于64位的 MT19937-64 ...
- createbitmap 旋转90度_如何旋转的位图90度
here is the statement in android canvas.drawBitmap(visiblePage, 0, 0, paint); Now I add canvas.rotat ...
- 四元数左乘右乘_四元数——旋转
四元数系列: ----------------------------------------- 首先很感谢各位的支持,本来我也就是说写个自己看的笔记啥的,没想到那么多人点赞.本篇主要介绍旋转相关的知 ...
- 彻底搞懂“旋转矩阵/欧拉角/四元数”,让你体会三维旋转之美
目录 旋转矩阵 坐标变换的作用 实现坐标变换所需的数据 位姿变换 坐标变换中旋转的实质 坐标变换中平移的实质 如何计算坐标系B各坐标轴在坐标系A上的投影?(多坐标变换) 如何实现坐标变换? 欧拉角 欧 ...
- 三维旋转四元数系列(2.三维旋转之轴角与罗德里格斯公式推导)
序:上两节我们介绍了复数的基本概念与性质,以及复数与二维旋转的关系. 三维旋转四元数系列(0.复数基本介绍)https://blog.csdn.net/SKANK911/article/details ...
- Unity 基础 之 一个点(物体)绕另一个点(物体)旋转的简单封装
Unity 基础 之 一个点(物体)绕另一个点(物体)旋转的简单封装 目录 Unity 基础 之 一个点(物体)绕另一个点(物体)旋转的简单封装 一.简单介绍 二.实现原理 三.注意事项 四.效果预览 ...
- 三维坐标系带偏航角俯仰角_浅谈三维旋转的三种方法及差异
概述 在3D图形学中,几何变换大致分为三种:平移变换(Translation).缩放变换(Scaling).旋转变换(Rotation),而其中又以旋转变换(Rotation)最为复杂,通常旋转变换( ...
最新文章
- Datawhale厦门大学分享记录!
- 机器学习狗太苦逼了!自动化调参哪家强?
- orm 通用方法——RunProc调用存储过程
- [51nod1376] 最长递增子序列的数量
- axios04-文件上传
- mybatis+dubbo+ springmvc+zookeeper分布式架构
- 读《嵌入式系统项目分析入门与实践》⑤
- 华三云:不做开源的投机者
- 出国?上研?工作?回家种田?(二) 专业与上研相关问题
- datastax.repo_使用Datastax Java驱动程序与Cassandra进行交互
- 【数据结构与算法】【算法思想】动态规划
- 升级版的数据透视表!用一工具,做出了HR羡慕的人力数据分析
- 自然语言处理包pytorch、torchvision、torchtext安装(亲测有效)
- java小程序详解_微信小程序登录Java后台接口(详解,附示例代码)
- 做微信营销你知道男女用微信的习惯吗?
- JellyViewPager
- 【JAVA】什么时候会发生空指针异常
- Dagger2和MVParms的学习
- 批量给多个 Excel 工作簿文件添加文字水印或图片水印
- python设置散点图点的大小_matplotlib - pyplot散点图标记大小
热门文章
- Account Hierarchy in SAP CRM and C4C
- why FOR ALL ENTRIES is not considered at all in one order search
- Currency determination callback
- jMeter工具里左边树形结构里一些节点属性的介绍
- 一个最简单的例子学会使用nodejs redis库进行数据库操作
- 真心酸,程序员工作了十年,衣服和电脑包破了都没钱买新的
- 如何启用SAP C4C OData Event Notification
- 如何在Kubernetes里创建一个Nginx service 1
- 线程打印_线程知识回顾
- ping 计算机名 ipv4,09. 查看本地链路地址(fe80);ping主机名称时IP