三维旋转:旋转矩阵,欧拉角,四元数

2023-11-17

在介绍下面的文章前,大家如果接触到欧拉角的话,就一定要关注一个词,要顺规,在欧拉角体系里面,有12种顺规,这一点是好多文章没有让读书意识到,导致后面学习图形学里面的“heading, pitch, bank"时对不上号,一般百度百科里面说到的,都是zxz的顺规旋转出来的方位,12种顺规包括以下列”


由于欧拉角的定义太广义,实际中会有比较具体的定义:

  • 静态定义:3个欧拉角是与固定轴的夹角,有12中顺规定义(维基百科)
  • 动态定义:围绕世界坐标系旋转、围绕载体坐标系旋转

12中顺规:(12种)

  • 非对称型欧拉角: XYZ,XZY,YXZ,YZX,ZXY,ZYX
  • 对称型欧拉角: XYX,XZX,YXY,YZY,ZXZ,ZYZ

如何描述三维空间中刚体的旋转,是个有趣的问题。具体地说,就是刚体上的任意一个点P(x, y, z)围绕过原点的轴(i, j, k)旋转θ,求旋转后的点P\'(x\', y\', z\')。

旋转矩阵

旋转矩阵乘以点P的齐次坐标,得到旋转后的点P',因此旋转矩阵可以描述旋转,

xyz1=Rxyz1

绕x,y,或z轴旋转θ的矩阵为:

Rx(θ)=1000cosθsinθ0sinθcosθ

Ry(θ)=cosθ0sinθ010sinθ0cosθ

Rz(θ)=cosθsinθ0sinθcosθ0001

所以,绕任意轴旋转的矩阵为

Rx(p)Ry(q)Rz(θ)Ry(q)Rx(p)

这表示:

1. 绕x轴旋转角度p使指定的旋转轴在xz平面上
2. 绕y轴旋转角度q使指定的旋转轴与z轴重合
3. 绕z轴旋转角度θ
4. 绕y轴旋转角度-q
5. 绕x轴旋转角度-p

其中,p和q的值需要用i,j,k计算出来。

欧拉角

欧拉角也可以描述三维刚体旋转,它将刚体绕过原点的轴(i,j,k)旋转θ,分解成三步(蓝色是起始坐标系,而红色的是旋转之后的坐标系。)。

 

1. 绕z轴旋转α,使x轴与N轴重合,N轴是旋转前后两个坐标系x-y平面的交线
2. 绕x轴(也就是N轴)旋转β,使z轴与旋转后的z轴重合
3. 绕z轴旋转γ,使坐标系与旋转后的完全重合

按照旋转轴的顺序,该组欧拉角被称为是“zxz顺规”的。对于顺规的次序,学术界没有明确的约定。

欧拉角的旋转矩阵为:

Rz(α)Rx(β)Rz(γ)

在旋转矩阵一节中,最先进行的旋转其矩阵在最右侧,说明该矩阵最先与点的齐次坐标相乘,旋转矩阵按照旋转的次序从右向左排列。而在欧拉角中,最先进行的旋转其旋转矩阵在最左边。这是因为,**对于前者(旋转矩阵),我们始终是以绝对参考系为参照来的,对于后者(欧拉角),我们每一次旋转的刻画都是基于刚体的坐标系。**比如,在欧拉角中的第2步,绕x轴旋转β,这里的x轴实际上是N轴了(而不是蓝色的x轴)。

为什么旋转参考系的不同会导致旋转矩阵次序的差异呢?细想一下便知,旋转矩阵左乘叠加用以描述三维变换效果的叠加,这本身就是基于绝对坐标系的,所以旋转矩阵一节没有疑问;而对于欧拉角一节的这种旋转方式,这样考虑:

1. 如果有一个“影子坐标系3”与原坐标系重合,然后首先进行了第3步(绕z轴旋转γ);
2. 然后有一个“影子坐标系2”也与原坐标系重合,然后与“影子坐标系3”一起(视作同一个刚体)进行了第二步;
3. 最后一个“影子坐标系1”,与前两个坐标系一起进行了第一步。

此时,考察“影子坐标系”1和2,他们就分别落在了欧拉角旋转的两个“快照”上,而“影子坐标系3”就落在旋转后的位置上(红色的)。而在上述过程中,“影子坐标系3”就是相对于绝对坐标系依次进行了第三步,第二步,和第一步。所以欧拉角的旋转矩阵写成那样,也是行得通的。

这个想法,我猜在很多第一人称游戏中,已经得到了广泛应用了。这样,玩家对人物的控制就可以绕开人物的实时状态(位置,角度等)直接对人物的模型矩阵产生影响。

万向节死锁是欧拉角的一个弊端,这是一个直观的例子

