四元数(クォータニオン)の性質

応用が目的なのであまり細かい部分にまでは踏み込まない。

[
前の記事へ]  [物理数学の目次へ]  [次の記事へ]


共役と逆元

 前回に引き続き、四元数(クォータニオン)の性質を紹介していこう。

 四元数は次のように表せるのだった。

\[ \begin{align*} A \ =\ \alpha \ +\ \beta \, i \ +\ \gamma \, j \ +\ \delta \, k \end{align*} \]
 これに対して次のようなものを定義して「四元数の共役」と呼ぶことにする。
\[ \begin{align*} \bar{A} \ =\ \alpha \ -\ \beta \, i \ -\ \gamma \, j \ -\ \delta \, k \end{align*} \]
 複素共役に似たものだと思って欲しい。物理では複素共役を\( a^{\ast} \)と表し、数学では\( \bar{a} \)と表す習慣があるが、四元数と物理はあまり関係がないので、ここでは数学の習慣に従うことにする。

 複素共役とよく似た次のような法則が成り立っている。

\[ \begin{align*} A \, \bar{A} \ =\ \bar{A} \, A \ =\ |A|^2 \end{align*} \]
 これは実際に試してみれば簡単に確かめられる。一度試してみてじっくり眺めればなぜそうなるのかも見えてくるだろう。頭の中だけで考えるのは少し難しいかもしれない。

 この右辺は絶対値の 2 乗であって、ただの(0 または正の)実数である。絶対値が 0 のとき以外なら、これで両辺を割ってみることは問題なく実行可能である。やってみよう。

\[ \begin{align*} A \, \frac{\bar{A}}{|A|^2} \ =\ \frac{\bar{A}}{|A|^2} \, A \ =\ 1 \end{align*} \]
 なるほど、\( A \)に対して\( \frac{\bar{A}}{|A|^2} \)というものを作ってやって、それを右からでも左からでも掛けてやれば結果は 1 になるということが見えてくる。それはまるで逆数のようなものであるが、四元数はただの実数ではないので、「逆元」という呼び方をしておこう。
\[ \begin{align*} A\sup{-1} \ =\ \frac{\bar{A}}{|A|^2} \end{align*} \]
 これは四元数の割り算を定義したのと同じことになる。逆数を掛けるのは割ったことと同じだからだ。実は複素数にも全く同じルールが成り立っていたのだが、逆元という表現をしていないのであまり意識していなかったかもしれない。

 四元数の逆元を求める作業は、このように、とても簡単である。

 他に紹介しておいたほうがいい性質はあっただろうか。次のような性質もよく使う。

\[ \begin{align*} \overline{AB} \ =\ \bar{B}\,\bar{A} \end{align*} \]
 積の順番が入れ替わることに気を付けよう。複素数の時には順序が入れ替わることはなかったのだった。

 前回は、「積の絶対値と絶対値の積が等しい」という性質を満たすように四元数を定義したという話をしたが、逆に、この積の共役の性質から「積の絶対値と絶対値の積が等しい」ことを示すこともできる。

\[ \begin{align*} |AB|^2 \ &=\ AB \, \overline{AB} \\ &=\ AB \, \bar{B} \, \bar{A} \\ &=\ A \, (B \, \bar{B}) \, \bar{A} \\ &=\ A \, (|B|^2) \, \bar{A} \\ &=\ A \, \bar{A} \, |B|^2 \\ &=\ |A|^2 \, |B|^2 \\[5pt] \therefore \ |AB| &= |A|\,|B| \end{align*} \]
 矛盾なくうまく出来ているものである。


バカなりに想像してみる

 複素数どうしの積には、複素平面での回転という意味があったのだった。四元数どうしの積にも何かそのような視覚的イメージが見いだせたりするものだろうか?

 \( i,j,k \)はどれも 2 乗すると -1 になる性質があるので、複素平面と似たことが成り立っていそうではある。しかし四元数には 4 つの要素があるので、そのようなことを考えるとなると 4 次元空間での回転を相手にすることになるだろう。四元数を 4 次元空間の 4 つの座標軸\( (w,x,y,z) \)に対応させてみよう。\( w \)が四元数の実数部分に対応していて、\( x,y,z \)がそれぞれ\( i,j,k \)に対応しているとしてみる。

 \( wx \)平面、\( wy \)平面、\( wz \)平面をそれぞれ単独に考える限りは、複素平面での回転と同じ関係が成り立っていそうだ。ところがこれらが入り混じるとなると、一体どう回転しているのか、本当に回転に対応させて考えても良いものなのかどうか把握が難しい。さらに\( xy \)平面や\( yz \)平面や\( zx \)平面ではどんなことが起きているかというのも未体験ゾーンである。

 回転にすごく関係がありそうだということは感じるのだが、4 次元でのイメージに脳が追いつかない。


