摘要
旋转矩阵更容易理解与记忆的推导,从2D到3D
声明:本文推导适用于右手坐标系。
旋转角度说明:本文说的绕x轴旋转
θ
\theta
θ度指的是顺着x轴负方向看过去,逆时针旋转
θ
\theta
θ度。若想获得顺时针旋转的旋转矩阵,只需要把
θ
\theta
θ改为
−
θ
-\theta
−θ即可。(个人觉得3D空间中要想准确描述旋转而不造成混淆,至少要说明三点:旋转轴,朝向,在该朝向下是顺时针还是逆时针旋转。)
2D旋转矩阵
2D旋转矩阵推导公式网上都有,不再赘述。参考这里,有
由上述推导可得2D空间中,从X轴向Y轴旋转
θ
\theta
θ度的旋转矩阵为:
[
X
′
Y
′
]
=
[
c
o
s
θ
−
s
i
n
θ
s
i
n
θ
c
o
s
θ
]
[
X
Y
]
\begin{bmatrix} X' \\ Y' \end{bmatrix}= \begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix} \begin{bmatrix} X \\ Y \end{bmatrix}
[X′Y′]=[cosθsinθ−sinθcosθ][XY]
注意:上述公式相当于3D空间中,绕Z轴旋转
θ
\theta
θ度的公式,即顺着Z轴负方向看过去逆时针旋转
θ
\theta
θ度。也相当于把X轴旋转向Y轴的公式。
后面的3D旋转矩阵全都以此为基础变形
,无非是移动一下元素位置。
3D旋转矩阵
绕Z轴旋转 θ \theta θ度的公式
由2D旋转矩阵直接可得,不作推导:
[
X
′
Y
′
Z
′
]
=
[
c
o
s
θ
−
s
i
n
θ
0
s
i
n
θ
c
o
s
θ
0
0
0
1
]
[
X
Y
Z
]
\begin{bmatrix} X' \\ Y' \\ Z' \end{bmatrix}= \begin{bmatrix} cos\theta & -sin\theta & 0 \\ sin\theta & cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}
⎣⎡X′Y′Z′⎦⎤=⎣⎡cosθsinθ0−sinθcosθ0001⎦⎤⎣⎡XYZ⎦⎤
绕Y轴旋转 θ \theta θ度的公式
可根据2D旋转矩阵直接变形得到,过程如下:
根据我们的规定,绕Y轴旋转表示逆着Y轴正方向逆时针旋转,根据右手坐标系可知,相当于从Z轴旋转向X轴,根据2D旋转矩阵,可得
[
Z
′
X
′
]
=
[
c
o
s
θ
−
s
i
n
θ
s
i
n
θ
c
o
s
θ
]
[
Z
X
]
\begin{bmatrix} Z' \\ X' \end{bmatrix}= \begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix} \begin{bmatrix} Z \\ X \end{bmatrix}
[Z′X′]=[cosθsinθ−sinθcosθ][ZX]
扩展到3D旋转矩阵,为
[
Z
′
X
′
Y
′
]
=
[
c
o
s
θ
−
s
i
n
θ
0
s
i
n
θ
c
o
s
θ
0
0
0
1
]
[
Z
X
Y
]
\begin{bmatrix} Z' \\ X' \\ Y' \end{bmatrix}= \begin{bmatrix} cos\theta & -sin\theta & 0 \\ sin\theta & cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} Z \\ X \\ Y \end{bmatrix}
⎣⎡Z′X′Y′⎦⎤=⎣⎡cosθsinθ0−sinθcosθ0001⎦⎤⎣⎡ZXY⎦⎤
调整一下右边坐标顺序,公式变形为
[
Z
′
X
′
Y
′
]
=
[
−
s
i
n
θ
0
c
o
s
θ
c
o
s
θ
0
s
i
n
θ
0
1
0
]
[
X
Y
Z
]
\begin{bmatrix} Z' \\ X' \\ Y' \end{bmatrix}= \begin{bmatrix} -sin\theta & 0 & cos\theta \\ cos\theta & 0 & sin\theta \\ 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}
⎣⎡Z′X′Y′⎦⎤=⎣⎡−sinθcosθ0001cosθsinθ0⎦⎤⎣⎡XYZ⎦⎤
再调整一下左边坐标顺序,公式变形为
[
X
′
Y
′
Z
′
]
=
[
c
o
s
θ
0
s
i
n
θ
0
1
0
−
s
i
n
θ
0
c
o
s
θ
]
[
X
Y
Z
]
\begin{bmatrix} X' \\ Y' \\ Z' \end{bmatrix}= \begin{bmatrix} cos\theta & 0 & sin\theta \\ 0 & 1 & 0 \\ -sin\theta & 0 & cos\theta \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}
⎣⎡X′Y′Z′⎦⎤=⎣⎡cosθ0−sinθ010sinθ0cosθ⎦⎤⎣⎡XYZ⎦⎤
这就是我们所要求的绕Y轴旋转
θ
\theta
θ度的公式。
绕X轴旋转 θ \theta θ度的公式
同理,也可从2D旋转矩阵直接变形得到
[
X
′
Y
′
Z
′
]
=
[
1
0
0
0
c
o
s
θ
−
s
i
n
θ
0
s
i
n
θ
c
o
s
θ
]
[
X
Y
Z
]
\begin{bmatrix} X' \\ Y' \\ Z' \end{bmatrix}= \begin{bmatrix} 1 & 0 & 0 \\ 0 & cos\theta & -sin\theta \\ 0 & sin\theta & cos\theta \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}
⎣⎡X′Y′Z′⎦⎤=⎣⎡1000cosθsinθ0−sinθcosθ⎦⎤⎣⎡XYZ⎦⎤
相关/参考链接
旋转矩阵公式推导
旋转矩阵推导 | 推荐读这个,首先它清楚的定义了顺时针旋转到底是怎么转,只有定义清楚了,旋转才不会混淆。