Unity
数学
3D
クォータニオン

クォータニオンを真に理解する

TL;DR;

ある頂点Pを任意の軸Aの周りにθ回転させた時の頂点P'は、
ベクトル空間上では、以下のように表すことが出来ます。

式1 (ベクトルによる頂点の回転式)

\begin{multline}
\vec{P}' = \vec{P}\cos\theta + (\vec{A} \times \vec{P})\sin\theta + \vec{A} (\vec{A}\vec{P})(1 - \cos\theta)
\end{multline}

上記のベクトル式は、「クォータニオン(四元数) q」を使って表すと

\begin{multline}

\vec{P}' = q p q^{-1}

\end{multline}

と表すことが出来ます。

本記事は式1から $qpq^{-1}$ への導出過程を説明し、クォータニオンによって頂点が回転できることを示します。

なおベクトルは大文字で、複素数は小文字で表現し、
なるべく説明を簡略化させるため、基礎的なベクトル空間の知識があることを想定しています。

ハミルトンの複素数 (クォータニオン)

2次元の世界では複素平面によって、複素数( $\cos\theta + \mathbf{i}\sin\theta$ )を使って頂点を回転できることが知られていました。

これと同様に3次元の世界においても「複素数を使って頂点を回転させる方法」が研究され、
ハミルトンによって発見されました。

この際ハミルトンは、従来の複素数(x + yi)を拡張し、
以下の関係式が成立する「3つの独立した虚数」を新たに考え出しました。

i^2 = j^2 = k^2 = ijk =  -1 \\
ij = -ji = k \\
jk = -kj = i \\
ki = -ik = j \\

本記事では、この3つの独立した虚数を用いて表される式 c を「ハミルトンの複素数」と呼びます。

\mathbf{c} = w + xi + yj + zk \quad \text{(w, x, y, zは実数)}

ハミルトンの複素数の計算法則について

ここではハミルトンの複素数c は、以下の計算法則を持つことを確認しておきます。
これらの法則は、 $qpq^{-1}$ 導出過程で利用します。

積の結合法則

\mathbf{c_1}\,(\mathbf{c_2}\mathbf{c_3}) = (\mathbf{c_1}\mathbf{c_2}) \,\mathbf{c_3}

積の分配法則

\begin{align} 
(\mathbf{c_1} + \mathbf{c_2}) \,\mathbf{c_3} &= \mathbf{c_1}\mathbf{c_3} + \mathbf{c_2}\mathbf{c_3} \\
\mathbf{c_1}\, (\mathbf{c_2} + \mathbf{c_3}) &= \mathbf{c_1}\mathbf{c_2} + \mathbf{c_1}\mathbf{c_3} 
\end{align}

積は非可換

\begin{align} 
c_1c_2 &= (w_1 + x_1i + y_1j + z_1k)(w_2 + x_2i + y_2j + z_2k) \\
       &= (w_1w_2 - x_1x_2 - y_1y_2 - z_1z_2) \\
          &\quad + i\, (w_1x_2 + w_2x_1 \; {\color{red}{+}} \; y_1z_2  \; {\color{red}{-}} \;  z_1y_2) \\
          &\quad + j\, (w_1y_2 + w_2y_1 \; {\color{red}{+}} \; z_1x_2 \; {\color{red}{-}} \; x_1z_2) \\
          &\quad + k\, (w_1z_2 + w_2z_1 \; {\color{red}{+}} \; x_1y_2 \; {\color{red}{-}} \; y_1x_2)
\end{align}
\begin{align}
c_2c_1 &= (w_2 + x_2i + y_2j + z_2k)(w_1 + x_1i + y_1j + z_1k) \\
       &= (w_1w_2 - x_1x_2 - y_1y_2 - z_1z_2) \\
          &\quad + i\, (w_1x_2 + w_2x_1 \; {\color{red}{-}} \; y_1z_2 \; {\color{red}{+}} \; z_1y_2) \\
          &\quad+ j\, (w_1y_2 + w_2y_1 \; {\color{red}{-}} \; z_1x_2 \; {\color{red}{+}} \; x_1z_2) \\
          &\quad+ k\, (w_1z_2 + w_2z_1 \; {\color{red}{-}} \; x_1y_2 \; {\color{red}{+}} \; y_1x_2) \\
\end{align}

従って $c_1c_2 \neq c_2c_1$

cc

\begin{align}
cc &= (w + xi + yj + zk) \; (w + xi + yj + zk) \\
   &= (w^2 - x^2 - y^2 - z^2) + 2wxi + 2wyj + 2wzk