こんなことは言える

 \( i,j,k \)はそれぞれ三つ巴の関係になっていて対称的である。これはなんとなくベクトルの外積の関係を思い出させる。外積は積の順序を入れ替えると符号がひっくり返るが、そういう点でも似ている。いや、四元数の全体では積の順序を入れ替えても符号がひっくり返るような単純な関係ではないのだが、\( i,j,k \)の関係だけを見るとそうなっているという話だ。

 外積というのは 2 つの 3 次元ベクトル\( \Vec{A}(x,y,z) \)\( \Vec{B}(X,Y,Z) \)がある時に、

\[ \begin{align*} \Vec{A} \times \Vec{B} \ =\ ( yZ - zY \ ,\ zX - xZ \ ,\ xY - yZ ) \end{align*} \]
で計算できるのだった。おそらく似た結果が得られることを期待して、2 つの四元数を次のように表してみる。
\[ \begin{align*} A \ &=\ x \, i \ +\ y \, j \ +\ z \, k \\ B \ &=\ X \, i \ +\ Y \, j \ +\ Z \, k \end{align*} \]
 四元数の実数部分だけを 0 にしたわけだ。その上でこれらの四元数の積を計算してやると、
\[ \begin{align*} AB \ =\ -(xX + yY + zZ) \ +\ (yZ - zY)\,i \ +\ (zX - xZ)\,j \ +\ (xY - yX)\,k \end{align*} \]
となることが分かる。\( i,j,k \)の各成分を見ると、外積の計算をしたのと同じになっている!しかし、実数部分に邪魔なものがついてきてしまっている。いや、邪魔とも言えないな。よく見るとこちらは、内積を計算したのと同じ結果ではないか。マイナスが余計に付いてきているが。

 内積と外積を同時に計算できるのが四元数なのか!と言いたい気もするが、実数部分に何も入れなかった場合にだけ成り立つ話であり、これが四元数の本質だとも言い難い。性質の一面を見ているだけだ。なんとなくもどかしい。

 \( AB = -BA \)が言えない理由も見えてきただろう。実数部分に余計な副作用として内積の結果が出てこなければ、\( AB = -BA \)が言えたはずなのだ。しかし全く外積と同じものならばわざわざ四元数を考える必要もないわけで、四元数そのものの性質をもっとはっきり見たいという願いは叶うだろうか?

 この記事は四元数の応用という目的で進んでいるので追求はほどほどにしておこう。


応用が広がるきっかけになった公式

 あまり説明を長引かせても仕方がない。いよいよ、3 次元回転をスマートに表すという応用のために最も重要な公式を紹介しよう。

 ある単位ベクトル\( \Vec{u} = (u_x, u_y, u_z) \)を軸として回転角\( \theta \)だけ右ねじの方向に回転させるとする。この時、点\( A(x,y,z) \)の回転後の座標\( A'(x',y',z') \)はどうやって求めたらいいだろうか?それが四元数を使えば簡単に表せるというのである。

 まず、次のような四元数を用意してやる。

\[ \begin{align*} X \ =\ \cos \frac{\theta}{2} \ +\ \sin \frac{\theta}{2}(u_x \, i \ +\ u_y \, j \ +\ u_z \, k ) \end{align*} \]
 これが回転軸の向きと回転角度を表す四元数なわけだ。そして、点\( A \)の座標を表す四元数を次のように用意してやる。
\[ \begin{align*} A \ =\ x \, i \ +\ y \, j \ +\ z \, k \end{align*} \]
 実数部分は 0 にしておく。そして次のような計算をしてやる。
