Games 101: 旋转矩阵

news/发布时间2024/5/16 17:07:12

旋转矩阵

本文主要介绍了旋转矩阵的推导,分为两种方式:

  • 旋转坐标
  • 旋转坐标轴
    以下坐标系都是右手坐标系

旋转坐标

已知坐标点\(A(x_a,y_a)\), 旋转\(\theta\)角后变为坐标点\(B(x_b,y_b)\),求解旋转矩阵.

\[{\large \begin{align*} \begin{split} x_a &=r_a \cdot cos(\alpha) =r_b \cdot cos(\alpha) \\ y_a &=r_a \cdot sin(\alpha) =r_b \cdot sin(\alpha) \\ x_b &=r_b \cdot cos(\alpha+\theta) \\ &=r_b \cdot cos(\alpha) \cdot cos(\theta)-r_b \cdot sin(\alpha) \cdot sin(\theta) \\ &=x_a \cdot cos(\theta) - y_a \cdot sin(\theta) \\ y_b &=r_b \cdot sin(\alpha+\theta) \\ &=r_b \cdot cos(\alpha) \cdot sin(\theta)+r_b \cdot sin(\alpha) \cdot cos(\theta) \\ &=x_a \cdot sin(\theta) + y_a \cdot cos(\theta) \end{split} \end{align*} } \]

即:

\[{\large \begin{align*} \begin{split} \begin{bmatrix} x_b \\ y_b \\ \end{bmatrix} =\begin{bmatrix} cos(\theta) & -sin(\theta) \\ sin(\theta) & cos(\theta) \end{bmatrix} \cdot \begin{bmatrix} x_a \\ y_a \\ \end{bmatrix} \end{split} \end{align*} } \]

推广到三维以及其他轴,可以得到三维坐标点的旋转矩阵为:

\[{\large \begin{align*} \begin{split} R_x(\alpha)= \begin{bmatrix}1 & 0 & 0 \\0 & cos(\alpha) & -sin(\alpha) \\0 & sin(\alpha) & cos(\alpha) \\ \end{bmatrix} \qquad R_y(\beta)= \begin{bmatrix}cos(\beta) & 0 & sin(\beta)\\0 & 1 & 0 \\-sin(\beta) & 0 & cos(\beta) \\ \end{bmatrix} \qquad R_z(\theta)= \begin{bmatrix} cos(\theta) & -sin(\theta) & 0 \\ sin(\theta) & cos(\theta) & 0 \\0 & 0 & 1 \end{bmatrix} \end{split} \end{align*} } \]

旋转坐标

坐标轴\(OX_1Y_1\)绕z轴旋转\(\theta\)角后变为坐标轴\(OX_2Y_2\),点A在坐标轴\(OX_1Y_1\)中坐标为\((x_a,y_a)\), 在坐标轴\(OX_2Y_2\)\((x_b,y_b)\),求解旋转矩阵.
坐标轴\(OX_1Y_1\),两个方向的单位向量为\(\vec{x_1},\vec{y_1}\),坐标轴\(OX_2Y_2\),两个方向的单位向量为\(\vec{x_2},\vec{y_2}\)

分解单位向量:

\[{\large \begin{align*} \begin{split} \vec{x_1} &=\left | \vec{x_1} \right | \cdot cos(\theta) \cdot \vec{x_2} - \left | \vec{x_1} \right | \cdot sin(\theta) \cdot \vec{y_2} = cos(\theta) \cdot \vec{x_2} - sin(\theta) \cdot \vec{y_2} \\ \vec{y_1} &=\left | \vec{y_1} \right | \cdot sin(\theta) \cdot \vec{x_2} + \left | \vec{x_1} \right | \cdot cos(\theta) \cdot \vec{y_2} = sin(\theta) \cdot \vec{x_2} + cos(\theta) \cdot \vec{y_2} \end{split} \end{align*} } \]

向量变换:

\[{\large \begin{align*} \begin{split} \vec{r_a} &= x_a \cdot \vec{x_1} + y_a \cdot \vec{y_1} \\ &= x_a \cdot ( cos(\theta) \cdot \vec{x_2} - sin(\theta) \cdot \vec{y_2}) + y_a \cdot ( sin(\theta) \cdot \vec{x_2} + cos(\theta) \cdot \vec{y_2})\\ &=(x_a \cdot cos(\theta) +y_a \cdot sin(\theta)) \cdot \vec{x_2} +(-sin(\theta) \cdot x_a + cos(\theta) \cdot y_a)\cdot \vec{y_2} \\ \vec{r_a} &= x_b \cdot \vec{x_2} + y_b \cdot \vec{y_2} \end{split} \end{align*} } \]

