旋转变换矩阵推导

介绍

  先介绍二维旋转变换,然后得到三维绕坐标轴旋转,再推广得到绕三维任意轴旋转的罗德里格斯旋转公式。

1.二维旋转变换

  如果要求PPP逆时针旋转θ\thetaθ得到的P′P^{'}P,记QQQPPP逆时针旋转90°后的向量,即(−Py,Px)(-P_y,P_x)(Py,Px),则PPPQQQ正好组成了该平面内的一组正交向量,任何向量都可由其线性表出,由基本几何和三角学可得到:
P′=Pcosθ+Qsinθ P^{'}=Pcos\theta+Qsin\theta P=Pcosθ+Qsinθ


Px′=Pxcosθ−PysinθPy′=Pysinθ−Pxcosθ \begin{aligned}P_x^{'}&=P_xcos\theta-P_ysin\theta\\ P_{y}^{'}&=P_ysin\theta-P_xcos\theta\\ \end{aligned} PxPy=PxcosθPysinθ=PysinθPxcosθ
写成矩阵为
P′=[cosθ−sinθsinθcosθ]P P^{'}=\begin{bmatrix}cos\theta&-sin\theta\\sin\theta&cos\theta\end{bmatrix}P P=[cosθsinθsinθcosθ]P

2.三维旋转变换

在这里插入图片描述
  注意Ry(θ)R_y(\theta)Ry(θ)与其他不同是因为如果按照逆时针旋转,由x×z=−yx\times z=-yx×z=y,则得到yyy轴负方向,因此需改为顺时针,即−θ-\thetaθ,这无论是在左手坐标系还是右手系都是相同的。

3.向量PPP绕任意轴AAA旋转θ\thetaθ角度证明:

  不妨设AAA为单位向量,同时PPP可分解为与AAA平行和垂直的两个分量,分别为:
PprojA=(A⋅P)A=AATPPperpA=P−(A⋅P)A=P−AATP \begin{aligned}P_{projA}&=(A\cdot P)A=AA^TP\\P_{perpA}&=P-(A\cdot P)A=P-AA^TP\end{aligned} PprojAPperpA=(AP)A=AATP=P(AP)A=PAATP
如图所示
在这里插入图片描述

故最终结果
P′=PperpA′+PProjA P^{'}=P_{perpA}^{'}+P_{ProjA} P=PperpA+PProjA
其中PPerpA′P_{PerpA}^{'}PPerpAPperpAP_{perpA}PperpA旋转θ\thetaθ后得到的向量,如图
在这里插入图片描述

为求得其值,需找到一组线性组合来表示它,可选PperpAP_{perpA}PperpA与其旋转90°后的向量这两个向量作为组合,可以得知A×PA\times PA×P即为该向量,同时它的长度是与PperpAP_{perpA}PperpA相等的,这是因为
∣A×P∣=∣P∣sinα=∣P−(A⋅P)A∣ |A\times P|=|P|sin\alpha=|P-(A\cdot P)A| A×P=Psinα=P(AP)A
所以
PperpA′=[P−(A⋅P)A]cosθ+(A×P)sinθ P_{perpA}^{'}=[P-(A\cdot P)A]cos\theta+(A \times P)sin \theta PperpA=[P(AP)A]cosθ+(A×P)sinθ
所以
P′=[P−(A⋅P)A]cosθ+(A×P)sinθ+(A⋅P)A=Pcosθ+A×Psinθ+(A⋅P)A(1−cosθ) \begin{aligned}P^{'}&=[P-(A\cdot P)A]cos\theta+(A \times P)sin \theta+(A\cdot P)A\\&=Pcos\theta+A\times P sin\theta+(A\cdot P)A(1-cos\theta)\end{aligned} P=[P(AP)A]cosθ+(A×P)sinθ+(AP)A=Pcosθ+A×Psinθ+(AP)A(1cosθ)
III为单位阵,则矩阵形式为
P′={Icosθ+[0−AzAyAz0−Ax−AyAx0]sinθ+AAT(1−cosθ)}P P^{'}=\{Icos\theta+\begin{bmatrix} 0&-A_z&A_y\\A_z&0&-A_x\\-A_y&A_x&0\end{bmatrix}sin\theta+AA^T(1-cos\theta)\}P P={Icosθ+0AzAyAz0AxAyAx0sinθ+AAT(1cosθ)}P
其中记
R=Icosθ+[0−AzAyAz0−Ax−AyAx0]sinθ+AAT(1−cosθ) R=Icos\theta+\begin{bmatrix} 0&-A_z&A_y\\A_z&0&-A_x\\-A_y&A_x&0\end{bmatrix}sin\theta+AA^T(1-cos\theta) R=Icosθ+0AzAyAz0AxAyAx0sinθ+AAT(1cosθ)
为罗德里格斯旋转公式,而将其展开写成一个矩阵就可得到旋转矩阵。

### 三维与二维旋转矩阵的数学推导过程 旋转矩阵是描述空间中物体旋转的一种数学工具,广泛应用于计算机图形学、机器人学以及游戏开发等领域。旋转矩阵推导可以从二维空间开始,再扩展到三维空间。 #### 二维坐标系的旋转 在二维空间中,一个点 $ P = (x, y) $ 绕原点逆时针旋转角度 $ \theta $ 后的新坐标 $ P' = (x', y') $ 可以通过三角函数关系得出: $$ \begin{aligned} x' &= x\cos\theta - y\sin\theta \\ y' &= x\sin\theta + y\cos\theta \end{aligned} $$ 将上述变换写成矩阵形式,可以得到二维旋转矩阵: $$ P' = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix} P $$ 这一矩阵形式便于进行连续旋转操作和与其他变换矩阵的组合[^4]。 #### 三维坐标系的旋转 在三维空间中,旋转可以围绕任意轴进行,但为了简化分析,通常考虑绕坐标轴(X、Y、Z)的旋转。 ##### 绕Z轴旋转 在三维空间中,绕Z轴旋转与二维旋转相同,Z坐标保持不变。设点 $ P = (x, y, z) $ 绕Z轴旋转角度 $ \theta $,其变换公式为: $$ \begin{aligned} x' &= x\cos\theta - y\sin\theta \\ y' &= x\sin\theta + y\cos\theta \\ z' &= z \end{aligned} $$ 对应的旋转矩阵为: $$ R_z(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} $$ ##### 绕X轴旋转(俯仰角 Pitch) 绕X轴旋转时,Y和Z坐标发生变化,X保持不变。设旋转角度为 $ \theta $,则: $$ \begin{aligned} y' &= y\cos\theta - z\sin\theta \\ z' &= y\sin\theta + z\cos\theta \\ x' &= x \end{aligned} $$ 对应的旋转矩阵为: $$ R_x(\theta) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\theta & -\sin\theta \\ 0 & \sin\theta & \cos\theta \end{bmatrix} $$ ##### 绕Y轴旋转(偏航角 Yaw) 绕Y轴旋转时,X和Z坐标发生变化,Y保持不变。设旋转角度为 $ \theta $,则: $$ \begin{aligned} x' &= x\cos\theta + z\sin\theta \\ z' &= -x\sin\theta + z\cos\theta \\ y' &= y \end{aligned} $$ 对应的旋转矩阵为: $$ R_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta \\ 0 & 1 & 0 \\ -\sin\theta & 0 & \cos\theta \end{bmatrix} $$ #### 任意点的旋转 在实际应用中,旋转中心可能不在原点。此时需要先将物体平移到原点,执行旋转后再平移回原位置。设旋转中心为点 $ (x, y) $,则变换过程为: $$ v' = T(x, y) \cdot R \cdot T(-x, -y) \cdot v $$ 其中 $ T(x, y) $ 为平移矩阵,$ R $ 为旋转矩阵[^3]。 #### 示例代码:二维旋转矩阵计算 ```python import numpy as np def rotation_matrix_2d(theta): theta = np.radians(theta) return np.array([ [np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)] ]) # 示例:绕原点旋转30度 R = rotation_matrix_2d(30) print("二维旋转矩阵:") print(R) ``` #### 示例代码:三维绕Z轴旋转矩阵计算 ```python def rotation_matrix_z(theta): theta = np.radians(theta) return np.array([ [np.cos(theta), -np.sin(theta), 0], [np.sin(theta), np.cos(theta), 0], [0, 0, 1] ]) # 示例:绕Z轴旋转45度 R_z = rotation_matrix_z(45) print("绕Z轴旋转矩阵:") print(R_z) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值