クォータニオンが3Dの回転計算に使われる理由を、直感的に説明してみる (書きかけ) 

> (以下、まだ未完成の記事ですが、何かの役に立つかもしれないので、一旦公開しておきます。)

3DCGで回転計算をしようとすると、大抵、**クォータニオン (Quarternion)** という概念が出てきます。

ところが、このクォータニオン、3次元の回転を計算するはずのに **4次元** の計算になっているため、非常に理解しづらいんですよね。

人間って、3次元を超える概念は簡単には理解できないといいますが、今回はそのクォータニオンを出来る限りわかりやすく説明してみようと思います。

（あくまで直感的な説明ですので、多少数学的に厳密ではないところがありますが、わかりやすさを最優先させているので、その点はご了承ください。）

## そもそも、クオータニオンって何？

**クォータニオン (Quarternion、四元数)** とは、`quarter-` (クォーター) という言葉がついていることからもわかるように、$ (w, x, y, z) $ の4つの数字（4つの**次元**）で表される数です。

$$ w + x \, \boldsymbol{i} + y \, \boldsymbol{j} + z \, \boldsymbol{k} $$

なお、ここでの $ \boldsymbol{i}, \boldsymbol{j}, \boldsymbol{k} $ は、以下のような、3本の軸を表しています。

![スクリーンショット 2018-12-05 21.56.48.png](https://qiita-image-store.s3.amazonaws.com/0/44103/231f52df-8be3-f4ea-1517-fbcd7837c6f5.png)

この図を3D空間だとイメージしてください。 $ \boldsymbol{i} $ が x方向の軸、$ \boldsymbol{j} $ が y方向の軸、$ \boldsymbol{k} $ がz方向の軸です。

![スクリーンショット 2018-12-07 1.26.35.png](https://qiita-image-store.s3.amazonaws.com/0/44103/5b947684-d1da-e73f-3999-090485b4ad19.png)

今回はたまたまx方向が上ですが、軸の向きや、軸のとり方はいろいろバリエーションがあります。

ちなみに、$ w $ の部分は4次元目なので、ここでは一旦、見えないものだと思ってもらえばいいです。見えないのですが、軸としては存在するので4次元です。

この、一見よくわからない定義のクォータニオンですが、**3次元の回転や変形を表す**のに非常に便利な概念です。なので、3DCG関係のプログラミングを始めると、大抵クォータニオンに出くわすことになります。

### i, j, k を使う理由

ご存知の方にとっては蛇足かもしれませんが、どうしてこんな、$ \boldsymbol{i} $ みたいな文字をわざわざ使うかというと、これがないと単なる足し算になってしまうからです。

例えばもしクォータニオンが、

$$ w + x + y + z $$

こんな定義になっていたら、例えば w = 1、x = 3、y = 4、z = 5 のとき、

```math
\begin{align}
&\quad w + x + y + z \\
&= 1 + 3 + 4 + 5 \\
&= 13
\end{align}
```

みたいに計算できて、最終的に1つの数、つまり1次元になってしまうのでダメなのです（目的は "3次元の回転や変形" を表すことですからね）。だから、以下のような定義になっているのです。

$$ w + x \, \boldsymbol{i} + y \, \boldsymbol{j} + z \, \boldsymbol{k} $$

（ さらにいうと、$ 2 \, \boldsymbol{i} + 3 \, \boldsymbol{j} $ はこれ以上計算できず、 $ 2 \, \boldsymbol{i} + 3 \, \boldsymbol{j} $ のままです。$ 2 + 3 = 5 $ のようには計算できないものです。）

この $ \boldsymbol{i}, \boldsymbol{j}, \boldsymbol{k} $ があるおかげで、例えば、

$$ x \, \boldsymbol{i} + y \, \boldsymbol{j} + z \, \boldsymbol{k} = 2 \, \boldsymbol{i} + 3 \, \boldsymbol{j} + 4 \, \boldsymbol{k} $$

のとき、これをそのまま `(x,y,z) = (2,3,4)` のように、3次元の座標や3D回転などと対応させることができるというわけですね。

ちなみに、このような $ w $ の部分がない（ $ w = 0 $ の ）クォータニオンは、3次元上の座標を表すためにもよく使われるので、これをたまに**純粋クォータニオン**と呼んだりもします。

## 4次元だとイメージしづらいので、2次元にしてみる

さて、ここからの説明では、いきなり4つも数があるのはちょっと辛いので（3Dの図を書くのも大変ですし）、簡単のために、以下のような2次元の数を考えてみましょう。

$$ x + y \,\boldsymbol{i} $$

これは高校数学でも少し出てくる、**複素数** といわれるものですね。

これは、x, y と書いているのでわかるように、平面を表しています。

![スクリーンショット 2018-12-06 23.58.28.png](https://qiita-image-store.s3.amazonaws.com/0/44103/52f7c97b-de9a-65b9-c180-74332d724f8f.png)


例えば $ 2 + 3 \, \boldsymbol{i} $ は、以下のような2次元平面上の点です。

![スクリーンショット_2018-12-05_22.24.52_2.png](https://qiita-image-store.s3.amazonaws.com/0/44103/5ee94b5e-e810-6043-4d74-47cd4f2335f9.png)

これは、**複素数平面**と呼ばれるものですね。

### i は回転も表せる

実は $ \boldsymbol{i} $ には、軸を表すという意味以外に、$ \boldsymbol{i} \cdot \boldsymbol{i} = -1 $ という面白い定義がされています。（ちなみにこの $ \cdot $ は数字同士の掛け算を表しています。）

![スクリーンショット 2018-12-07 0.02.01.png](https://qiita-image-store.s3.amazonaws.com/0/44103/0e94fb21-bcbf-8d4e-d14e-23e27f682d7a.png)

2回かけてマイナスになるという数は、普通は存在しませんよね。なので、この $ \boldsymbol{i} $ を **虚数** と呼ぶこともあります。

この、$ \boldsymbol{i} \cdot \boldsymbol{i} = -1 $ というのを使って、$ 1 $に $ \boldsymbol{i} $ をどんどんかけていくと、なんと**1に戻ります**。

```math
\begin{align}
1 \cdot \boldsymbol{i} &= \boldsymbol{i} \\
\boldsymbol{i} \cdot \boldsymbol{i} &= -1 \\
-1 \cdot \boldsymbol{i} &= - \,\boldsymbol{i} \\
-\,\boldsymbol{i} \cdot \boldsymbol{i} &= 1
\end{align}
```

まぁ、$ \boldsymbol{i} \cdot \boldsymbol{i} = -1 $ なわけですから、

```math
\begin{align}
&\quad \boldsymbol{i} \cdot \boldsymbol{i} \cdot \boldsymbol{i} \cdot \boldsymbol{i} \\
&= (\, \boldsymbol{i} \cdot \boldsymbol{i} \,) \cdot (\, \boldsymbol{i} \cdot \boldsymbol{i} \,) \\
&= (\,-1\,) \cdot (\,-1\,) \\
&= 1
\end{align}
```

となるので、一見当たり前な気もしますが、この $ \boldsymbol{i} $ を4回かけた、一つ一つの計算結果を **複素数平面** にプロットしてみると、

![スクリーンショット 2018-12-05 22.48.57_2.png](https://qiita-image-store.s3.amazonaws.com/0/44103/e9a99dcf-eb7f-a19a-dbe4-afbb5e88a17f.png)


こんな風に、実はきれいに対称になってるんです。

ここに、$ \boldsymbol{i} $ を掛け算していった様子を矢印で書き込むと、

![スクリーンショット 2018-12-05 22.54.35_2.png](https://qiita-image-store.s3.amazonaws.com/0/44103/0b224f0f-a162-11d2-4670-3833b2bd7299.png)

こうなります。綺麗ですね。しかもこれって、**90度ずつの回転を表しています！** （注: 今回は $ \boldsymbol{i} $ を横軸にとったので時計回りになっていますが、軸のとり方・図の書き方をかえると反時計回りになったりします。）

そうなんです。複素数に $ \boldsymbol{i} $ を掛け算することで回転を表すことができます。

### i "だけ" では回転を表すことができない

でも実をいうと、90度の半分である、45度の回転は $ \times \, \boldsymbol{i} $ だけでは表すことができません。もう一つの数字（**実数**）も使う必要があります。

$$ \times \, \bigl( \, \frac{1}{\sqrt{2}}  + \frac{1}{\sqrt{2}} \boldsymbol{i} \, \bigr) $$

![スクリーンショット 2018-12-05 23.06.51.png](https://qiita-image-store.s3.amazonaws.com/0/44103/bf6c0518-223e-aae6-88cb-f99fae763287.png)

（※ $ \frac{1}{\sqrt{2}} $ についてはすぐ後で説明）

この「実数と虚数の2つがセットで、1つの回転を表せる」というのが、クォータニオンが**4次元である理由の1つ**です。実数と虚数の2つの数字があれば、1方向の回転を表すことができるように、**実数と3種類の虚数を使った、$ (w, x, y, z) $ の4種類の数字があれば、3方向の回転を表すことができる**のです。

ちなみに、ここで $ \frac{1}{\sqrt{2}} $ という不思議な数が登場している理由は、あまり深く考える必要はありません。

一応説明すると、角度が45度のとき、**単位円**（原点が中心で大きさが1の円）の円周上の座標が、

```math
\begin{align}
(x, y) &= (\cos45 ^\circ, \sin45 ^\circ) \\
&= \bigl( \frac{1}{\sqrt{2}}, \frac{1}{\sqrt{2}} \bigr)
\end{align}
```

になるためで、下図をみるとわかるように、**原点からの距離が1になるように (単位円の円周上に乗るように)**、調整されているのです。

(TODO: ここに単位円の図を入れる)

細かい計算よりも、この**「原点からの距離が1である」**というのがすごく重要です。実は、*原点からの距離が1で "ない" 複素数の掛け算* は、拡大・縮小・剪断など、**回転以外の変形も表してしまう**ことになります。この事実は重要で、クォータニオンの説明でも後々で触れることになります。

## クォータニオン再登場

さて、ここで満を持してクォータニオンが登場します。

$$ w + x \, \boldsymbol{i} + y \, \boldsymbol{j} + z \, \boldsymbol{k} $$

ここで、$ \boldsymbol{i}, \boldsymbol{j}, \boldsymbol{k} $ は、複素数同様に、以下のような定義になっています。

```math
\begin{align}
\boldsymbol{i} \cdot \boldsymbol{i} &= -1 \\
\boldsymbol{j} \cdot \boldsymbol{j} &= -1 \\
\boldsymbol{k} \cdot \boldsymbol{k} &= -1 \\
\boldsymbol{i} \cdot \boldsymbol{j} \cdot \boldsymbol{k} &= -1
\end{align}
```

最初の３つは、複素数における**虚数の定義と同じ**ですね。また、最後の１つは、複素数のときと違って虚数が３つあるので、**その３つの虚数の関係性**を示しています。

なお、最初に解説した通り、 $ \boldsymbol{i}, \boldsymbol{j}, \boldsymbol{k} $ は3つの軸を示しています。

![スクリーンショット 2018-12-05 21.56.48.png](https://qiita-image-store.s3.amazonaws.com/0/44103/872e42f1-e0b7-d588-9d3c-8336534f22c2.png)

しかし、複素数のときとは違って、3次元を表す**3つすべての軸**に、 $ \boldsymbol{i}, \boldsymbol{j}, \boldsymbol{k} $ がついています。

なぜ3軸ともに虚数がついているかというと、**対称性をもたせるため**です。

### クォータニオンの3つの虚数と対称性

実は、**実数だけでは回転を表すことはできません**。例えば複素数の場合、虚数の掛け算、例えば $ \cdot \, \boldsymbol{i} $ は90度の回転を表しますが、実数の掛け算 $ \cdot \, 2 $ は、2倍の拡大を表しているだけで、**虚数と組み合わせないと回転を表すことができない**のです。

このことを（クォータニオンの3次元空間ではなく）複素数平面に図示すると、こうなります。

![スクリーンショット 2018-12-06 23.15.24_2.png](https://qiita-image-store.s3.amazonaws.com/0/44103/8cfe8c98-ae92-f0bb-008b-197597f2c77b.png)

上の図を見てもわかるように、*複素数の場合の* 2つの軸である、 実数軸と虚数軸は、一見対称的なように見えて、実は実数と虚数に対して (完全には) **対称ではない**のです。


そこでクォータニオンでは、**3次元を表す3軸にそれぞれ虚数をもたせて**、$ x, y, z $ 方向の3つの軸に対してそれぞれ綺麗に対称的な (回転などの) 計算が出来るようになっています。（これが色々な面で非常に都合が良いのです。）

![スクリーンショット 2018-12-06 23.21.04.png](https://qiita-image-store.s3.amazonaws.com/0/44103/59c9564a-87f0-a107-da92-a33ef24a8d0e.png)

ちなみに、上の図を見てもわかるように、**複素数平面とクォータニオンでは回転のさせ方が違う** ことに気をつけてください。クォータニオンの回転は、基本的に **右ねじの法則** と同じです（軸のとり方によって、向きは逆になることがあります）。

![スクリーンショット 2018-12-06 23.45.25_2.png](https://qiita-image-store.s3.amazonaws.com/0/44103/79a1404a-8d4f-b2df-30c4-2f5b5f1741cd.png)

この回転のさせ方は、3DCGでいうところの、x軸方向の回転、y軸方向の回転、z軸方向の回転にそのまま対応しているので、逆に複素数平面よりも覚えやすいのではないかと思います。

(以下、未執筆)

(TODO: 続きを書く)