\[{\large \begin{align*} \begin{split} \begin{bmatrix} x_b \\ y_b \end{bmatrix} =\begin{bmatrix} cos(\theta) & sin(\theta)\\ -sin(\theta) & cos(\theta) \end{bmatrix} \cdot \begin{bmatrix} x_a \\ y_a \end{bmatrix} \end{split} \end{align*} } \]

推广到三维以及其他轴,可以得到三维坐标轴的旋转矩阵为:

\[{\large \begin{align*} \begin{split} R_x(\alpha)= \begin{bmatrix}1 & 0 & 0 \\0 & cos(\alpha) & sin(\alpha) \\0 & -sin(\alpha) & cos(\alpha) \\ \end{bmatrix} \qquad R_y(\beta)= \begin{bmatrix}cos(\beta) & 0 & -sin(\beta)\\0 & 1 & 0 \\sin(\beta) & 0 & cos(\beta) \\ \end{bmatrix} \qquad R_z(\theta)= \begin{bmatrix} cos(\theta) & sin(\theta) & 0 \\ -sin(\theta) & cos(\theta) & 0 \\0 & 0 & 1 \end{bmatrix} \end{split} \end{align*} } \]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/02284128.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

2024-04-27:用go语言,在一个下标从 1 开始的 8 x 8 棋盘上,有三个棋子,分别是白色车、白色象和黑色皇后。 给定这三个棋子的位置,请计算出要捕获黑色皇后所需的最少移动次数。 需要注意

2024-04-27:用go语言,在一个下标从 1 开始的 8 x 8 棋盘上,有三个棋子,分别是白色车、白色象和黑色皇后。 给定这三个棋子的位置,请计算出要捕获黑色皇后所需的最少移动次数。 需要注意的是,白色车可以垂直或水平移动,而白色象可以沿对角线移动,它们不能跳过其他棋子。…

CUDA和CUDNN版本切换

介绍了cuda和cudnn版本切换的方法,以及设置环境变量的坑0 背景 在用不同框架做深度学习时,难免会遇到需要不同版本的cuda和cudnn版本的情况,如果把原来版本的卸载掉重新安装新版本,则会影响其它框架的使用,最好的方法是在主机上安装多个版本的cuda和cudnn,需要用到哪种就…

使用Files.walk删除文件

使用`Files.walk`删除指定文件名的文件。摘要:使用Files.walk删除指定文件名的文件。使用Files.walk工具,递归判断指定目录中的常规文件路径名是否符合约定名称,如果满足条件就删除。 public class DelFile {// 文件名在此集合就删除private static Set<String> given…

10-项目范围管理(2/10 十大管理)

9.1 管理基础 9.1.1 产品范围和项目范围产品范围:指某项产品、服务或成果所具有的特征和功能。产品范围的完成情况是根据产品需求来衡量的。 项目范围:包括产品范围,是为交付具有规定特性与功能的产品服务或成果而必须完成的工作。项目范围的完成情况是根据项目管理计划来衡…

读天才与算法:人脑与AI的数学思维笔记11_算法如何思考

读天才与算法:人脑与AI的数学思维笔记11_算法如何思考1. 创造力 1.1. 创建一种算法,其首要任务是放弃已知的所有艺术风格,然后判断由算法自己所产生的艺术品是否具有与所有艺术风格都截然不同的特性,即真正独树一帜的艺术风格 1.2. 抗性模型同样适用于人类创造力代码的引导…

.net8系列-04图文并茂手把手教你配置Swagger支持token以及实现Swagger扩展,Swagger代码单独抽离

前情提要 接上篇文章,我们当前已完成如下内容:创建应用成功 创建接口成功 配置Swagger实现接口注释和版本控制 本文章主要内容为: 配置Swagger支持token传值测试接口快速上手-代码配置 添加如下代码 文件目录:\xiaojinWebApplication\xiaojinWebApplication\Program.cs// S…