1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

回転行列のサンプル(2次元・3次元)のメモ

Posted at

2次元や3次元空間で原点を中心に回転させるときの符号や乗算する方向が、いつも脳内で図形を描いて回転をシミュレーションしないと出てこないので、まとめておきます。特に3次元での回転の向きと符号が覚えられません。

2次元

回転の方向

  • 点Pを反時計回りに移動させる場合
  • 座標軸を時計回りに回転させる場合
\begin{pmatrix} x' \\\ y' \end{pmatrix} = \begin{pmatrix} \cosθ & -\sinθ \\\ \sinθ & \cosθ \end{pmatrix} \begin{pmatrix} x \\\ y \end{pmatrix}

行列を使わない表現するならば

x' = x\cosθ - y\sinθ \\\ y' = x\sinθ + y\cosθ 

です。

回転の方向が反対の場合は$ θ $に負号を付けるか、同じことですが$ \sin $の符号を反転します。これは次の3次元の場合でも同じです。

座標を横ベクトル(行ベクトル)で表現するならば

\begin{pmatrix} x' & y' \end{pmatrix} = \begin{pmatrix} x & y \end{pmatrix} \begin{pmatrix} \cosθ & \sinθ \\\ -\sinθ & \cosθ \end{pmatrix}

のように、右からの乗算になり、行列の縦横も入れ替わります。これも3次元の場合でも同様です。

3次元

軸の向きは右手系とします。

  • 右手の親指をx軸、人差し指をy軸としたとき、z軸が中指の方向と一致
  • 地表から見て、北方向をx軸、西方向をy軸としたとき、z軸が天頂方向と一致
  • 地球から見て、うお座方向をx軸、オリオン座方向をy軸としたとき、z軸が天の北極と一致

軸ごとに回転方向が考えられますが、2次元と同じ計算式になるz軸の場合を最初に書きます。

z軸回転

回転の方向

  • z軸の正の方向から見て、点Pを反時計回りに移動させる場合
  • z軸の正の方向から見て、x軸とy軸を時計回りに回転させる場合
\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} = \begin{pmatrix} \cosθ & -\sinθ & 0 \\\ \sinθ & \cosθ & 0 \\\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\\ y \\\ z \end{pmatrix}

です。

R_z(θ) = \begin{pmatrix} \cosθ & -\sinθ & 0 \\\ \sinθ & \cosθ & 0 \\\ 0 & 0 & 1 \end{pmatrix} 

とおけば

\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} = R_z(θ) \begin{pmatrix} x \\\ y \\\ z \end{pmatrix}

です。xとyだけを見れば2次元の場合とまったく同じになります。

x軸回転

回転の方向

  • x軸の正の方向から見て、点Pを反時計回りに移動させる場合
  • x軸の正の方向から見て、y軸とz軸を時計回りに回転させる場合
\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 \\\ 0 & \cosθ & -\sinθ \\\ 0 & \sinθ & \cosθ \end{pmatrix} \begin{pmatrix} x \\\ y \\\ z \end{pmatrix}

です。

R_x(θ) = \begin{pmatrix} 1 & 0 & 0 \\\ 0 & \cosθ & -\sinθ \\\ 0 & \sinθ & \cosθ \end{pmatrix} 

とおけば

\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} = R_x(θ) \begin{pmatrix} x \\\ y \\\ z \end{pmatrix}

です。

y軸回転

回転の方向

  • y軸の正の方向から見て、点Pを反時計回りに移動させる場合
  • y軸の正の方向から見て、z軸とx軸を時計回りに回転させる場合
\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} = \begin{pmatrix} \cosθ & 0 & \sinθ \\\ 0 & 1 & 0 \\\ -\sinθ & 0 & \cosθ \end{pmatrix} \begin{pmatrix} x \\\ y \\\ z \end{pmatrix}

です。

R_y(θ) = \begin{pmatrix} \cosθ & 0 & \sinθ \\\ 0 & 1 & 0 \\\ -\sinθ & 0 & \cosθ \end{pmatrix} 

とおけば

