旋转矩阵 推导

2023-10-29

旋转变换(一)旋转矩阵

1. 简介

计算机图形学中的应用非常广泛的变换是一种称为仿射变换的特殊变换,在仿射变换中的基本变换包括平移、旋转、缩放、剪切这几种。本文以及接下来的几篇文章重点介绍一下关于旋转的变换,包括二维旋转变换、三维旋转变换以及它的一些表达方式(旋转矩阵、四元数、欧拉角等)。

2. 绕原点二维旋转

首先要明确旋转在二维中是绕着某一个点进行旋转,三维中是绕着某一个轴进行旋转。二维旋转中最简单的场景是绕着坐标原点进行的旋转,如下图所示:

 

 

如图所示点v 绕 原点旋转θ 角,得到点v’,假设 v点的坐标是(x, y) ,那么可以推导得到 v’点的坐标(x’, y’)(设原点到v的距离是r,原点到v点的向量与x轴的夹角是ϕ ) 
x=rcosϕ    y=rsinϕ 
x′=rcos(θ+ϕ)   y′=rsin(θ+ϕ
通过三角函数展开得到 
x′=rcosθcosϕrsinθsinϕ 
y′=rsinθcosϕ+rcosθsinϕ 
带入x和y表达式得到 
x′=xcosθysinθ 
y′=xsinθ+ycosθ 
写成矩阵的形式是:

 

尽管图示中仅仅表示的是旋转一个锐角θ的情形,但是我们推导中使用的是三角函数的基本定义来计算坐标的,因此当旋转的角度是任意角度(例如大于180度,导致v’点进入到第四象限)结论仍然是成立的。

3. 绕任意点的二维旋转

绕原点的旋转是二维旋转最基本的情况,当我们需要进行绕任意点旋转时,我们可以把这种情况转换到绕原点的旋转,思路如下: 
1. 首先将旋转点移动到原点处 
2. 执行如2所描述的绕原点的旋转 
3. 再将旋转点移回到原来的位置

 

也就是说在处理绕任意点旋转的情况下需要执行两次平移的操作。假设平移的矩阵是T(x,y),也就是说我们需要得到的坐标 v’=T(x,y)*R*T(-x,-y)(我们使用的是列坐标描述点的坐标,因此是左乘,首先执行T(-x,-y))

在计算机图形学中,为了统一将平移、旋转、缩放等用矩阵表示,需要引入齐次坐标。(假设使用2x2的矩阵,是没有办法描述平移操作的,只有引入3x3矩阵形式,才能统一描述二维中的平移、旋转、缩放操作。同理必须使用4x4的矩阵才能统一描述三维的变换)。

对于二维平移,如下图所示,P点经过x和y方向的平移到P’点,可以得到:

 

 

x′=x+tx

y′=y+ty 
由于引入了齐次坐标,在描述二维坐标的时候,使用(x,y,w)的方式(一般w=1),于是可以写成下面矩阵的形式


按矩阵乘法展开,正好得到上面的表达式。也就是说平移矩阵是

 

如果平移值是(-tx,-ty)那么很明显平移矩阵式

 

 

我们可以把2中描述的旋转矩阵也扩展到3x3的方式,变为:

 


从平移和旋转的矩阵可以看出,3x3矩阵的前2x2部分是和旋转相关的,第三列与平移相关。有了上面的基础之后,我们很容易得出二维中绕任意点旋转的旋转矩阵了,只需要把三个矩阵乘起来即可:
 

 

4. 三维基本旋转

我们可以把一个旋转转换为绕基本坐标轴的旋转,因此有必要讨论一下绕三个坐标值x、y、z的旋转。 
本文在讨论过程中使用的是类似于OpenGL中定义的右手坐标系,同时旋转角度的正负也遵循右手坐标系的约定。如下图所示

 

 

4.1 绕X轴的旋转

在三维场景中,当一个点P(x,y,z)绕x轴旋转θ角得到点P’(x’,y’,z’)。由于是绕x轴进行的旋转,因此x坐标保持不变,y和z组成的yoz(o是坐标原点)平面上进行的是一个二维的旋转,可以参考上图(y轴类似于二维旋转中的x轴,z轴类似于二维旋转中的y轴),于是有: 
x′=x 
y′=ycosθzsinθ 
z′=ysinθ+zcosθ 
写成(4x4)矩阵的形式

 

4.2 绕Y轴旋转

绕Y轴的旋转和绕X轴的旋转类似,Y坐标保持不变,除Y轴之外,ZOX组成的平面进行一次二维的旋转(Z轴类似于二维旋转的X轴,X轴类似于二维旋转中的Y轴,注意这里是ZOX,而不是XOZ,观察上图中右手系的图片可以很容易了解到这一点),同样有: 
x′=zsinθ+xcosθ 
y′=y 
z′=zcosθxsinθ 
写成(4x4)矩阵的形式

 

 

4.3 绕Z轴旋转

与上面类似,绕Z轴旋转,Z坐标保持不变,xoy组成的平面内正好进行一次二维旋转(和上面讨论二维旋转的情况完全一样)

 

 

4.4 小结

上面描述了三维变换中绕单一轴旋转的矩阵表达形式,绕三个轴旋转的矩阵很类似,其中绕y轴旋转的矩阵与绕x和z轴旋转的矩阵略有点不同(主要是三个轴向顺序和书写矩阵的方式不一致导致的,绕三个不同坐标旋转轴以及其他二个坐标轴组成平面的顺序是: XYZ(绕x轴) YZX(绕y轴) ZXY(绕z轴),其中绕y轴旋转,其他两个轴是ZX,这和我们书写矩阵按

 

 

 


的方式不一致,而导致看起来绕Y轴旋转的矩阵似乎是和其他两个矩阵不一致。如果我们颠倒写法,将公式写成

 


的方式,那么这三个旋转矩阵看起来在形式上就统一了,都是

 

 


这种表现形式了(左上角都是−sinθ

5. 绕任意轴的三维旋转

绕任意轴的三维旋转可以使用类似于绕任意点的二维旋转一样,将旋转分解为一些列基本的旋转。绕任意轴旋转如下图所示:

 

 

P点绕向量u旋转θ角,得到点Q,已知P点的坐标和向量u,如何求Q点的坐标。 
我们可以把向量u进行一些旋转,让它与z轴重合,之后旋转P到Q就作了一次绕Z轴的三维基本旋转,之后我们再执行反向的旋转,将向量u变回到它原来的方向,也就是说需要进行的操作如下: 
1. 将旋转轴u绕x轴旋转至xoz平面 
2. 将旋转轴u绕y轴旋转至于z轴重合 
3. 绕z轴旋转θ角 
4. 执行步骤2的逆过程 
5. 执行步骤1的逆过程 
原始的旋转轴u如下图所示:

 


第1、2、3步骤如下图所示: 

 

 

 

步骤1将向量u旋转至xoz平面的操作是一个绕x轴的旋转操作,步骤2将向量u旋转到与z轴重合,第1、2步骤的示意图如下:

 


作点P在yoz平面的投影点q,q的坐标是(0, b, c),原点o与q点的连线oq和z轴的夹角就是u绕x轴旋转的角度。通过这次旋转使得u向量旋转到xoz平面(图中的or向量)【步骤1】 
过r点作z轴的垂线,or与z轴的夹角为β, 这个角度就是绕Y轴旋转的角度,通过这次旋转使得u向量旋转到与z轴重合【步骤2】

步骤1中绕x轴旋转的是一次基本的绕x轴的三维旋转,按照之前的讨论,旋转矩阵是:

 

 


这里的θ就是图中所示的α角 (注意α角度是绕x旋转的正的角度) 
从图中我们还可以得到:


于是旋转矩阵(记作 Rx(α))为:

 


在完成步骤1之后,向量u被变换到了r的位置,我们继续步骤2的操作,绕y轴旋转负的β角(注意:这里的β是负的),经过这次变换之后向量u与z轴完全重合,由于这一步也是执行的一次绕Y轴的基本旋转,旋转矩阵(记作 Ry(−β))为:

 

 


使用−β替换表达式中的θ,此外根据图中描述,我们可以计算得到:

 

 


带入上面的表达式,于是旋转矩阵(记作 Ry(−β))为:

 

在完成前面两个步骤之后,u方向和z轴完全重合,因此执行旋转θ角,执行的是一次绕z轴的基本三维旋转(记作 R(θ),根据之前的讨论,我们可以得到:


最后两步骤是前面1和2的逆操作,也就是绕Y轴旋转β 和绕X轴旋转−α,这两个矩阵分别记作 Ry(β) 和 Rx(−α),得到它们的方式很简单,只需要将上面步骤1和步骤2中的角度修改成相反数即可,也就是:

 

 

最终得到 绕任意轴u旋转的旋转矩阵是【因为使用的列向量,因此执行的是左乘(从右往左)】:

MR=Rx(−α)Ry(β)Rz(θ)Ry(−β)Rx(α)=

 

 



(注:式中的(u,v,w)对应上文中向量(a,b,c),公式我自己笔算过,为了减少编辑公式的时间(使用LaTex编辑太繁琐,因此找了一张公式的图片贴在此处)

如果向量是经过单位化的(单位向量),那么有a2+b2+c2=1,可以简化上述的公式,得到:

 

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

旋转矩阵 推导 的相关文章

随机推荐

  • Git的分支结构都有哪些

    主分支 实际开发中 一个仓库 通常只放一个项目 主要存在两条主分支 master与develop分支 这个两个分支的生命周期是整个项目周期 就是说 自创建出来就不会删除 会随着项目的不断开发不断的往里面添加代码 master分支是创建git
  • 最齐全的场景ue4模型素材,速来收藏

    家人们 最近我找到了一个很好用的场景ue4模型免费素材网站 资源贼多 重点是免费 白嫖一时爽 一直白嫖一直爽 嘿嘿嘿 感兴趣的可以进去看看 本人曾经也是废大把时间寻找资源 质量还不咋地 但是通过朋友安利 知道了一个很好的网站 爱给网 里面资
  • 从一个含有特殊的字符长字符串中获取对应字符方式。

    一 将字符串进行字符切割 前言 业务需求是在一个字段里存储一个题目的多个选项的内容分别使用 隔开 比如编制项目建议书 编制项目建设纲要或设计纲要 设计评审 合同洽谈 现在需要将字符串获取之后将选项内容切割出来 使用 符进行切割 思路 1 获
  • 陈关荣

    2019年12月12日 自然 Nature 杂志登出了玛加丽塔 萨拉斯 法尔格拉斯 Margarita Salas Falgueras 1938年11月30日 2019年11月7日 去世的讣告 萨拉斯于11月7日去世 享年80岁 她是把现代
  • java学习之增删改查的客户信息管理软件

    1 MVC的设计模式 模型层 控制层 视图层 2 构建4个包 com ca bean 实体对象 用来封装客户信息 com ca service 对象的管理模块 内部用数组管理一组Customer对象 并提供相应的添加 修改 删除和遍历方法
  • 利用jQuery做tab栏切换

    1 结构布局 div class tab div class tab list ul li class current 商品介绍 li li 规格与包装 li li 售后保障 li li 商品评价 5000 li li 手机社区 li ul
  • 什么是ABI

    复杂度2 5 机密度3 5 最后更新2021 04 24 ABI是Application Binary Interface的缩写 任何写过代码的码农都知道什么是API 这是平台系统为应用程序提供的预先写好的模块 完成一系列的基础功能 那么
  • linux var log目录作用,Linux系统/var/log/journal/垃圾日志清理 - 米扑博客

    CentOS系统中有两个日志服务 分别是传统的 rsyslog 和 systemd journal ls l etc logrotate d rw r r 1 root root 91 Apr 11 2018 bootlog rw r r
  • 李宏毅深度学习-回归

    目录 1 梯度下降 2 bias和variance 1 梯度下降 利用梯度下降寻找最优解是 如果在该点的梯度为负 向下 则需要增加参数大小 如果梯度为正 向上 则需要减小参数大小 计算时 减去学习率 偏导表示和梯度方向反向 即负的就要增加
  • Handler消息传递机制(一)

    1 定义 一套 Android 消息传递机制 2 作用 在多线程的应用场景中 将工作线程中需更新UI的操作信息 传递到 UI主线程 从而实现 工作线程对UI的更新处理 最终实现异步消息的处理 3 意义 问 为什么要用 Handler消息传递
  • python中保存np.save出错

    python中保存np save出错 代码如下 求大神解释一下
  • HTTP(S)协议详解

    1 什么是协议 协议 网络协议的简称 网络协议是通信计算机双方必须共同遵从的一组约定 如怎么样建立连接 怎么样互相识别等 只有遵守这个约定 计算机之间才能相互通信交流 粗俗理解协议就是 比如你的电脑和我的电脑要通信 我们之间的交流为什么互相
  • Mysql8的备份脚本 ,基于xtrabackup8.0

    Mysql8的备份脚本 基于xtrabackup8 0 注意 xtrabackup8 0与mysql8直接的版本依赖强 安装xtra后可查看支持的Mysql8版本 xtrabackup8 下载页面 https centos pkgs org
  • 后台管理系统布局以及跳转,点击菜单局部刷新,右侧显示对应界面完整版

    源码地址 https gitee com nggLee java funny 1 进入站长之家https sc chinaz com 2 搜索后台管理模版 下载一个 本次使用的模版 https sc chinaz com moban 160
  • CONST

    定义 编辑 const修饰的数据类型是指常类型 常类型的变量或对象的值是不能被更新的 目的 编辑 const 推出的初始目的 正是为了取代预编译指令 消除它的缺点 同时继承它的优点 主要作用 编辑 1 可以定义const常量 具有不可变性
  • 如何在一个中文大模型上,加入招投标字段标注的数据,搭建一个招投标字段解析的Transformer模型?

    ChatGPT方案1 在一个中文大模型上加入招投标字段标注的数据 并搭建招投标字段解析的Transformer模型可以通过以下步骤实现 收集并标注招投标相关的数据 可以使用现有的数据集 也可以通过爬虫技术获取相关数据 然后进行人工标注 标注
  • Ubuntu下安装和管理不同版本CMake,根据软件安装的需要选用不同版本的CMake

    0 Foreword 在安装VTK Visualization Toolkit 时发现需要用3 12版本以上的CMake才行 但是系统带的是3 10版本的 这时可以有两个方法 最简单粗暴就是把系统原本的CMake覆盖了 重新装新版 其次是麻
  • 快速了解时间敏感网络(TSN)_Part1

    在过去的几年间 以太网凭借开放的协议 良好的扩展性以及较高的带宽等优势为自己在车载领域赢得了一席之地 随着车载应用范围的扩大 也有越来越多的以太网技术涌现出来 今天我们就来聊一聊时间敏感网络 TSN 让大家快速了解这一技术 话不多说 大家坐
  • IDEA 快速生成项目结构的文档树形式

    参考文献 taodudu idea快速生成项目结构图 参考日期 2023 05 17 需求 在写文档的时候 想把项目结构输出成文档树的形式 实现 在 IDEA 中 可以点击下方 Terminal 按钮或 Alt F12 打开终端 同理 在命
  • 旋转矩阵 推导

    旋转变换 一 旋转矩阵 1 简介 计算机图形学中的应用非常广泛的变换是一种称为仿射变换的特殊变换 在仿射变换中的基本变换包括平移 旋转 缩放 剪切这几种 本文以及接下来的几篇文章重点介绍一下关于旋转的变换 包括二维旋转变换 三维旋转变换以及