LoginSignup
40
25

More than 5 years have passed since last update.

クォータニオンで回転を表現する定義にθ/2が使用される理由

Last updated at Posted at 2017-04-30

はじめに

クォータニオン(Quaternion)そのものがなかなか理解しがたい概念ではあるのだけど、概ね理解したと思っても今ひとつ腑に落ちない要因として、その回転の定義が

A=(n_{x} sin\frac{\theta}{2}, n_{y} sin\frac{\theta}{2}, n_{z} sin\frac{\theta}{2}, cos\frac{\theta}{2}) \\

のようにθ/2が使用されていることにあるのではなかろうか。なぜに2で割る?今回はその解説を試みる。
なお、別にそれを知らなくても、クォータニオンを回転に応用する際に特に問題にはならない(と思う)。本稿は、ある種の知的好奇心だ。

クォータニオンは回転に特化して使うと便利だった

まず抑えておきたいのは、クォータニオンは回転のために存在する概念ではないということだ。複素平面の3次元拡張として生まれたものであり、それがたまたま回転表現に便利だった、ということ。実際、回転のために使用されるクォータニオンは単位クォータニオンであり、直交変換に特化した特別なクォータニオンだ。
まずクォータニオンをおさらい。シンプルに表現すると、以下のようになる。

A=(a_{x}, a_{y}, a_{z}, a_{w})

要するに4つの実数の組をひとつのクォータニオンと呼びましょう、ということ。
ここで

a_{x}^2+a_{y}^2+a_{z}^2+a_{w}^2=1

に限定して考えたい。これが回転に限定して考えるということだ。つまり線形変換の他の種類、例えばスケーリングなど除外する。(なお厳密に言えば直交変換に限定しなければならない)
くどいようだけど、回転じゃないクォータニオンが普通なのであって、それを回転に使用するように特化しちゃおう、ということ。たいていの人にとって、普段計算機で使っているクォータニオンは回転に特化されているはずだ。(例えば効率のために計算アルゴリズムが簡略化されている)
ここで述べた、クォータニオンがたまたま回転として使えちゃう、という感覚は、以下の理解に役立つはずだ。

回転するからには3次元ベクトルを掛けたい

3次元ベクトル(空間上の任意の点)があって、それに適用して、結果的にそれが回転するからこそ、クォータニオンは便利に使える。行列と同じ。
しかしながら、4次元のクォータニオンと3次元のベクトルは、どうやって適用(掛け算)すれば良いのだろうか?

純粋クォータニオン(pure quaternion)で3次元ベクトルを表す

クォータニオンの定義を再確認すると、

A=(a_{x}, a_{y}, a_{z}, a_{w})

これは

A=a_{x}i+a_{y}j+a_{z}k+a_{w}

のように表現される。 i, j, k は虚数単位で、それぞれの係数は虚部である。虚部が3つあることで3次元となるわけだ。なので(ものは試しに)、3次元ベクトル

v=(v_{x}, v_{y}, v_{z})

V=(v_{x}, v_{y}, v_{z}, 0)

というクォータニオンと定義して、ベクトルの演算をクォータニオン同士の掛け算として扱うことができたら、話がうまい。ちなみにこのような実部がゼロのクォータニオンには「純粋クォータニオン(pure quaternion)」という名前がついている。

純粋クォータニオンにクォータニオンを掛けてみる

掛け算だから、

AV=(a_{x}i+a_{y}j+a_{z}k+a_{w})(v_{x}i+v_{y}j+v_{z}k) \\

これを計算してみよう。普通に分配法則でがんばる。項がたくさんあってウンザリである。ぼくのノートはぐっちゃぐちゃだ。Vのw項がゼロだから少しだけマシであるが。
なお掛け算するときは、クォータニオンの基本式

ij=k \quad jk=i \quad ki=j \quad ji=-k \quad kj=-i \quad ik=-j \quad ijk=-1

を使用する。結果はこうなる:

\begin{align}
AV=(a_{x}i+a_{y}j+a_{z}k+a_{w})(v_{x}i+v_{y}j+v_{z}k) \\
=(a_{w}v_{x}-a_{z}v_{y}+a_{y}v_{z})i \\
+(a_{z}v_{x}+a_{w}v_{y}-a_{x}v_{z})j \\
+(-a_{y}v_{x}+a_{x}v_{y}+a_{w}v_{z})k \\
+(-a_{x}v_{x}-a_{y}v_{y}-a_{z}v_{z}) \\
\end{align}

さて、これはうまくベクトルを回転できているのだろうか?

演算の結果がベクトルにならない

これは失敗である。なぜなら3次元ベクトルを純粋クォータニオンとして定義したなら、それを回転した結果も純粋クォータニオンになってくれないと、ベクトルに戻すことができない。上の式をみると、実部に値が残っていることがわかる。直感的にもこれはまずそうだし、上記の結果から実部を無視して、虚部だけ取り出して「これを結果のベクトルにしよう!」と思ってみても、調べてみればベクトルの長さ(格調高く言えばノルム)が保存されていないことがわかる。実部のぶんだけずれてしまうのだ。
つまり、掛け算自体は成立しているのだけど(当たり前)、これをベクトルの回転とは呼べないのだ。よって、当初の目論見である「純粋クォータニオンにクォータニオンを掛けるとベクトルを回転したことにならないだろうか」という期待は打ち砕かれたことになる。他の方法を考えなければならない。

技を繰り出す

世の中には頭のいい人がたくさんいるので、これしきの障害は乗り越えてしまう。すごいよなあ。もっとも、クォータニオンを発明したハミルトンも気づいてたらしいが。
A と V について、

AVA^*  \quad \cdots (1)

という演算をすれば、Vが純粋クォータニオンであれば結果も純粋クォータニオンになる!ことがわかった。すげえ。なお*は共役クォータニオンの意味で、虚部の符号を反転したものだ。

A^*=(-a_{x}, -a_{y}, -a_{z}, a_{w})

すなわち(1)は

AVA^*=(a_{x}i+a_{y}j+a_{z}k+a_{w})(v_{x}i+v_{y}j+v_{z}k)(-a_{x}i-a_{y}j-a_{z}k+a_{w})

こうなる。以降の計算は省略するけれど、これが実にうまく機能する。実部が消滅するので純粋クォータニオンとなり、よってベクトルを取り出せるし、それがちゃんと期待した任意軸回転になっているのだ。神かよ。時間があれば実部だけでも計算してみると、見事に消滅してこの感動を味わえるだろう。ノート1ページでは収まらないと思うが。

技の副作用

というわけで、見事にクォータニオンがベクトルを回転させる演算を定義できた。それが(1)だ。この演算を計算してみるとわかるのだけど、回転を表すクォータニオンを

A=(n_{x} sin\theta, n_{y} sin\theta, n_{z} sin\theta, cos\theta) \\

とすると、ちゃんと演算(1)は (nx, ny, nz) の軸でベクトルを回転している。素晴らしい!・・・のだけれど、あれあれ?2θ回転してしまうね?!そう、それがこの技の副作用。
この演算は表記としてもAを2回掛けているわけなので、感覚的にも、なるほどそりゃそうか、となる。

というわけで

最初の定義を再掲。

A=(n_{x} sin\frac{\theta}{2}, n_{y} sin\frac{\theta}{2}, n_{z} sin\frac{\theta}{2}, cos\frac{\theta}{2}) \\

とにかくベクトルの回転には(1)を使います、そして2倍回ってしまう特性を隠蔽したほうが何かと便利なので、最初から回転量を1/2にしておけば、ここで述べているような面倒な事情は誰も気にする必要がなくなるよね。
という、まあ、そんな話だなあ・・・

というのがぼくの理解です

導出の経緯や発見の筋書きは歴史とは異なるでしょうけどね。おしまい。

40
25
1

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
40
25