四元数

四元数是今天的主角,它能够很方便的刻画刚体绕任意轴的旋转。四元数是一种高阶复数,四元数q表示为:

q=(x,y,z,w)=xi+yj+zk+w

其中,i,j,k满足:

i2=j2=k2=1

ij=k,jk=i,ki=j

由于i,j,k的性质和笛卡尔坐标系三个轴叉乘的性质很像,所以可以将四元数写成一个向量和一个实数组合的形式:

q=(v⃗ +w)=((x,y,z),w)

可以推导出四元数的一些运算性质,包括:

* 四元数乘法

q1q2=(v1×v2+w1v2+w2v1,w1w2v1v2)

* 共轭四元数

q=(v⃗ ,w)

* 四元数的平方模

N(q)=N(v⃗ )+w2

* 四元数的逆

q1=qN(q)

四元数可以看做是向量和实数的一种更加一般的形式,向量可以视作为实部为0的四元数,而实数可以是作为虚部为0的四元数。上述四元数的运算性质也是实数或向量的运算性质的更一般的形式。

四元数可用来刻画三维空间中的旋转,绕单位向量(x,y,z)表示的轴旋转θ,可令:

q=((x,y,z)sinθ2,cosθ2)

刚体坐标系中的点p(P,0)(写成四元数的形式),旋转后的坐标p'为:

p=qpq1

接下来我们来证明这一点。

首先,我们证明

qpq1=(sq)p(sq)1

其中s为实数。显然

(sq)p(sq)1=sqpq1s1=sqp1

此时,我们可以将q看做是单位矩阵,因为如果q不是单位矩阵,我们就可以乘以一个常数s将其化为单位矩阵。

然后,我们证明qpq^{-1}和p的模长相等

下面将q视为单位四元数:

q1=q

四元数q的标量:

S(q)=(q+q)/2

那么:

2S(qpq1)=2S(qpq)=qpq+(qpq)=qpq+qpq=q(p+p)q=q2S(p)q=2S(p)

最后,我们证明

p=qpq

如图所示,u为旋转轴,旋转角度为σ,向量v旋转到w处。旋转到σ/2处为k(图中未标出)。

下面也用相同的字母指代四元数,如u就表示向量u的四元数形式((ux,uy,uz),0)。

首先,令u方向上的单位向量为u(为了方便,命名不变,后面的u都是指旋转轴方向的单位四元数),那么根据q的定义,参见四元数乘法法则:

q=(u⃗ sinθ2,cosθ2)=(v⃗ ×k⃗ ,v⃗ k⃗ )=(v⃗ ,0)(k⃗ ,0)=kv

现在令

w=qvq

如果能证明w与v的夹角是σ,那么就说明w确实是v旋转σ得到的,整个命题就得证了。

注意v,k和w都是实部为0的单位四元数,表示单位向量,我们有:

wk=(qvq1)k=qvqk=qvvkk=q

所以

wk=kv

上面的式子拆分成实部和虚部,虚部表明w与-k的平面和k与-v的平面重合,实部表明w和-k之间的夹角与k和-v之间的夹角相等,都是π-σ/2。这就说明了w与v的夹角是σ,原命题就得证了。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三维旋转:旋转矩阵,欧拉角,四元数 的相关文章

