「角変位」は「行列」や「四元数」で表現できる。 「方向」は「オイラー角」で表現できる。
ある座標空間の基底ベクトルを、他の座標空間を使って表現して列挙する。 基底ベクトルを行として使って 3x3 行列にすると、行列の形式で方向を表現した事になる。 すなわち、ベクトルをある座標空間から別の座標空間へ座標変換するのに使う回転行列を与えることで 2つの座標空間の相対方向を表現できる。
回転の軸を単位ベクトル $\boldsymbol{n}$ で定義する。 ベクトル$\boldsymbol{v}$ を $\boldsymbol{n}$ の周りに角度 $\theta$だけ回転したベクトルを $\boldsymbol{v'}$としたとき、 $\boldsymbol{v'} = R(\boldsymbol{n}, \theta) \boldsymbol{v} $ を満たす $R(\boldsymbol{n},\theta)$を求めたい。
$\boldsymbol{v} = \boldsymbol{v}_{\parallel} + \boldsymbol{v}_{\perp}$ とする。 ただし、 $\boldsymbol{v}_{\parallel}$ と $\boldsymbol{v}_{\perp}$ はそれぞれ $\boldsymbol{n}$ に平行および垂直なベクトルである。 $\boldsymbol{v}_{\parallel}$ は $\boldsymbol{n}$ に平行なので $\boldsymbol{n}$ の周りの回転の影響を受けない。 したがって、 $\boldsymbol{v}_{\perp}$ を $\boldsymbol{n}$ の周りで回転した $\boldsymbol{v'}_{\perp}$ を計算できれば $\boldsymbol{v'} = \boldsymbol{v}_{\parallel} + \boldsymbol{v'}_{\perp}$ が計算できる。
$\boldsymbol{v}_{\parallel}$ は $\boldsymbol{v}$ を $\boldsymbol{n}$ に投影したものなので $\boldsymbol{v}_{\parallel} = (\boldsymbol{v} \cdot \boldsymbol{n}) ~ \boldsymbol{n}$ である。
$\boldsymbol{v}_{\perp}$ は $\boldsymbol{v} = \boldsymbol{v}_{\parallel} + \boldsymbol{v}_{\perp}$ より $\boldsymbol{v}_{\perp} = \boldsymbol{v} - \boldsymbol{v}_{\parallel} =\boldsymbol{v - (\boldsymbol{v} \cdot \boldsymbol{n}) ~ \boldsymbol{n}}$ となる。
$\boldsymbol{v_{\perp}}$
を
$\boldsymbol{n}$
の周りに$\displaystyle\frac{\pi}{2}$ だけ回転させたベクトル
$\boldsymbol{w}$
を考えると、
$\boldsymbol{w}$
は
$\boldsymbol{v_{\perp}}$
と
$\boldsymbol{n}$
の双方に垂直で,長さは
$|\boldsymbol{v_{\perp}}|$
であるので、
$\displaystyle
\begin{align}
\boldsymbol{w} &= \boldsymbol{v}_{\perp} \times \boldsymbol{n} \\\
&= (\boldsymbol{v} - \boldsymbol{v}_{\parallel}) \times \boldsymbol{n} \\\
&= \boldsymbol{v} \times \boldsymbol{n} - \boldsymbol{v}_{\parallel} \times \boldsymbol{n} \\\
&= \boldsymbol{v} \times \boldsymbol{n} - \boldsymbol{0} \\\
&= \boldsymbol{v} \times \boldsymbol{n}
\end{align}
$
$\boldsymbol{v}'$ の
$\boldsymbol{n}$
に垂直な成分
$\boldsymbol{v}'_{\perp}$
は
$\displaystyle
\begin{align}
\boldsymbol{v}'_{\perp} & = \cos \theta ~ \boldsymbol{v}_{\perp} + \sin \theta ~ \boldsymbol{w} \\\
& = \cos \theta ~ (\boldsymbol{v - (\boldsymbol{v} \cdot \boldsymbol{n}) ~ \boldsymbol{n}}) + \sin\theta ~ (\boldsymbol{v} \times \boldsymbol{n})
\end{align}
$
したがって、
$\displaystyle
\begin{align}
\boldsymbol{v}' &= \boldsymbol{v}_{\parallel} + \boldsymbol{v}_{\perp} \\\
&=
\cos \theta ~ (\boldsymbol{v} - (\boldsymbol{v} \cdot \boldsymbol{n}) ~ \boldsymbol{n})
+ \sin\theta ~ (\boldsymbol{v} \times \boldsymbol{n})
+
(\boldsymbol{v} \cdot \boldsymbol{n}) ~ \boldsymbol{n}
\end{align}$
これで $\boldsymbol{v'}$ を $\boldsymbol{v}$, $\boldsymbol{n}$, $\theta$ を使って表現できたので、3つの基底ベクトル $\displaystyle \boldsymbol{p}=\begin{pmatrix}1 \\ 0 \\ 0\end{pmatrix}, \quad \boldsymbol{q}=\begin{pmatrix}0 \\ 1 \\ 0\end{pmatrix}, \quad \boldsymbol{r}=\begin{pmatrix}0 \\ 0 \\ 1\end{pmatrix}, \quad $ から $\boldsymbol{p}'$, $\boldsymbol{q}'$, $\boldsymbol{r}'$ を求めて、これらの基底ベクトルから行列 $\displaystyle \begin{pmatrix} \boldsymbol{p}' & \boldsymbol{q}' & \boldsymbol{r}' \end{pmatrix} \quad$ をつくると任意の軸の周りに回転させる3次元行列が求まる。
Euler (1707-1783, 「一連の複数の角変位は1つの角変位と同値である」ことを証明した)にちなんでつけられた名前。
1つの角変位を、互いに垂直な3本の軸の周りの3つの一連の回転として定義する。
慣性空間からオブジェクト空間への変換の回転の順番で よく使われるのが、 heading - pitch - bank である。 heading は慣性空間のy軸周りの回転で、pitch はobject空間のx軸周りの回転、bank はobject空間のz軸周りの回転である。 どれも、軸の無限大から原点を見たときに時計回りが正方向となる。
軸の無限大から原点を見て時計回りを正方向としているが、 「慣性空間(右手座標系)のx軸, z軸の回転と、object空間(左手座標系)のx軸、z軸の回転は 結果として向きが逆となる」ことに注意。
object空間ではobjectはz軸の正方向を向いている。 y z | / | / +-------x
heading は yaw はどちらもy軸周りの回転という点では同じだが、座標空間が異なっていることに注意。 ただし、y軸周りの回転は、慣性空間のy軸と Object 空間のy軸が一致しているときに実行されるので この区別は重要ではない。 rollは bank の同義語である。
roll - pitch - yaw は、object空間から慣性空間へ回転する順番で名前がつけられている。
-180度 < heading , bank ≦ 180度、-90度≦ pitch ≦ 90度 とすれば一意に定まる(オイラー角の正準集合)。
「45°右へheading し、90°pitchを下げる」と 「90°pitchを左下駄から45°bank する」のは同じ向きになる。 pitch の角度として +90 か -90を選択すると、垂直軸の周りの回転に制限されてしまう。 「第2の回転(pitch)角が+90か-90だと、第1の回転(heading) と第3の回転(bank)が同じ軸の周りになってしまう」 現象を Gimbal lock (ジンバルロック)という。 この aliasing を正準集合から除去するために、ジンバルロックのケースでは垂直軸周りの回転をすべて headingに割り当てる。すなわち、正準集合では pitch が+90か-90ならばbankは0となる。
2つの方向AとBの間を補間したい場合が存在する。たとえば t が 0から1に変化するにつれ AからBへの変化を滑らかに補間するような中間の方向Cを計算したい場合がある。 この計算が難しい。
四元数には、1つのスカラー要素と1つの3次元ベクトル要素が含まれる。 通常はスカラー要素を $w$ と表す。 $\begin{bmatrix} w & \vec{v} \end{bmatrix} = \begin{bmatrix} w & \begin{pmatrix} x & y & z \end{pmatrix} \end{bmatrix}$
ハミルトンによって 1843 年に発明された。
$i^2 = j^2 = k^2 = -1 $,Euler は、一連の回転は単一の回転と同値であることを証明した。 3次元の任意の角変位は、単一の軸の周りの単一の回転として表現することができる。 方向をこの形式で表現する形式を、軸・角度 (axis-angle) 表現という。
長さ1の $\boldsymbol{n}$ の周りの $\theta$ ラジアンの回転として角変位を定義する。 四元数は、角変位の軸・角度表現として解釈することができる。
$ \displaystyle \begin{align} \boldsymbol{q} &= \begin{bmatrix} \cos \frac{\theta}{2} & \sin \frac{\theta}{2} ~ \boldsymbol{n} \end{bmatrix} \\\ &= \begin{bmatrix} \cos \frac{\theta}{2} & \begin{pmatrix} \sin \frac{\theta}{2} ~ \boldsymbol{n}_x & \sin \frac{\theta}{2} ~ \boldsymbol{n}_y & \sin \frac{\theta}{2} ~ \boldsymbol{n}_z \end{pmatrix} \end{bmatrix} \end{align}$四元数は符号を反転することができる。四元数 $\boldsymbol{q}$ と反転した $-\boldsymbol{q}$ は同じ角変位を表している。 すなわち、四元数形式ではすべての角度に対して2つの異なる表現があり、それらは互いに符号反転になっている。
幾何学的には、無の角変位を表現する2つの恒等四元数 $\begin{bmatrix}1 & \boldsymbol{0} \end{bmatrix}$ , $\begin{bmatrix}-1 & \boldsymbol{0} \end{bmatrix}$ が存在する。
四元数の共役は $\boldsymbol{q}^{*}$ と表記され、四元数のベクトル部分を符号反転することで得られる。
$\displaystyle \begin{eqnarray} \boldsymbol{q}^* &=& \begin{bmatrix} w & \boldsymbol{v} \end{bmatrix}{}^{*} &=& \begin{bmatrix} w & -\boldsymbol{v} \end{bmatrix} \\\ &=& \begin{bmatrix} w & \begin{pmatrix} x & y & z \end{pmatrix} \end{bmatrix}{}^{*} &=& \begin{bmatrix} w & \begin{pmatrix} -x & -y & -z \end{pmatrix} \end{bmatrix} \end{eqnarray} $四元数の逆数は $\boldsymbol{q}^{-1}$ と表記され、四元数の共役をその大きさで割ることで定義される。
$\displaystyle \boldsymbol{q}^{-1} = \frac{\boldsymbol{q}^{*}}{|| \boldsymbol{q} ||} $四元数の積は結合可能であるが、交換可能でははない。
$ (\boldsymbol{a}\boldsymbol{b})\boldsymbol{c} = \boldsymbol{a}(\boldsymbol{b}\boldsymbol{c})\\\ \boldsymbol{a}\boldsymbol{b} \neq \boldsymbol{b}\boldsymbol{a} $四元数の積の大きさは、大きさの積と等しい。
$\displaystyle \begin{eqnarray} || \boldsymbol{q}_1 \boldsymbol{q}_2 || &=& \sqrt{(w_1{}^2+x_1{}^2+y_1{}^2+z_1{}^2)(w_2{}^2+x_2{}^2+y_2{}^2+z_2{}^2)} \\\ &=& \sqrt{|| \boldsymbol{q}_1 ||^2 || \boldsymbol{q}_2 ||^2} \\\ &=& || \boldsymbol{q}_1 || ~ || \boldsymbol{q}_2 || \end{eqnarray} $四元数の積の逆数は、順序を逆にした逆数の積と等しい。
$\displaystyle \begin{eqnarray} (\boldsymbol{a} \boldsymbol{b})^{-1} &=& \boldsymbol{b}^{-1} \boldsymbol{a}^{-1} \\\ (\boldsymbol{q}_1 \boldsymbol{q}_2 \cdots \boldsymbol{q}_{n-1} \boldsymbol{q}_n)^{-1} &=& \boldsymbol{q}_n{}^{-1} \boldsymbol{q}_{n-1}{}^{-1} \cdots \boldsymbol{q}_2{}^{-1} \boldsymbol{q}_1{}^{-1} \end{eqnarray} $3次元座標 ( $x$, $y$, $z$ ) を四元数 $\boldsymbol{p} = \begin{bmatrix} 0 & \begin{pmatrix} x & y & z \end{pmatrix} \end{bmatrix}$ と表すことにする。 さらに、$\boldsymbol{n}$ を回転軸の単位ベクトル、$\theta$を回転角として 回転四元数 $\displaystyle \boldsymbol{q} = \begin{bmatrix} \cos\frac{\theta}{2} & \boldsymbol{n} \sin\frac{\theta}{2} \end{bmatrix}$ とすると、$\boldsymbol{p}'$ は $\boldsymbol{p}$ を $\boldsymbol{n}$ の周りに角度 $\theta$ 回転させた点となる。
$ \boldsymbol{p}' = \boldsymbol{q}^{-1} \boldsymbol{p} \boldsymbol{q} $slerp 演算は、四元数の間を滑かに補間できる。 $\boldsymbol{q}_0$ と $\boldsymbol{q}_1$ の間を $t=0 \sim 1$ とすると
$\displaystyle \boldsymbol{q} = \frac{\sin (1-t) \theta }{\sin\theta} \boldsymbol{q}_0 + \frac{\sin t \theta}{\sin \theta} \boldsymbol{q}_1 \\ \theta = \boldsymbol{q}_0 と \boldsymbol{q}_1のなす角 = \cos^{-1} (\boldsymbol{q}_0 \cdot \boldsymbol{q}_1) \quad\quad \because \boldsymbol{q}_0 \cdot \boldsymbol{q}_1 = || \boldsymbol{q}_0 || ~ || \boldsymbol{q}_1 || \cos\theta ~ , ~~ || \boldsymbol{q}_0 || = || \boldsymbol{q}_1 || = 1 $