7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-05

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

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: 続きを書く)

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?