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
をちょっと便利にした関数ですが、書き捨てスクリプトで使われそうなとても安易なネーミングセンスが気に入ってます。