\end{align}

特に c が純虚数、つまり w = 0 のとき、

\begin{align}
cc &= (xi + yj + zk) \; (xi + yj + zk) \\
   &= - x^2 - y^2 - z^2 \\
   &= - |c|^2
\end{align}

ベクトル → ハミルトンの複素数

ハミルトンはベクトル空間上の頂点P(<x, y, z>)を3つの独立した虚数を使って、以下のように定義しました。

任意の頂点P <x,y,z> を表すハミルトンの複素数 p
$p = x \, \mathbf{i} + y \, \mathbf{j} + z \, \mathbf{k}$

これによって「ベクトルとハミルトンの複素数」は、その成分を通じてつなげることが出来ます。

ベクトルのスカラー倍をハミルトンの複素数を用いて表す

ベクトルのスカラー倍とその演算結果

\vec{P}' = k\vec{P} = \; <kx, ky, kz>

であるから、
ベクトルのスカラー倍は、ハミルトンの複素数を用いると以下のように表せます。

\vec{P}' = k\vec{P} = kp

ベクトルの内積と外積をハミルトンの複素数を用いて表す

ベクトルの内積と外積をハミルトンの複素数を用いて表す前に、
p1とp2において以下の関係があることを確認しておきます。

\begin{align}
p_1 \, p_2 &=  (x_1 \mathbf{i} + y_1 \mathbf{j} + z_1 \mathbf{k}) \, (x_2 \mathbf{i} + y_2 \mathbf{j} + z_2 \mathbf{k} ) \\
&= -\, (x_1x_2 + y_1y_2 + z_1z_2) \\
 &\quad + \mathbf{i} \, (y_1z_2 - z_1y_2) \\
 &\quad + \mathbf{j} \, (z_1x_2 - x_1z_2) \\
 &\quad + \mathbf{k} \, (x_1y_2 - y_1x_2) \\
&= -w + x \, \mathbf{i} + y\, \mathbf{j} + z\, \mathbf{k}
\end{align}
\begin{align}
p_2 \, p_1 &= (x_2 \mathbf{i} + y_2 \mathbf{j} + z_2 \mathbf{k}) \, (x_1 \mathbf{i} + y_1 \mathbf{j} + z_1 \mathbf{k} ) \\
&= -\, (x_1x_2 + y_1y_2 + z_1z_2) \\
 &\quad - \mathbf{i} \, (y_1z_2 - z_1y_2) \\
 &\quad - \mathbf{j} \, (z_1x_2 - x_1z_2) \\
 &\quad - \mathbf{k} \, (x_1y_2 - y_1x_2) \\
&= -w - x \, \mathbf{i} - y\, \mathbf{j} - z\, \mathbf{k}
\end{align}

$p_1p_2$ と $p_2p_1$ の関係は共役複素数の関係になっていることが分かります。
従って

-\frac{(p_1p_2 + p_2p_1)}{2} = x_1x_2 + y_1y_2 + z_1z_2
\begin{align}
\frac{p_1p_2 - p_2p_1}{2} &= (y_1z_2 - z_1y_2) \, \mathbf{i}
+ (z_1x_2 - x_1z_2) \, \mathbf{j}
+ (x_1y_2 - y_1x_2) \, \mathbf{k}
\end{align}

上式を使ってベクトルの内積と外積をハミルトンの複素数に変換します。

ベクトルの内積

\vec{P_1}\vec{P_2}
 = x_1x_2 + y_1y_2 + z_1z_2

従ってベクトルの内積をハミルトンの複素数を使って表すと

\vec{P_1}\vec{P_2} = -\frac{(p_1p_2 + p_2p_1)}{2} 

ベクトルの外積

\vec{P_1} \times \vec{P_2} = \; <y_1z_1 - z_1y_2, \; z_1x_2 - x_1z_2, \; x_1y_2 - y_1x_2>

従ってベクトルの外積をハミルトンの複素数を使って表すと

\vec{P_1} \times \vec{P_2} = \frac{p_1p_2 - p_2p_1}{2}

上記を表にまとめます。

ベクトル → ハミルトンの複素数 変換表

以下にベクトルからハミルトンの複素数への変換をまとめておきます。
これを使って 式1 を複素数に変換し、 $qpq^{-1}$ の導出を目指します。

