(以下、まだ未完成の記事ですが、何かの役に立つかもしれないので、一旦公開しておきます。)
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本の軸を表しています。
この図を3D空間だとイメージしてください。 $ \boldsymbol{i} $ が x方向の軸、$ \boldsymbol{j} $ が y方向の軸、$ \boldsymbol{k} $ がz方向の軸です。
今回はたまたま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 と書いているのでわかるように、平面を表しています。
例えば $ 2 + 3 , \boldsymbol{i} $ は、以下のような2次元平面上の点です。
これは、複素数平面と呼ばれるものですね。
i は回転も表せる
実は $ \boldsymbol{i} $ には、軸を表すという意味以外に、$ \boldsymbol{i} \cdot \boldsymbol{i} = -1 $ という面白い定義がされています。(ちなみにこの $ \cdot $ は数字同士の掛け算を表しています。)
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回かけた、一つ一つの計算結果を 複素数平面 にプロットしてみると、
こんな風に、実はきれいに対称になってるんです。
ここに、$ \boldsymbol{i} $ を掛け算していった様子を矢印で書き込むと、
こうなります。綺麗ですね。しかもこれって、90度ずつの回転を表しています! (注: 今回は $ \boldsymbol{i} $ を横軸にとったので時計回りになっていますが、軸のとり方・図の書き方をかえると反時計回りになったりします。)
そうなんです。複素数に $ \boldsymbol{i} $ を掛け算することで回転を表すことができます。
i "だけ" では回転を表すことができない
でも実をいうと、90度の半分である、45度の回転は $ \times , \boldsymbol{i} $ だけでは表すことができません。もう一つの数字(実数)も使う必要があります。
$$ \times , \bigl( , \frac{1}{\sqrt{2}} + \frac{1}{\sqrt{2}} \boldsymbol{i} , \bigr) $$
(※ $ \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つの軸を示しています。
しかし、複素数のときとは違って、3次元を表す3つすべての軸に、 $ \boldsymbol{i}, \boldsymbol{j}, \boldsymbol{k} $ がついています。
なぜ3軸ともに虚数がついているかというと、対称性をもたせるためです。
クォータニオンの3つの虚数と対称性
実は、実数だけでは回転を表すことはできません。例えば複素数の場合、虚数の掛け算、例えば $ \cdot , \boldsymbol{i} $ は90度の回転を表しますが、実数の掛け算 $ \cdot , 2 $ は、2倍の拡大を表しているだけで、虚数と組み合わせないと回転を表すことができないのです。
このことを(クォータニオンの3次元空間ではなく)複素数平面に図示すると、こうなります。
上の図を見てもわかるように、複素数の場合の 2つの軸である、 実数軸と虚数軸は、一見対称的なように見えて、実は実数と虚数に対して (完全には) 対称ではないのです。
そこでクォータニオンでは、3次元を表す3軸にそれぞれ虚数をもたせて、$ x, y, z $ 方向の3つの軸に対してそれぞれ綺麗に対称的な (回転などの) 計算が出来るようになっています。(これが色々な面で非常に都合が良いのです。)
ちなみに、上の図を見てもわかるように、複素数平面とクォータニオンでは回転のさせ方が違う ことに気をつけてください。クォータニオンの回転は、基本的に 右ねじの法則 と同じです(軸のとり方によって、向きは逆になることがあります)。
この回転のさせ方は、3DCGでいうところの、x軸方向の回転、y軸方向の回転、z軸方向の回転にそのまま対応しているので、逆に複素数平面よりも覚えやすいのではないかと思います。
(以下、未執筆)
(TODO: 続きを書く)