当前位置: 首页 > news >正文

三维向量旋转

问题描述

如图1所示,设一个向量 v ⃗ \vec{v} v 绕另一个向量 u ⃗ = [ x , y , z ] T \vec{u}=[x,y,z]^{T} u =[x,y,z]T旋转 θ 度,变换到 v ⃗ ′ \vec{v}^{'} v
求旋转后得到的向量 v ⃗ ′ \vec{v}^{'} v 的表示形式。
三维向量旋转

图1 三维向量旋转示意图

问题分析

由于转轴 u ⃗ \vec{u} u 的模长 ∣ ∣ u ⃗ ∣ ∣ ||\vec{u}|| ∣∣u ∣∣对旋转结果没有影响,所以可以假设 ∣ ∣ u ⃗ ∣ ∣ = 1 ||\vec{u}||=1 ∣∣u ∣∣=1
可以将 v ⃗ \vec{v} v 分解为平行于旋转轴 u ⃗ \vec{u} u 以及正交(垂直)于 u ⃗ \vec{u} u 的两个分量, v ⃗ ∣ ∣ \vec{v}_{||} v ∣∣ v ⃗ ⊥ \vec{v}_{\bot} v ,即 v ⃗ = v ⃗ ∣ ∣ + v ⃗ ⊥ \vec{v}=\vec{v}_{||}+\vec{v}_{\bot} v =v ∣∣+v
可以分别旋转这两个分向量,再将它们旋转的结果相加获得旋转后的向量
v ⃗ ′ = v ⃗ ∣ ∣ ′ + v ⃗ ⊥ ′ \vec{v}^{'}=\vec{v}_{||}^{'}+\vec{v}_{\bot}^{'} v =v ∣∣+v
在这里插入图片描述

图2 将 v ⃗ \vec{v} v 分解为平行于旋转轴 u ⃗ \vec{u} u 以及正交(垂直)于 u ⃗ \vec{u} u 的两个分量

可以看到, v ⃗ ∣ ∣ \vec{v}_{||} v ∣∣其实就是 v ⃗ \vec{v} v u ⃗ \vec{u} u 上的正交投影,根据正交投影的公式,可以得出:
v ⃗ ∣ ∣ = u ⃗ ⋅ v ⃗ u ⃗ ⋅ u ⃗ u ⃗ = u ⃗ ⋅ v ⃗ ∣ ∣ u ⃗ ∣ ∣ 2 u ⃗ \vec{v}_{||} = \frac{\vec{u}\cdot\vec{v}}{\vec{u}\cdot\vec{u}}\vec{u}=\frac{\vec{u}\cdot\vec{v}}{||\vec{u}||^{2}}\vec{u} v ∣∣=u u u v u =∣∣u 2u v u
根据 ∣ ∣ u ⃗ ∣ ∣ = 1 ||\vec{u}||=1 ∣∣u ∣∣=1,可得: v ⃗ ∣ ∣ = ( u ⃗ ⋅ v ⃗ ) u ⃗ \vec{v}_{||} = (\vec{u}\cdot\vec{v})\vec{u} v ∣∣=(u v )u
因为 v ⃗ = v ⃗ ∣ ∣ + v ⃗ ⊥ \vec{v}=\vec{v}_{||}+\vec{v}_{\bot} v =v ∣∣+v ,所以: v ⃗ ⊥ = v ⃗ − v ⃗ ∣ ∣ = v ⃗ − ( u ⃗ ⋅ v ⃗ ) u ⃗ \vec{v}_{\bot} =\vec{v}-\vec{v}_{||} =\vec{v}-(\vec{u}\cdot\vec{v})\vec{u} v =v v ∣∣=v (u v )u
分别求 v ⃗ ∣ ∣ \vec{v}_{||} v ∣∣ v ⃗ ⊥ \vec{v}_{\bot} v 的旋转结果就能得到 v ⃗ \vec{v} v 的旋转结果。

v ⃗ ∣ ∣ \vec{v}_{||} v ∣∣的旋转

这种情况其实非常简单,从图2中就可以看到, v ⃗ ∣ ∣ \vec{v}_{||} v ∣∣其实根本就没有被旋转,仍然与旋转轴 u ⃗ \vec{u} u 重合,所以:
v ⃗ ∣ ∣ \vec{v}_{||} v ∣∣平行于旋转轴 u ⃗ \vec{u} u 时,旋转 θ 角度之后的 v ⃗ ∣ ∣ ′ \vec{v}_{||}^{'} v ∣∣为: v ⃗ ∣ ∣ ′ = v ⃗ ∣ ∣ \vec{v}_{||}^{'}=\vec{v}_{||} v ∣∣=v ∣∣

v ⃗ ⊥ \vec{v}_{\bot} v 的旋转

因为 v ⃗ ⊥ \vec{v}_{\bot} v u ⃗ \vec{u} u 的是正交的,这个旋转可以看做是平面内的一个旋转。因为旋转不改变 v ⃗ ⊥ \vec{v}_{\bot} v 的长度,所以旋转路径是一个圆。下面是这个旋转的示意图,右侧的为俯视图:
在这里插入图片描述

图3 v ⃗ \vec{v} v 绕轴 u ⃗ \vec{u} u 旋转的俯视图

现在,3D 的旋转被转化为了 2D 平面上的旋转.由于在这个平面上们只有一个向量 v ⃗ ⊥ \vec{v}_{\bot} v ,用它来表示一个旋转是不够的,还需要构造一个同时正交于 u ⃗ \vec{u} u v ⃗ ⊥ \vec{v}_{\bot} v 的向量 w ⃗ \vec{w} w ,这个可以通过叉乘来获得:
w ⃗ = u ⃗ × v ⃗ ⊥ \vec{w}=\vec{u}×\vec{v}_{\bot} w =u ×v
注意叉乘的顺序,因为使用的是右手坐标系统,按照右手定则可以发现这个新的向量 w ⃗ \vec{w} w 指向 v ⃗ ⊥ \vec{v}_{\bot} v 逆时针旋转 𝜋/2 后的方向,并且和 v ⃗ ⊥ \vec{v}_{\bot} v 一样也处于正交于 u ⃗ \vec{u} u 的平面内.因为 ∣ ∣ u ⃗ ∣ ∣ = 1 ||\vec{u}||=1 ∣∣u ∣∣=1,可以发现 ∣ ∣ w ⃗ ∣ ∣ = ∣ ∣ u ⃗ × v ⃗ ⊥ ∣ ∣ = ∣ ∣ u ⃗ ∣ ∣ ⋅ ∣ ∣ v ⃗ ⊥ ∣ ∣ ⋅ s i n ( π / 2 ) = ∣ ∣ v ⃗ ⊥ ∣ ∣ ||\vec{w}||=||\vec{u}×\vec{v}_{\bot}||=||\vec{u}||\cdot||\vec{v}_{\bot}||\cdot sin(\pi/2)=||\vec{v}_{\bot}|| ∣∣w ∣∣=∣∣u ×v ∣∣=∣∣u ∣∣∣∣v ∣∣sin(π/2)=∣∣v ∣∣
也就是说, w ⃗ \vec{w} w v ⃗ ⊥ \vec{v}_{\bot} v 的模长是相同的,所以, w ⃗ \vec{w} w 也位于圆上.有了这个新的向量 w ⃗ \vec{w} w ,就相当于在平面内有了两个坐标轴.我们现在可以把 v ⃗ ⊥ ′ \vec{v}_{\bot}^{'} v 投影到 w ⃗ \vec{w} w v ⃗ ⊥ \vec{v}_{\bot} v 上,将其分解为 v ⃗ v ′ \vec{v}_{v}^{'} v v v ⃗ w ′ \vec{v}_{w}^{'} v w。使用三角学的知识就能得到: v ⃗ ⊥ ′ = v ⃗ v ′ + v ⃗ w ′ = c o s ( θ ) v ⃗ ⊥ + s i n ( θ ) w ⃗ = c o s ( θ ) v ⃗ ⊥ + s i n ( θ ) ( u ⃗ × v ⃗ ⊥ ) \vec{v}_{\bot}^{'}=\vec{v}_{v}^{'}+\vec{v}_{w}^{'}=cos(\theta)\vec{v}_{\bot}+sin(\theta)\vec{w}=cos(\theta)\vec{v}_{\bot}+sin(\theta)(\vec{u}×\vec{v}_{\bot}) v =v v+v w=cos(θ)v +sin(θ)w =cos(θ)v +sin(θ)(u ×v )
这也就完成了旋转的第二步,可以得到这样一个定理:
v ⃗ ⊥ \vec{v}_{\bot} v 正交于旋转轴 u ⃗ \vec{u} u 时,旋转 θ 角度之后的 v ⃗ ⊥ ′ \vec{v}_{\bot}^{'} v 为: v ⃗ ⊥ ′ = c o s ( θ ) v ⃗ ⊥ + s i n ( θ ) ( u ⃗ × v ⃗ ⊥ ) \vec{v}_{\bot}^{'}=cos(\theta)\vec{v}_{\bot}+sin(\theta)(\vec{u}×\vec{v}_{\bot}) v =cos(θ)v +sin(θ)(u ×v )

v ⃗ \vec{v} v 的旋转

将上面的两个结果组合就可以获得 v ⃗ ′ = v ⃗ ∣ ∣ ′ + v ⃗ ⊥ ′ = v ⃗ ∣ ∣ + c o s ( θ ) v ⃗ ⊥ + s i n ( θ ) ( u ⃗ × v ⃗ ⊥ ) \vec{v}^{'}=\vec{v}_{||}^{'}+\vec{v}_{\bot}^{'}=\vec{v}_{||}+cos(\theta)\vec{v}_{\bot}+sin(\theta)(\vec{u}×\vec{v}_{\bot}) v =v ∣∣+v =v ∣∣+cos(θ)v +sin(θ)(u ×v )
因为叉乘遵守分配律,
u ⃗ × v ⃗ ⊥ = u ⃗ × ( v ⃗ − v ⃗ ∥ ∣ ) = u ⃗ × v ⃗ − u ⃗ × v ⃗ ∥ ∣ = u ⃗ × v ⃗ \vec{u}×\vec{v}_{\bot}= \vec{u}×(\vec{v}-\vec{v}_{\||})= \vec{u}×\vec{v}-\vec{u}×\vec{v}_{\||}= \vec{u}×\vec{v} u ×v =u ×(v v ∥∣)=u ×v u ×v ∥∣=u ×v
最后,将 v ⃗ ∣ ∣ = ( u ⃗ ⋅ v ⃗ ) u ⃗ \vec{v}_{||} = (\vec{u}\cdot\vec{v})\vec{u} v ∣∣=(u v )u v ⃗ ⊥ = v ⃗ − ( u ⃗ ⋅ v ⃗ ) u ⃗ \vec{v}_{\bot} =\vec{v}-(\vec{u}\cdot\vec{v})\vec{u} v =v (u v )u 代入 v ⃗ ′ = ( u ⃗ ⋅ v ⃗ ) u ⃗ + c o s ( θ ) ( v ⃗ − ( u ⃗ ⋅ v ⃗ ) u ⃗ ) + s i n ( θ ) ( u ⃗ × v ⃗ ) = c o s ( θ ) v ⃗ + ( 1 − c o s ( θ ) ) ( u ⃗ ⋅ v ⃗ ) u ⃗ + s i n ( θ ) ( u ⃗ × v ⃗ ) \vec{v}^{'}= (\vec{u}\cdot\vec{v})\vec{u}+cos(\theta)(\vec{v}-(\vec{u}\cdot\vec{v})\vec{u})+sin(\theta)(\vec{u}×\vec{v}) \\=cos(\theta)\vec{v}+(1-cos(\theta))(\vec{u}\cdot\vec{v})\vec{u}+sin(\theta)(\vec{u}×\vec{v}) v =(u v )u +cos(θ)(v (u v )u )+sin(θ)(u ×v )=cos(θ)v +(1cos(θ))(u v )u +sin(θ)(u ×v )

结论

3D 向量旋转公式(向量型,一般情况,也叫做「Rodrigues’ Rotation Formula」)
3D 空间中任意一个向量 v ⃗ \vec{v} v 沿着单位向量 u ⃗ \vec{u} u 旋转 θ 角度之后得到的向量 v ⃗ ′ \vec{v}^{'} v 为:
v ⃗ ′ = c o s ( θ ) v ⃗ + ( 1 − c o s ( θ ) ) ( u ⃗ ⋅ v ⃗ ) u ⃗ + s i n ( θ ) ( u ⃗ × v ⃗ ) \vec{v}^{'}=cos(\theta)\vec{v}+(1-cos(\theta))(\vec{u}\cdot\vec{v})\vec{u}+sin(\theta)(\vec{u}×\vec{v}) v =cos(θ)v +(1cos(θ))(u v )u +sin(θ)(u ×v )

致谢

本文主要参考https://github.com/Krasjet/quaternion

http://www.lryc.cn/news/216797.html

相关文章:

  • 顺序表——leetcode
  • Kaprekar 7641 - 1467= 6174
  • 李宏毅机器学习笔记.Flow-based Generative Model(补)
  • Java使用Spark入门级非常详细的总结
  • kubernetes集群编排——k8s存储
  • 【软件STM32cubeIDE下H73xx配置串口uart1+中断接收/DMA收发+HAL库+简单数据解析-基础样例】
  • jdk8和jdk9中接口的新特性
  • 1-爬虫-requests模块快速使用,携带请求参数,url 编码和解码,携带请求头,发送post请求,携带cookie,响应对象, 高级用法
  • java商城免费搭建 VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城
  • 【TS篇一】TypeScript介绍、使用场景、环境搭建、类和接口
  • Tuna: Instruction Tuning using Feedback from Large Language Models
  • uni-app 应对微信小程序最新隐私协议接口要求的处理方法
  • PostgreSQL 进阶 - 使用foreign key,使用 subqueries 插入,inner joins,outer joins
  • 【Python 千题 —— 基础篇】地板除计算
  • 【随手记】np.random.choice()函数
  • 2003-2022年地级市-财政收支明细数据(企业、个人所得税、科学、教育、医疗等)
  • 影响服务器正常使用的有哪些因素
  • NLP学习笔记:使用 Python 进行NLTK
  • 突破性技术!开源多模态模型—MiniGPT-5
  • IntelliJ IDEA快捷键sout不生效
  • 用C++QT实现一个modbus rtu通讯程序框架
  • Python如何设置下载第三方软件包的国内镜像站服务器的地址
  • ChatGLM3-6B详细安装过程记录(Linux)
  • python的类
  • 前端 用HTML,CSS, JS 写一个简易的音乐播放器
  • 自定义QChartView实现鼠标放在图表时,显示鼠标位置坐标值(x,y)
  • antv/g6 交互与事件及自定义Behavior
  • MongoDB根据时间范围查询
  • 大数据Doris(十五):Doris表的字段类型
  • 文本批量处理,一键转换HTML文件编码,释放您的繁琐工作!