ベクトル ハミルトンの複素数 成分による値表示
$\vec{P}$ $p = x \, \mathbf{i} + y \, \mathbf{j} + z \, \mathbf{k}$ <x, y, z>
$k\vec{P}$ $kp$ <kx, ky, kz>
$\vec{P_1}\vec{P_2}$ $-\frac{(p_1p_2 + p_2p_1)}{2}$ $x_1x_2 + y_1y_2 + z_1z_2$
$\vec{P_1} \times \vec{P_2}$ $\frac{p_1p_2 - p_2p_1}{2}$ $ < y_1z_1 - z_1y_2, \, z_1x_2 - x_1z_2, \, x_1y_2 - y_1x_2 >$

「qpq-1 」の導出

一旦変換表をもとに式1のベクトル式を「ハミルトンの複素数」を用いて複素数に変換します。

\begin{align}
\vec{P}' &= \vec{P}\cos\theta + (\vec{A} \times \vec{P})\sin\theta + \vec{A}(\vec{A}\vec{P})(1 - \cos\theta) \\
  &= p\cos\theta + \frac{ap -pa}{2}\sin\theta - a\frac{ap + pa}{2}(1 - \cos\theta) \\

&\text{注: } \; \vec{A}(\vec{A}\vec{P}) = \vec{A}(k) = ka \quad \text{(kはベクトルの内積なので実数)}
\end{align}

つまりある頂点Pを任意の軸A(単位ベクトル)まわりに回転した頂点P'を表すベクトル式を複素数として表すことが出来ました。
イコールを用いていますが、あくまでも変換表によって置き換えただけです。

\begin{align}
\vec{P}' &= \vec{P}\cos\theta + (\vec{A} \times \vec{P})\sin\theta + \vec{A}(\vec{A}\vec{P})(1 - \cos\theta) \\
  &= p\cos\theta + \frac{ap -pa}{2}\sin\theta - a\frac{ap + pa}{2}(1 - \cos\theta)
\end{align}

ここからは変換した複素数をその演算規則に則ってまとめていきます。

\begin{align}
\vec{P}' &= \vec{P}\cos\theta + (\vec{A} \times \vec{P})\sin\theta) + \vec{A}(\vec{A}\vec{P})(1 - \cos\theta) \\
  &= p\cos\theta + \frac{ap -pa}{2}\sin\theta - a \frac{ap + pa}{2}(1 - \cos\theta) \\
  &= p\cos\theta + \frac{ap -pa}{2}\sin\theta - \frac{a(ap + pa)}{2}(1 - \cos\theta) \\
  &= p\cos\theta + \frac{ap -pa}{2}\sin\theta - \frac{(aa)p + apa}{2}(1 - \cos\theta)  \\
  &= p\cos\theta + \frac{ap -pa}{2}\sin\theta + \frac{|a|^2p - apa}{2}(1 - \cos\theta)  \\
  &= p\cos\theta + \frac{ap -pa}{2}\sin\theta + \frac{p - apa}{2}(1 - \cos\theta)  \\
  &= p\frac{1 + \cos\theta}{2} + \frac{ap -pa}{2}\sin\theta - \frac{apa}{2}(1 - \cos\theta) \\
\end{align}

ここで以下の三角関数の半角の公式と2倍角の公式を用いると


\text{半角の公式} \\
\sin^2 \frac{\theta}{2} = \frac{1 - \cos\theta}{2} \\
\cos^2 \frac{\theta}{2} = \frac{1 + \cos\theta}{2} \\
\text{2倍角の公式} \\
\sin\theta = 2\sin\frac{\theta}{2}\cos\frac{\theta}{2}

\begin{align}
\vec{P}' &= \vec{P}\cos\theta + (\vec{A} \times \vec{P})\sin\theta) + \vec{A}(\vec{A}\vec{P})(1 - \cos\theta) \\
  &= p\frac{1 + \cos\theta}{2} + \frac{ap -pa}{2}\sin\theta - \frac{apa}{2}(1 - \cos\theta) \\
  &= p\cos^2\frac{\theta}{2} + (ap - pa)\sin\frac{\theta}{2}\cos \frac{\theta}{2} -apa\sin^2\frac{\theta}{2} \\
  &= \biggl( p\cos^2\frac{\theta}{2} + ap\sin\frac{\theta}{2}\cos\frac{\theta}{2} \biggr) - \biggl(pa\sin\frac{\theta}{2}\cos\frac{\theta}{2} + apa\sin^2\frac{\theta}{2}\biggr) \\
  &= \Bigl(\cos\frac{\theta}{2} + a\sin\frac{\theta}{2}\Bigr) \Bigl(p\cos\frac{\theta}{2}\Bigr) - \Bigl(\cos\frac{\theta}{2} + a\sin\frac{\theta}{2}\Bigr) \Bigl(pa\sin\frac{\theta}{2}\Bigr) \\
  &= \Bigl(\cos\frac{\theta}{2} + a\sin\frac{\theta}{2}\Bigr) \Bigl(p\cos\frac{\theta}{2} - pa\sin\frac{\theta}{2}\Bigr) \\
  &= \Bigl(\cos\frac{\theta}{2} + a\sin\frac{\theta}{2} \Bigr) \; p \; \Bigl(\cos\frac{\theta}{2} - a\sin\frac{\theta}{2}\Bigr)
