クォータニオンによる回転を美しく理解する

またしてもクォータニオンの話。
え?しつこい?うるさいな、あなたは飽きたかもしれないが僕は飽きてないんだ、あなたとは違うんです


・・・さて、クォータニオンで空間の回転変換が計算できることは以前から知っていたことだし、ゴリゴリと式を展開すれば演算結果が回転変換に一致することも確認できていた。だけれど、なんていうのかな、シンプルにストンと腑に落ちる感じがなかったんだよね。先日書いた疑問(クォータニオンとオイラーの公式に関する疑問 - カタチづくり)もあって、いまいちスッキリしないというか、もどかしいような感覚がずっと残っていた。

つまり、こういうことだ。ゴリゴリ式展開して回転変換に一致することを確認する、なんていう理解は美しくない。僕はもっと美しくクォータニオンを理解したいんだ。

そして今回、ついに僕は美しい理解に到達したのである。今からここに書く回転変換の導出は、僕が今までにウェブで見つけたどの説明よりもシンプルでキレイだと思っている。まあ、それは僕の検索の仕方が悪いだけかもしれないし、それなりの書籍に当たればきちんと書いてあるのだろうけれど。

Z軸周りの回転

まずはZ軸周りの回転を導出していこう。次の2つのクォータニオンを考える。

 e^{k\theta} = \cos\theta + k\sin\theta
 q = w + ix + jy + kz

ここでは e^{k\theta} でZ軸周りの回転変換ができることを示していく。
そのためにまず、q を次のように書き換える。この書き換えがこそが回転変換を美しく導出するための最大のミソであり、すべてといってもいい。
 q = (w + kz) + (ix + jy) = (w + kz) + (x + ky)i

ここで、第一項と第二項をそれぞれ次のように指数関数表示に書き換える。

  • 第一項:  (w + kz) = \sqrt{w^2 + z^2}(\cos\phi + k\sin\phi) = ae^{k\phi}
  • 第二項:  (x + ky)i = \sqrt{x^2 + y^2}(\cos\psi + k\sin\psi)i = \(be^{k\psi}\)i = i\(be^{-k\psi}\)

合わせると次式となる。
 q = ae^{k\phi} + \(be^{k\psi}\)i

この q とe^{k\theta} の積を計算したい。まず、第一項との積は次のようになる。積の交換則が成立することに注意してほしい。
 e^{k\theta}\(ae^{k\phi}\) = ae^{k(\theta + \phi)} = \(ae^{k\phi}\)e^{k\theta}

つづいて、第二項との積は次のようになる。
左から掛けると →  e^{k\theta}\(be^{k\psi}\)i = \(be^{k(\psi + \theta)}\)i
右から掛けると →  \(be^{k\psi}\)ie^{k\theta} = i\(be^{-k\psi}\)e^{k\theta} = i\(be^{-k(\psi - \theta)}\) = \(be^{k(\psi - \theta)}\)i

つまり、 e^{k\theta}を左から掛けるとθの回転、右から掛けると-θの回転となる。
では、以上を踏まえて次の積を計算してみよう。
 e^{k\theta}qe^{-k\theta} \\= e^{k\theta}\(ae^{k\phi} + \(be^{k\psi}\)i\)e^{-k\theta} \\= ae^{k(\theta + \phi - \theta)} + \(be^{k(\theta + \psi + \theta)}\)i \\= ae^{k\phi} + \(be^{k(\psi + 2\theta)}\)i

以上より、 e^{k\theta} によってZ軸周りに角度2θの回転変換が計算できることが分かった。

クォータニオンの座標変換

以降ではクォータニオンによる任意軸周りの回転変換を導出したいのだが、ここではそのための準備として、クォータニオンの座標変換を考える。次の正規直交基底による座標変換を考えよう。
 U = \(\array{{\b u}_i & {\b u}_j & {\b u}_k}\)
 ||{\b u}_i|| = ||{\b u}_j|| = ||{\b u}_k|| = 1
 {\b u}_i \times {\b u}_j = {\b u}_k, \quad  {\b u}_j \times {\b u}_k = {\b u}_i, \quad  {\b u}_k \times {\b u}_i = {\b u}_j

この正規直交行列による座標変換は次式であらわされる。
 {\b v} = U{\b v'}

これをクォータニオンに適用すると次式となる。
 q = w + {\b i}^T{\b v} = w + {\b i}^TU{\b v'} = w + {\b i'}^T{\b v'}

ただし
 {\b i'}^T = \(\array{i' & j' & k'}\) = \(\array{{\b i}^T{\b u}_i & {\b i}^T{\b u}_j & {\b i}^T{\b u}_k}\)

ここで、 i', j', k'四元数虚数単位の特性を満たすことを示していきたい。
まず、次の式が成立する。
 \({\b i}^T{\b v}_1\)\({\b i}^T{\b v}_2\) = {\b v}_1^T\({\b ii}^T\){\b v}_2 = {\b v}_1^T\(K - I\){\b v}_2 = {\b i}^T\({\b v}_1 \times {\b v}_2\) - \({\b v}_1, {\b v}_2\)

したがって、次の関係が成り立つ。
 i'^2 = \({\b i}^T{\b u}_i\)\({\b i}^T{\b u}_i\) = {\b i}^T\({\b u}_i \times {\b u}_i\) - \({\b u}_i, {\b u}_i\) = -1
 i'j' = \({\b i}^T{\b u}_i\)\({\b i}^T{\b u}_j\) = {\b i}^T\({\b u}_i \times {\b u}_j\) - \({\b u}_i, {\b u}_j\) = {\b i}^T\({\b u}_k\) = k'
同様にして
 i'^2 = j'^2 = k'^2 = -1
 i'j' = -j'i' = k', \quad j'k' = -k'j' = i', \quad k'i' = -i'k' = j'
が成立するので、 i', j', k'四元数虚数単位の特性を満たすことになる。

任意軸周りの回転変換

いよいよ任意軸周りの回転変換を導出したいと思うが、実はもうほとんど答えは出てしまっている。手持ちの武器は次の2つだ。

  • Z軸周りの回転
  • 正規直交基底による座標変換

ある軸周りの回転変換をしたいなら、まずその軸をZ軸とするような座標変換をすれば良いのだ。その回転軸を  {\b u}_k とすると、これを用いて次のような正規直交行列を作ればよい。
 U = \(\array{{\b u}_i & {\b u}_j & {\b u}_k}\)

このとき、 {\b u}_k 周りの回転変換は次のクォータニオンで与えられる。
 e^{k'\theta} = \cos\theta + k'\sin\theta = \cos\theta + {\b i}^T{\b u}_k\sin\theta

また、任意のクォータニオン q は次のように書き換えられる。
 q = w + {\b i}^T{\b v} \\= w + {\b i}^TU{\b v'} \\= w + {\b i'}^T{\b v'} \\= (w + k'z') + (x' + k'y)i' \\= ae^{k'\phi} + \(be^{k'\psi}\)i'

したがって、下記のように角度2θの回転変換が計算できることが示される。
 e^{k'\theta}qe^{-k'\theta} =  ae^{k'\phi} + \(be^{k'(\psi + 2\theta)}\)i'

つまり、以上をまとめると、次のようになる。すなわち、回転軸  {\b n} 周りに角度θの回転変換は、
 r = \cos\frac{\theta}{2} + {\b i}^T{\b n}\sin\frac{\theta}{2}
を用いて
 rqr^*
と表すことが出来る。


どうだろうか。オイラーの公式をうまく用いて、クォータニオンで回転変換が計算できることをすっきりと美しく導出できたのではないかと思う。