chopper:目录​zhuanlan.zhihu.com

本篇文章主要介绍三维空间下旋转的三种表示形式:四元数、矩阵和欧拉角,阐述了三种旋转表示的数学原理并且对比了它们的优缺点。目录结构:

  • 四元数
  • 旋转矩阵
  • 欧拉角
  • 参考

1. 四元数

四元数(Quaternion)是由爱尔兰数学家威廉•卢云•哈密顿在1843年发现的数学概念,在图形学中有重要的应用。在3D程序中,通常用四元数来计算3D物体的旋转角度,与矩阵相比,四元数更加高效,占用的储存空间更小,此外也更便于插值。

任意一个四元数可以表示为:

其中,

,注意
,但是
。四元数的长度(模长)表示为
,通常将四元数规一化(Normalized),即:

四元数本质上是复数(Complex Number),复数就存在一个共轭的概念。若两个复数的实部相等,虚部互为相反数,则称这两个复数互为共轭(Conjugate),

的共轭复数
表示为:

四元数间的运算,遵循复数间运算法则。

加减法:

与系数的乘积:

点积:

四元数点积与向量点积相似,也可以计算四元数之间的角度差,即:

四元数间的乘积不遵守交换律,表示为:

等式展开得:

其中,

任意一个四元数可以分解为向量和标量两部分,即

,则两个四元数
的乘积有下列等式成立,具体的推导参见[2][3]:

根据欧拉旋转定理,任何坐标系的相对定向,可以用四个数来规定。四元数原理的核心也在于:三维空间内,所有的旋转都可以用四个数来表示。通过四元数来计算旋转,它能减少所需的工作,并减小舍入误差。在电脑图形学里,四元数的插值计算是很简单的,这有非常重要的应用价值。

图1. 绕着指定轴的旋转[1]

在三维空间上,物体绕着任意一条轴旋转

度,任意一个绕着指定点的旋转都可以表示成绕着经过该点的轴的旋转,如图1所示,考虑绕着点
的旋转,任意一个点
经过旋转变换后,得到新的点
。用四元数表示绕着轴
旋转
角度的旋转:

其中,

相反,给定一个四元数

,可以计算出它表示的旋转轴和角度,如下所示:

其中,若

,则
表示绕着任意坐标轴旋转
度。

假设存在一个向量

和一个四元数
,四元数可以表示一个旋转,把向量
进行旋转变换,得到新向量
,可以表示为:

把等式(10)代入等式(13),且由拉格朗日公式

,上式可以简化为:

若对向量

进行四元数
表示的旋转的逆变换,得到新向量
,可以表示为:

可以简化为:

图2. 线性插值

最后,介绍下四元数的球面插值。以线性插值为例,如图2所示,在两个向量

之间插值,得到等式
,线性插值存在一个缺点是,在以
为半径的圆的曲线轨迹上不是恒速变化的。
图3. 球面插值

四元数的球面插值(Spherical Linear Interpolation)仍然只用于表示旋转,它是关于单位四元数构成的球表面上的操作。如图3所示,作辅助线,经过点

作一条平行于
的直线,
相交于点
;经过点
作一条直线垂直于
,并交于点
; 经过点
,作一条直线平行于
,与
交于点
。易知,
,则易知
,即有:

同理,可以计算出:

四元数的球面插值可以表示为:

四元数广泛的应用在3D游戏动作的旋转表示,四元数表示旋转不直观,但是更健壮、更高效。四元数只有4个值,矩阵有9个,花费更少的空间和时间。当使用浮点数对矩阵进行大量的操作,浮点数的误差就会不断累积到矩阵,误差的累积会使得旋转的计算发生错误,四元数的计算更少,误差也会相应的更少,也不会出现欧拉角中出现的万向节死锁。

2. 旋转矩阵

在二维空间上,绕着原点,沿着逆时针方向旋转

角,可以用
的矩阵表示为:

在三维空间上,绕着

轴、
轴、
轴的旋转分别用
的矩阵
表示,有

其中,沿着坐标轴相反的方向观察,

表示逆时针旋转的角度。

如果希望三维空间上的物体能绕着

轴旋转
度,旋转中心的齐次表示为
,那么该如何进行变换呢[1]?由于采用矩阵形式的变换,可以用矩阵的乘积来叠加。首先,应该进行平移变换,使
点与原点重合,这一过程可以用
表示;然后,进行旋转变换
;最后,再进行位移变换,返回至物体原先坐标。总的变换矩阵用
表示,则可以用
表示变换后的点,
为:

在三维空间上,物体绕着任意一条轴旋转

度可以用
的旋转矩阵
表示[1]。任意一个绕着指定点的旋转都可以表示成绕着经过该点的轴的旋转,如图1所示,考虑绕着点
的旋转,任意一个点
经过旋转变换后,得到新的点
。我们可以把这样的旋转分解为几个步骤:
  • 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等形式,旋转的顺序影响结果。

Pitch
Yaw
Roll

欧拉角很重要的一个优点就是直观,容易理解,但是也存在一些致命的缺点。旋转的顺序会影响旋转的结果,不同的应用又可能使用不同的旋转顺序,旋转顺序无法统一。3个旋转的角度可以不受限制,即可以是10000度,也可以是-1500度。还可能造成万向节死锁(Gimbal Lock)。