随机推荐

  • NRF52832学习笔记(1)—— 添加自有service(基于SDK15.3)

    前言 SDK版本15 3 评估板 pca10040 在uart的例程中添加battery service 添加之前 手机连上设备之后扫描到的service如下 一 分配ram空间 softdevice的flash code是确定 但ram是
  • WIKIOI – 1083 Cantor表

    题目描述 Description 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的 他是用下面这一张表来证明这一命题的 1 1 1 2 1 3 1 4 1 5 2 1 2 2 2 3 2 4 3 1 3 2 3 3 4
  • 2021上半年

    转眼间 2021年已经过去了一半 按照记账惯例 每逢月底 要对当月的财务状况进行结算 6月的话 还要再额外增加一轮年中结算 同时 受到近期一系列调整的影响 记录表也相应进行比较大的变更 以适应复杂度的增加 以至于 例行结算迟了两天才完成 但
  • 【matplotlib】AttributeError: Unknown property figsize

    AttributeError Unknown property figsize 属性错误 未知属性figsize 原代码 var YearBuilt data pd concat df train SalePrice df train va
  • Kafka【命令行操作】

    Kafka 命令行操作 Kafka 主要包括三大部分 生产者 主题分区节点 消费者 1 Topic 命令行操作 也就是我们 kafka 下的脚本 kafka topics sh 的相关操作 常用命令行操作 参数 描述 bootstrap s
  • Java中的IO流系统详解

    摘要 Java 流在处理上分为字符流和字节流 字符流处理的单元为 2 个字节的 Unicode 字符 分别操作字符 字符数组或字符串 而字节流处理单元为 1 个字节 操作字节和字节数组 Java 内用 Unicode 编码存储字符 字符流处
  • 【网络】——UDP复习笔记

    目录 1 UDP报文结构 2 UDP缓冲区 3 UDP特点 4 课后题 1 UDP报文结构 2 UDP缓冲区 UDP没有真正意义上的发送缓冲区 应用层调用sendto 函数直接将数据应用层的数据拷贝给传输层 传输层再构建UDP报头 然后再交
  • VMware——VMware Tools的介绍及安装方法

    VMware VMware Tools的介绍及安装方法 一 VMware Tools的作用 二 VMware Tools的安装步骤 参考文章 一 VMware Tools的作用 1 最大的好处是可以直接把windows界面的文件拖进linu
  • 【前端Vue】Element UI:一站式前端组件库的简单入门指南

    Element UI 一站式前端组件库的完整指南 引言 Element UI概述 常用组件介绍及用法 结语 引言 在现代的前端开发中 UI组件库扮演着至关重要的角色 它们为开发者提供了一套可重用的UI组件和工具 使得构建复杂的用户界面变得更
  • css炫酷标题,分享几个CSS小众但炫酷的技巧

    1 黑白图像 这段代码会让你的彩色照片显示为黑白照片 是不是很酷 复制代码代码如下 img desaturate filter grayscale 100 webkit filter grayscale 100 moz filter gra
  • 什么是DBMS,什么是数据库?

    马克 to win DBMS database management system 数据库管理系统 像mysql oracle sql server之类 首先没什么神秘的 都只是某个公司编的一个软件而已 比如mysql是MySQL AB公司
  • msvcp140.dll重新安装的解决方法【msvcp140.dll修复工具下载】

    msvcp140 dll文件如何安装 win10系统是目前大家常用的电脑操作系统 最近有很多用户不知道如何安装msvcp140 dll文件 这里小编今天为大家带来了msvcp140 dll文件怎么安装的方法 有需要的用户快来看看吧 msvc
  • 4.网络爬虫—Post请求(实战演示)

    网络爬虫 Post请求实战演示 POST请求 GET请求 POST请求和GET请求的区别 获取二进制数据 爬 百度官网 https www baidu com logo实战 发送post请求 百度翻译实战 使用session发送请求 模拟登
  • 喜报

    本文部分内容来自 中国AIOps现状调查报告 2023 丝小编扣1 领取完整版报告 2023年7月18日 信通院Xops产业创新发展论坛于北京成功举办 大会旨在提高企业研发运营水平 加强XOps体系建设经验分享 以三大不同主题的分论坛组成
  • 异步复位,同步释放的理解

    文章目录 什么情况下 复位信号需要做 异步复位 同步释放 处理 异步复位同步释放原理 利用前面两级触发器实现 特点 问题1 如果没有前面两级触发器的处理 异步信号直接驱动系统的触发器 会出现什么情况 问题2 复位信号存在亚稳态 有危险吗 问
  • Angular中的管道

    Angular同在在模板文件中使用一些管道 这些管道是用来对字符串 货币金额 日期等数据进行转换和格式化的 管道的本质是一些简单的函数 可以在模板表达式中用来接受输入值并返回一个按一定规则转换后的值 Angular内置管道 DatePipe
  • js数组的includes方法优化判断逻辑

    js数组的includes方法代替大量判断 优化前 function printAnimals animal if animal dog animal cat console log I have a animal printAnimals
  • Python 利用随机函数和电脑玩石头剪刀布

    首先导入第三方库 random import random 注意 使用前请先下载random函数 import random 从控制台出拳 拳头 剪刀 布 player input 请输入你要出的拳 石头 剪刀 布 电脑随机出拳 先假定电脑
  • vue+element-ui el-table组件二次封装(2023-09-03 TTable组件实现虚拟滚动,解决数据量大页面卡顿问题)

    2023 09 03 TTable组件实现虚拟滚动 解决数据量大页面卡顿问题 所有示例效果 1 简介 HTML一行代码 可以实现表格编辑 分页 表格内 外按钮操作 行内文字变色 动态字典展示 filters格式化数据 排序 显示隐藏表格内操
  • 三维旋转:旋转矩阵,欧拉角,四元数

    在介绍下面的文章前 大家如果接触到欧拉角的话 就一定要关注一个词 要顺规 在欧拉角体系里面 有12种顺规 这一点是好多文章没有让读书意识到 导致后面学习图形学里面的 heading pitch bank 时对不上号 一般百度百科里面说到的