\[ \begin{align*} B \ =\ X A \bar{X} \end{align*} \]
 結果として得られる四元数\( B \)の実部は 0 になり、三つの虚部の方にはそれぞれ\( (x', y', z') \)の座標値が入っているというのである。これは驚きだ。


注意点

 この公式について気になるだろうことを幾つか書いておこう。

 この\( \Vec{u} = (u_x, u_y, u_z) \)は、必ず長さ 1 の単位ベクトルでないといけない。そうでなければ正しい結果が得られない。残念ながら、ベクトルの長さを 2 にしておくと結果が 2 倍になって出てくるだとか、そういう甘いルールは成り立っていない。

 \( \theta/2 \)というのも気になるだろう。なぜ 2 で割る必要があるのか。これでは\( \theta = 0 \)\( \theta = 2\pi \)とで違う結果になってしまうのではないだろうか?

 これについては心配は要らない。実際に積を実行することを考えてみると分かる。\( X \)\( \bar{X} \)のどちらにも全ての項に一つずつの三角関数が含まれているから、積の結果の各項には必ず\( \sin^2 \frac{\theta}{2} \)\( \cos^2 \frac{\theta}{2} \)か、\( \sin \frac{\theta}{2}\cos \frac{\theta}{2} \)という形のいずれかが含まれることになる。これらは三角関数のよく知られた公式によって、

\[ \begin{align*} \sin^2 \frac{\theta}{2} \ &=\ \frac{1-\cos \theta}{2} \\ \cos^2 \frac{\theta}{2} \ &=\ \frac{1+\cos \theta}{2} \\ \sin \frac{\theta}{2}\cos \frac{\theta}{2} \ &=\ \frac{1}{2} \sin \theta \end{align*} \]
のようになるので、結局、全く回転しないのと360°回転するのとではちゃんと同じ結果になるのである。


ロドリゲスの回転公式

 このような公式が成り立つことが分かっているのなら、わざわざ毎回四元数の積を計算してやる必要はないのではないだろうか?つまり、先ほどの式を展開してやれば、点\( A \)から点\( B \)への変換行列が導き出せるのではないだろうか。

 やってみた。少しも間違えないように気を配りながら計算を進めるのは大変だった。なにしろ 4 × 3 × 4 項の積だから、48 個もの項が出てくることになるのだ。打ち消し合う項は 6 対あり、いずれも実数部分である。その結果、実数部分は 0 になる。6 つの項は他の項と同じだったのでまとめることができた。結局 18 項が消えたことになるが、残りはまだ 30 項もある。

 この作業は記号を残しながら展開するので大変なだけである。実際にコンピュータで具体的な数値を使って計算させるときにはそれほど計算量は増えない。四元数の積を 2 回やればいいだけだ。

 先ほどの三角関数の公式や、\( u_x^2 + u_y^2 + u_z^2 = 1 \)になることなどを利用してやると(←ここ大事!)、比較的すっきりした形にまとめることができる。具体例を挙げておけば、\( u_x^2 - u_y^2 - u_z^2 \)という項が出てきてこれを\( 2u_x^2 -1 \)という形でまとめて、三角関数の公式の分母の 2 と打ち消し合ったりしてすっきり消えるといった具合のことが起きる。その結果がこうだ。

\[ \begin{align*} \left(\begin{array}{c} x' \\[5pt] y' \\[5pt] z' \end{array} \right) \ =\ \left(\begin{array}{lll} u_x^2(1-\cos\theta) + \cos \theta & u_x u_y(1-\cos\theta) - u_z \sin\theta & u_x u_z(1-\cos\theta) + u_y \sin\theta \\[5pt] u_y u_x(1-\cos\theta) + u_z \sin\theta & u_y^2(1-\cos\theta) + \cos \theta & u_y u_z(1-\cos\theta) - u_x \sin\theta \\[5pt] u_z u_x(1-\cos\theta) - u_y \sin\theta & u_z u_y(1-\cos\theta) + u_x \sin\theta & u_z^2(1-\cos\theta) + \cos \theta \\ \end{array} \right) \left(\begin{array}{c} x \\[5pt] y \\[5pt] z \end{array} \right) \end{align*} \]
 この変換式は「ロドリゲスの回転公式」と呼ばれており、実は四元数の発見よりもずっと以前に発見されていたようである。このような公式があるのならわざわざ四元数を使う必要も無さそうだ。一度この行列を作ってしまえば、色々な点を次々と変換してやることができる。四元数の計算をするより計算の回数が少なくて済むだろう。

 いや、四元数(クォータニオン)は、単に個々の点の座標変換を計算するのが便利だから利用するというのではないのである。それでも上のような変換行列を利用するのも魅力的だ。どちらの方式を採用したら良いのだろうか。

 迷う必要はない。もし上のような変換行列を作りたければ、四元数の公式を使って作ってやることもできるからだ。点\( A \)の座標\( (x,y,z) \)として\( (1,0,0) \)\( (0,1,0) \)\( (0,0,1) \)を使って四元数の積を計算してやればロドリゲスの回転公式の行列の 9 つの成分の値が全て導けることになる。

 それを利用してやればさっきの検証はもっと楽にできたかも知れないなぁ。 一度結果を見てしまった後では、効率的な計算法を思い付くものである。 納得はできなかっただろうけど。
 3Dゲームの製作に応用する場合、画面内に出てくる大量のキャラクターやオブジェクトの位置を表す点の座標変換の部分だけはこの行列を作ってから一気にやるという効率化も一つの手だろうと思う。もっとも、近頃は優秀なライブラリが利用できるので、プログラマはそのような内部動作まで考える必要はないのであるが。おそらく内部的にはそのような手法を取っているのではないだろうか。


回転の合成

 座標の回転変換は行列でも表せることを知ってしまった。では一体、四元数のどんな性質が買われてあちこちで利用される事になっているというのだろうか?そのような具体例は次回に回したいと思う。今回は四元数の数学的な性質に注目する形でまとめておきたい。

 しかしちょっとしたヒントだけは今書いておこう。先ほど四元数\( X \)を使って座標\( A \)から座標\( B \)を求めたわけだが、別の四元数\( Y \)を使って座標\( B \)をさらに別の点\( C \)へ飛ばすとしたら、どんな計算をしたら良いだろう?

\[ \begin{align*} C \ &=\ Y \, B \, \bar{Y} \\ &=\ Y(XA\bar{X})\bar{Y} \\ &=\ (YX) \, A \, (\bar{X}\,\bar{Y}) \\ &=\ (YX) \, A \, (\overline{YX}) \\ &=\ Z \, A \, \bar{Z} \end{align*} \]
 これはつまり、点\( A \)を直接、点\( C \)へと飛ばす四元数\( Z \)\( Z = YX \)という計算で得られることを意味している。

 この性質の具体的な利用法は次回の記事で話そう。


今の状態からどう回転すれば

 さらにもう一つ、重要な性質がある。すでに上で話したことを使えば簡単に分かる話だ。例えば
\[ \begin{align*} Z \ =\ YX \end{align*} \]
という関係があるとする。\( Z \)\( X \)を知っている時、この関係を満たす\( Y \)を求めるためにはどうしたらいいだろうか?両辺に右から\( X\sup{-1} \)を掛けてやればいい。右辺の\( X \)と打ち消し合って次のようになるだろう。
\[ \begin{align*} ZX\sup{-1} \ =\ Y \end{align*} \]
 つまり、
\[ \begin{align*} Y \ =\ \frac{Z \, \bar{X}}{|X|^2} \end{align*} \]
という簡単な計算を実行するだけで求まることになる。いや、もっと簡単である。\( X \)の定義をじっくり見てもらうと分かるが、いつでも\( |X| = 1 \)なのである。\( u_x^2 + u_y^2 + u_z^2 = 1 \)であることと\( \sin^2 \frac{\theta}{2} + \cos^2 \frac{\theta}{2} = 1 \)が常に成り立つことからそれが分かる。だから実は次のような計算でいい。
\[ \begin{align*} Y \ =\ Z \, \bar{X} \end{align*} \]
 今の状態から、さらにどのような回転を追加すれば望みの回転結果が得られるか、という問題の答えを瞬時に得たことになる。これも次回、具体例を使って利用法をお話ししよう。


データの補正が楽

 本当は次回のネタに取っておこうと思ったのだが、ここまで話したのならついでにもう一つ話しておこう。

 たった今の話に出て来たように、回転を表す四元数の絶対値はいつでも 1 である。ところがコンピュータで回転に次ぐ回転を続けて計算していると、計算の誤差がどんどん蓄積してくる。回転のデータが徐々に壊れてきてしまうのだ。具体的には、絶対値が 1 ではなくなってきてしまうということが起こる。

 だからひどく壊れてしまう前にたびたび絶対値をチェックして、それが 1 でなくなっていれば、全体を割ってやればいいのだ。そうするだけで健全なデータに戻る。計算のパワーに余裕があれば積を計算する度にチェックしてやるくらいでもいい。この作業を「四元数の正規化」と呼ぶ。

 これで重要なことは全部話してしまったような気がする。実際の 3D 計算のプログラムに慣れている人ならば次回の記事を読む必要はもう無いだろう。


実部には何を入れてもいい

 最後にちょっと気になっていたことを試しておこう。

 座標データを入れた四元数\( A \)の実部は 0 にしておくと書いたが、もしそこに 0 でない実数\( a \)を入れた場合には計算結果の四元数\( B \)にどんな影響が出るのだろうか。次のように考えてやると簡単に確かめられる。

\[ \begin{align*} B \ &=\ X(a + A)\bar{X} \\ &=\ Xa\bar{X} \ +\ XA\bar{X} \end{align*} \]
 ここまで考えていた結果の\( XA\bar{X} \)\( Xa\bar{X} \)を追加するだけでいいということだ。その部分は次のように変形できる。
\[ \begin{align*} Xa\bar{X} \ &=\ a\, X\bar{X} \\ &=\ a |X|^2 \\ &=\ a \end{align*} \]
 ただの実数である。つまり実数\( a \)がそのまま残るだけだということが分かる。他の部分には一切影響がない。しかし応用に使うためにはやはり 0 にしておいた方が計算の手間を減らせていいだろう。