クォータニオンが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

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

スクリーンショット 2018-12-07 1.26.35.png

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

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

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

i, j, k を使う理由

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

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

$$ w + x + y + z $$

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

\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

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

スクリーンショット_2018-12-05_22.24.52_2.png

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

i は回転も表せる

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

スクリーンショット 2018-12-07 0.02.01.png

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

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

\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 $ なわけですから、

\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

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

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

スクリーンショット 2018-12-05 22.54.35_2.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

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

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

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

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

\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} $ は、複素数同様に、以下のような定義になっています。

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

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

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

スクリーンショット 2018-12-05 21.56.48.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

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

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

スクリーンショット 2018-12-06 23.21.04.png

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

スクリーンショット 2018-12-06 23.45.25_2.png

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

(以下、未執筆)

(TODO: 続きを書く)