\end{align}

ここで、 $q = \cos\frac{\theta}{2} + a\sin\frac{\theta}{2}$ と置くと qハミルトンの複素数 であるから

q\bar{q} = \cos^2\frac{\theta}{2} + |a|^2\sin^2\frac{\theta}{2} = 1 \\
\therefore \bar{q} = q^{-1}

ゆえに

\begin{align}
\vec{P}' &= \vec{P}\cos\theta + (\vec{A} \times \vec{P})\sin\theta + \vec{A}(\vec{A}\vec{P})(1 - \cos\theta) \\
  &= \Bigl(\cos\frac{\theta}{2} + a\sin\frac{\theta}{2} \Bigr) \; p \; \Bigl(\cos\frac{\theta}{2} - a\sin\frac{\theta}{2}\Bigr) \\
  &= qpq^{-1}
\end{align}

このようにハミルトンは、「3つの独立した虚数に拡張した複素数(ハミルトンの複素数)」を用いることで、
3次元の頂点を回転するベクトル式を複素数に変換できることを示しました。

またこの導出過程の際に、 $q = \cos\frac{\theta}{2} + a\sin\frac{\theta}{2}$ と置き、
式1の回転を表すベクトル式は $qpq^{-1}$ と表すことが出来ました。

つまりこの q は、「ある頂点Pを任意の軸Aでθ回転させるためのハミルトンの複素数」と読むことが出来ます。

これを「クォータニオン」という言葉を使ってまとめ直します。

クォータニオンとは

  • ハミルトンによって拡張された虚数を用いて表される複素数cである
    $c = w + xi + yj +zk \quad \text{(w, x, y, zは実数)}$
  • ある任意の頂点を回転させることが出来るクォータニオンqは以下のように表せる
    $q = \cos\frac{\theta}{2} + a\sin\frac{\theta}{2}$

今回この記事を書いた動機

本記事において、あえてクォータニオン(四元数)という言葉ではなく、「ハミルトンの複素数」とした理由として
まさに「クォータニオン(四元数)」という命名こそ全てを分かりにくくしているという思いからです。

クォータニオンはハミルトンによって拡張された複素数に過ぎません。
ハミルトンは、ある頂点P <x, y, z> を 3つの独立した虚数を用いて $p = xi + yj + zk$ と表すことで、
3次元における頂点の回転をベクトル表記から複素数表記に変換することに成功したのです。

ここで非常に注意しなければならないことは、単純に位置ベクトルP ($\vec{P} = x\vec{e_0} + y\vec{e_1} + z\vec{e_2}$)を
$p = xi + yj +zk$ としたわけではないということです。
この2つは直接結びついていません。

ほとんどのクォータニオン解説サイトが 位置ベクトルPはw=0のクォータニオン また、クォータニオンの虚数部をベクトルとみなせる という解説があり、これが世にはびこっているという現状があります。

ただこの現状の根本の原因は、多くの参考書籍において、クォータニオンの説明が $qpq^{-1}$ という式ありきで始まり、 $qpq^{-1}$ を ベクトル表記に変換し、式1が導き出されるという流れで解説がされてしまっていることだと思います。
従っていきなり突然 $qpq^{-1}$ が出てくるため、多くの参考サイトにて独自の解釈がついてしまったのだろうと思います。

今回「式1」から $qpq^{-1}$ を導出することによって、 ついでにクォータニオンに対する解説を試みました。

以上

2019年もよろしくおねがいします。
(qiitaの1年で古くなりました機能はこういった挨拶文にとても有効ですね。)

参考書籍

式1の導出過程は以下の参考書にて非常に詳しく説明されています。
ただクォータニオンの説明は $qpq^{-1}$ から 式1 が導き出されるという解説になっており、
$qpq^{-1}$ がどこからどう出てくるんだという辛さがあります。