如图5所示,当两个环发生重叠的时候,就会丢失了一个自由度,也正是由于锁的存在,无法使用欧拉角实现球面平滑的插值。万向节死锁可以参考[6]提供的视频,对知识点的介绍非常的形象生动。

图5. 万向节死锁

参考

[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>.

方形物体绕中心旋转的扭力_三维旋转相关推荐

  1. 方形物体绕中心旋转的扭力_转轴扭力测试方案

    什么是转轴扭力?转轴是连接产品能够承受弯矩以及承受扭矩的轴:扭力,指扭转物体使物体产生形变的力.扭力计施力于轴上或旋转臂所产生之旋转力:力臂长x磨擦力量之大小为扭力值. 转轴可分为无扭力式和扭力式: ...

  2. unity三维向量变化为角度_三维旋转

    chopper:目录​zhuanlan.zhihu.com 本篇文章主要介绍三维空间下旋转的三种表示形式:四元数.矩阵和欧拉角,阐述了三种旋转表示的数学原理并且对比了它们的优缺点.目录结构: 四元数 ...

  3. JAVA梅森旋转随机算法_梅森旋转算法

    概念 梅森旋转算法(Mersenne twister),可以快速产生高质量的伪随机数,修正了古典随机数发生算法的很多缺陷. 常见的两种为基于32位的 MT19937和基于64位的 MT19937-64 ...

  4. createbitmap 旋转90度_如何旋转的位图90度

    here is the statement in android canvas.drawBitmap(visiblePage, 0, 0, paint); Now I add canvas.rotat ...

  5. 四元数左乘右乘_四元数——旋转

    四元数系列: ----------------------------------------- 首先很感谢各位的支持,本来我也就是说写个自己看的笔记啥的,没想到那么多人点赞.本篇主要介绍旋转相关的知 ...

  6. 彻底搞懂“旋转矩阵/欧拉角/四元数”,让你体会三维旋转之美

    目录 旋转矩阵 坐标变换的作用 实现坐标变换所需的数据 位姿变换 坐标变换中旋转的实质 坐标变换中平移的实质 如何计算坐标系B各坐标轴在坐标系A上的投影?(多坐标变换) 如何实现坐标变换? 欧拉角 欧 ...

  7. 三维旋转四元数系列(2.三维旋转之轴角与罗德里格斯公式推导)

    序:上两节我们介绍了复数的基本概念与性质,以及复数与二维旋转的关系. 三维旋转四元数系列(0.复数基本介绍)https://blog.csdn.net/SKANK911/article/details ...

  8. Unity 基础 之 一个点(物体)绕另一个点(物体)旋转的简单封装

    Unity 基础 之 一个点(物体)绕另一个点(物体)旋转的简单封装 目录 Unity 基础 之 一个点(物体)绕另一个点(物体)旋转的简单封装 一.简单介绍 二.实现原理 三.注意事项 四.效果预览 ...

  9. 三维坐标系带偏航角俯仰角_浅谈三维旋转的三种方法及差异

    概述 在3D图形学中,几何变换大致分为三种:平移变换(Translation).缩放变换(Scaling).旋转变换(Rotation),而其中又以旋转变换(Rotation)最为复杂,通常旋转变换( ...

最新文章

  1. Datawhale厦门大学分享记录!
  2. 机器学习狗太苦逼了!自动化调参哪家强?
  3. orm 通用方法——RunProc调用存储过程
  4. [51nod1376] 最长递增子序列的数量
  5. axios04-文件上传
  6. mybatis+dubbo+ springmvc+zookeeper分布式架构
  7. 读《嵌入式系统项目分析入门与实践》⑤
  8. 华三云:不做开源的投机者
  9. 出国?上研?工作?回家种田?(二) 专业与上研相关问题
  10. datastax.repo_使用Datastax Java驱动程序与Cassandra进行交互
  11. 【数据结构与算法】【算法思想】动态规划
  12. 升级版的数据透视表!用一工具,做出了HR羡慕的人力数据分析
  13. 自然语言处理包pytorch、torchvision、torchtext安装(亲测有效)
  14. java小程序详解_微信小程序登录Java后台接口(详解,附示例代码)
  15. 做微信营销你知道男女用微信的习惯吗?
  16. JellyViewPager
  17. 【JAVA】什么时候会发生空指针异常
  18. Dagger2和MVParms的学习
  19. 批量给多个 Excel 工作簿文件添加文字水印或图片水印
  20. python设置散点图点的大小_matplotlib - pyplot散点图标记大小

热门文章

  1. Account Hierarchy in SAP CRM and C4C
  2. why FOR ALL ENTRIES is not considered at all in one order search
  3. Currency determination callback
  4. jMeter工具里左边树形结构里一些节点属性的介绍
  5. 一个最简单的例子学会使用nodejs redis库进行数据库操作
  6. 真心酸,程序员工作了十年,衣服和电脑包破了都没钱买新的
  7. 如何启用SAP C4C OData Event Notification
  8. 如何在Kubernetes里创建一个Nginx service 1
  9. 线程打印_线程知识回顾
  10. ping 计算机名 ipv4,09. 查看本地链路地址(fe80);ping主机名称时IP