Posted at

[3D] 回転行列の意味

More than 3 years have passed since last update.

回転行列はこんな感じの行列です。

3Dをやっている人ならよく見るやつですね。

\begin{equation}

\begin{vmatrix}
X' \\
Y' \\
Z' \\
W'
\end{vmatrix}
=
\begin{vmatrix}
\cos\theta z &-\sin\theta z &0 &0 \\
\sin\theta z &\cos\theta z &0 &0 \\
0 &0 &1 &0 \\
0 &0 &0 &1
\end{vmatrix}
\times
\begin{vmatrix}
X \\
Y \\
Z \\
1
\end{vmatrix}
\end{equation}

さて、なぜこういう行列になるのでしょうか。

その答えがこの図です↓

回転行列の意味

この図は実例で学ぶゲーム3D数学の中で紹介されているものから引用させていただきました。

$p$ と $q$ の値がどう変化しているか注目してください。

回転行列で出てくる値がありますね。

$p$ がX軸の点を表していて、$q$ がY軸の点を表しています。

X軸の点 $[1, 0]$ を $θ$ だけ回転するとその座標は $[cos θ, sin θ]$ となるのは分かると思います。

そして問題はY軸。

Y軸の場合はちょっと発想を転換して、Y軸をX軸とおいて考えるとわかります。

つまり、Y軸「から」$θ$ だけ回転した位置の座標を求めればいいわけです。

ただ、考え方を転換しただけで座標空間は変わらないので、結果として $[0, 1]$ の点を移動する場合、X軸マイナス方向に移動することになるため、最終的に $[-sin θ, cos θ]$ 移動すれば目的の座標が求まる、というわけです。

結局のところ、X, Yともにこれらの値を掛けてあげれば望みの回転が得られる、というわけです。

シェーダを書いていると、この回転行列に似た処理をしたい場合があったりします。

そのときにはこれを思い出して、適切にコードを書いてやればわざわざ行列を作らなくても望みの回転を得ることができます。

(というか、まさにそれがあって備忘録として書いたのは内緒ですw)