クォータニオンを真に理解する qpq-1の導出

# TL;DR;

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

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

```math
\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」を使って表すと

```math
\begin{multline}

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

\end{multline}
```

と表すことが出来ます。

本記事は式1のベクトル式をクォータニオンに置き換える方法とqpq-1までの導出過程を記載します。

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

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

2次元の世界では複素数( $\cos\theta + \mathbf{i}\sin\theta$ )を使えば、ユークリッド平面上の頂点を簡単に回転せられるこが分かっていました。

同様に３次元の世界においても、複素数を使って頂点を回転させることが出来るのではないかと考えられ、ハミルトンによって発見されました。

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

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

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

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

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

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

## 積の結合法則

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

## 積の分配法則

```math
\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}
```

## 積は非可換

```math
\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}
```

```math
\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

```math
\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 のとき、

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

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

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

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

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

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

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

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

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

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

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

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


```math
\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}
```

```math
\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$ の関係は共役複素数の関係になっていることが分かります。
従って

```math
-\frac{(p_1p_2 + p_2p_1)}{2} = x_1x_2 + y_1y_2 + z_1z_2
```

```math
\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}
```

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

ベクトルの内積

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

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

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

ベクトルの外積

```math
\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>
```

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

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

上記を表にまとめます。

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

以下にベクトルからハミルトンの複素数への変換をまとめておきます。
これを使って 式１ を複素数に変換し、 $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 」の導出

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

```math:
\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'を表すベクトル式を複素数として表すことが出来ました。
イコールを用いていますが、あくまでも変換表によって置き換えただけです。

```math
\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}
```

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

```math
\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倍角の公式を用いると

---

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

```math
\text{2倍角の公式} \\
\sin\theta = 2\sin\frac{\theta}{2}\cos\frac{\theta}{2}
```

---

```math
\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** は **ハミルトンの複素数** であるから

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

ゆえに

```math
\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}
```

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

またこの導出過程の際に、 $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}$

# クォータニオンにおける回転について

クォータニオンにおける回転の視覚化はこちらで解説しています。

クォータニオンは「４つの軸(実軸、i軸, j軸, k軸)」を持つ空間」上で回転している
https://qiita.com/ysn551/items/cf98fd87acbce7335243


# 参考書籍

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

* [ゲームプログラミングのための3Dグラフィックス数学](https://www.amazon.co.jp/%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE3D%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E6%95%B0%E5%AD%A6-Eric-Lengyel/dp/4939007375/)
* [実例で学ぶゲーム3D数学](https://www.amazon.co.jp/%E5%AE%9F%E4%BE%8B%E3%81%A7%E5%AD%A6%E3%81%B6%E3%82%B2%E3%83%BC%E3%83%A03D%E6%95%B0%E5%AD%A6-Fletcher-Dunn/dp/4873113776)