\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} = R_y(θ) \begin{pmatrix} x \\\ y \\\ z \end{pmatrix}

です。

軸を変えて連続して回転させるときには$ R_x, R_y, R_z $を組み合わせて回転順に掛け算します。左からの乗算ですので、回転させる順に行列を右から書きます。最初にz軸で回転して、続けてy軸で回転させる場合には

\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} = R_y(θ_2) R_z(θ_1) \begin{pmatrix} x \\\ y \\\ z \end{pmatrix}

となります。

赤道座標系から黄道座標系に変換する例

赤道座標系(赤経:$ α $, 赤緯:$ δ $)を黄道座標系(黄経:$ γ $, 黄緯:$ β $)に変換するには、黄道傾斜角を$ ε $として、

\begin{align}
x &= \cosα\cosδ \\
y &= \sinα\cosδ \\
z &= \sinδ \\
\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} &= R_x(-ε) \begin{pmatrix} x \\\ y \\\ z \end{pmatrix} \\
β &= \tan^{-1} \frac{z'}{\sqrt{x'^2+y'^2}} = \sin^{-1} z' \\
α &= \text{atan2} (y', x') = \begin{cases} \tan^{-1} \frac{y'}{x'} & (x > 0) \\\ \tan^{-1} \frac{y'}{x'}+\pi & (x < 0 \space\text{and}\space y \geq 0 ) \\\ \tan^{-1} \frac{y'}{x'} - \pi & (x < 0 \space\text{and}\space y \lt 0 ) \\\ +\frac{\pi}{2} & (x = 0 \space\text{and}\space y > 0) \\\ -\frac{\pi}{2} & (x = 0 \space\text{and}\space y < 0) \end{cases} \\
\end{align}

赤道座標系から地平座標系に変換する例

赤道座標系(赤経:$ α $, 赤緯:$ δ $)を地平座標系(方位:$ A $, 高度:$ h $)に変換するには、グリニッジ恒星時を$ θ $、 観測地点の経度を$ λ $、緯度を$ φ $として、

\begin{align}
x &= \cosα\cosδ \\
y &= \sinα\cosδ \\
z &= \sinδ \\
\begin{pmatrix} x'' \\\ y'' \\\ z'' \end{pmatrix} &= R_y(φ) R_z(-(λ+θ)) \begin{pmatrix} x \\\ y \\\ z \end{pmatrix} \\
h &= \tan^{-1} \frac{z''}{\sqrt{x''^2+y''^2}} = \sin^{-1} x'' \\
A &= \text{atan2} (y'', z'') \\
\end{align}

となります。z軸で回転させ、続けてy軸で回転させています。

最初にz軸で $ λ+θ $ 回転させているのは、地方恒星時の子午線に合わせるためです。東京であれば緯度35度ですので、この回転でx軸は南方向の高度55度付近、y軸は東の地平線方向を向きます。

次にy軸で回転させているのは緯度に応じた傾きに合わせるためです。この回転によりx軸が南方向の高度55度付近から天頂方向に変わります。y軸は東の地平線方向、z軸は北の地平線方向になります。

方位$ A $は、北が0°、東が90°になります。$ x'', y'', z'' $は右手系ですが、$ A, h $は左手系です。右手系と左手系で反転しているにも関わらず$ A $の計算式に負号がついていないのはx軸とz軸が入れ替わっているためです。

以下のようにも書けます。

\begin{align}
x' &= \cos(α-λ-θ)\cosδ \\
y' &= \sin(α-λ-θ)\cosδ \\
z' &= \sinδ \\
\begin{pmatrix} x'' \\\ y'' \\\ z'' \end{pmatrix} &= R_y(φ) \begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} \\
h &= \sin^{-1} x \\
A &= \text{atan2} (y'', z'') \\
\end{align}

おまけ

atan2という名前の関数はatan($ \tan^{-1} $)とともにいろいろなプログラミング言語に標準で備わっている、atanをちょっと便利にした関数ですが、書き捨てスクリプトで使われそうなとても安易なネーミングセンスが気に入ってます。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?