まとめと余談


ここまで10ページにわたってクォータニオンと3次元の回転の関係について解説してきましたが、ちょっと長くなりすぎました。要点をまとめればそんなにややこしい話ではないのですが、なるべく前提知識がなくてもいいようにとあれこれ説明をしたために、要点がぼけて混乱をまねいてしまったかもしれません。そこで、要点をまとめてざっとおさらいしたいと思います。

まず、3次元の回転行列 \(A\) は、微小回転について考えることで得られる生成子 \(X,\ Y,\ Z\) を使って次のような指数関数の形であらわせます。
$$ A = e^{X_A},\ X_A = a_x X + a_y Y + a_z Z $$

Baker-Campbell-Hausdorffの公式によれば、このような回転行列の積のふるまいは \(X,\ Y,\ Z\) の交換関係によって決まります。
$$ [X,\ Y] = Z,\ [Y,\ Z] = X,\ [Z,\ X] = Y $$

しかしながら、\(X,\ Y,\ Z\) 同士をかけたもの (\(X^2,\ Y^2,\ Z^2,\ XY,\ YZ\) など) は単位行列 \(I\) や \(X,\ Y,\ Z\) などの単純な組み合せ(線形結合)では表現できないので、指数関数の表現を簡単に計算することはできません。そこで、\(X,\ Y,\ Z\) と同じ交換関係を持ち、掛け合わせると再び自分達に戻る虚数みたいな3つの謎の数 \(i,\ j,\ k\) を導入します。
$$
i^2 = j^2 = k^2 = -1, \\
ij = -ji = k,\ jk = kj = i,\ ki = -ik = j
$$

こうすると、\(\frac{i}{2},\ \frac{j}{2},\ \frac{k}{2}\) が \(X,\ Y,\ Z\) と同じ交換関係を持つので、
$$ q_A = e^{i_A},\ i_A = a_x \frac{i}{2} + a_y \frac{j}{2} + a_z \frac{k}{2} $$
が積の計算において回転行列 \(A\) と同じふるまいをします。また、\(i,\ j,\ k\) を掛け合わせると再び \(i,\ j,\ k\) か \(-1\) に戻るように定義したので、この指数関数の表現は
$$ q_A = w + x i + y j + z k $$
の形で記述できるはずです。これがクォータニオンになります。

実際、回転軸を \(\vec{a} = (a_x,\ a_y,\ a_z)\), 回転角を \(\theta\) とした回転行列 \(R(\vec{a},\ \theta)\) は
$$ R(\vec{a},\ \theta) = e^{\theta\, (a_xX + a_y Y + a_z Z)},\ {a_x}^2 + {a_y}^2 + {a_z}^2 = 1 $$
と書けて、それに対応したクォータニオンを計算すると
\begin{eqnarray*}
q(\vec{a},\ \theta) & = & \left(\cos\frac{\theta}{2},\ \sin\frac{\theta}{2}\,\vec{a}\right)\\
& = & \cos\frac{\theta}{2} + \sin\frac{\theta}{2}\,(a_xi + a_y j + a_z k)
\end{eqnarray*}
となります。

クォータニオンは回転行列と同じ積のふるまいをするので、回転行列の代わりにクォータニオンを使って回転の合成を計算しても良いわけですが、クォータニオンでベクトルを回転するにはどうすれば良いでしょう?

回転行列 \(A\) を別の回転行列 \(R\) で座標変換すると次のように書けます。
$$ A’ = RAR^{-1} $$
この回転行列 \(A’\) が持つ回転軸は \(A\) が持つ回転軸を \(R\) で回転させたものになっているはずです。

クォータニオンのベクトル成分は回転軸に平行なベクトルとなっています。回転行列の積とクォータニオンの積は同じふるまいをするので、クォータニオン \(q\) を別の回転をあらわすクォータニオン \(r\) で
$$ q’ = r q \overline{r} $$
のように変換すれば、\(q\) のベクトル成分が回転されたクォータニオン \(q’\) を得ることができるというわけです。

いかがでしたでしょうか? これがクォータニオンが3次元の回転を表現できる理由になります。ひと言でまとめるなら、「\(X,\ Y,\ Z\) と \(i,\ j,\ k\) が同じ交換関係を持つため回転行列の積とクォータニオンの積は同じふるまいをする」と言えます。でも何かスッキリしないですよね。結局 \(i,\ j,\ k\) は何者なのでしょうか?

ここからは余談になりますが、\(i,\ j,\ k\) の正体についてもう少しせまってみたいと思います。

普通の数は2乗すれば必ず正の値になりますが、\(i,\ j,\ k\) は2乗すると \(-1\) になります。これは虚数と同じ性質ですが、もうひとつ同じ性質を持つものが4ページ目にありました。それは2次元の回転の生成子の行列 \(X\) でした。\(ij = -ji\) のようにかけ算の順番を入れ替えると値が変わる性質(非可換性)はどう考えたら良いでしょう? やはり行列であればそのような性質を持つことができます。非可換性のような性質を持つ数なんていうのは我々の想像を越えたものに見えますが、行列としてとらえればより実体のあるものとして考えることができます。

実は、\(i,\ j,\ k\) と同じ性質を持つ行列は、パウリのスピン行列 \(\sigma_x,\ \sigma_y,\ \sigma_z\) として知られています。
$$
\sigma_x = \left(\begin{array}{cc} 0 & 1 \\ 1 & 0 \end{array}\right),\
\sigma_y = \left(\begin{array}{cc} 0 & -i \\ i & 0 \end{array}\right),\
\sigma_z = \left(\begin{array}{cc} 1 & 0 \\ 0 & 1 \end{array}\right)
$$
このパウリ行列は次の性質を持ちます。
$$
{\sigma_x}^2 = {\sigma_y}^2 = {\sigma_z}^2 = I,\\
\sigma_x \sigma_y = {-\sigma_y} \sigma_x = i\sigma_z,\\
\sigma_y \sigma_z = {-\sigma_z} \sigma_y = i\sigma_x,\\
\sigma_z \sigma_x = {-\sigma_x} \sigma_z = i\sigma_y\,
$$
つまり、
$$
X_i \equiv -i\sigma_x = \left(\begin{array}{cc} 0 & -i \\ -i & 0 \end{array}\right),\
X_j \equiv -i\sigma_y = \left(\begin{array}{cc} 0 & -1 \\ 1 & 0 \end{array}\right),\
X_k \equiv -i\sigma_z = \left(\begin{array}{cc} -i & 0 \\ 0 & i \end{array}\right)
$$
が \(i,\ j,\ k\) と同じ演算規則を持つことになります。これらの行列は2次元の複素空間の回転の生成子になります。複素空間の回転といってもピンときませんが、回転による座標変換によって内積の値を変えず、かつ行列式が1のものを意味します。例えば、\(X_k\) は2つの複素平面の最初の1つに \(-i\) を2つめのに \(i\) をかけているので、それぞれの複素平面を互いに逆方向に回転する生成子です。\(X_j\) は普通の2次元の回転の生成子と同じですね。\(X_i\) はややこしいですが、2つの複素平面の実部と虚部がクロスするような回転の生成子になっています。

いかがでしょう? 少しはクォータニオンの実体をつかむことができたでしょうか? そんなことはないですよね。複素数の空間という時点でもう我々の想像を越えてしまっています。そこで、今度は実数の4次元空間を考えてみましょう。

クォータニオン \(q = w + xi + yj +zk\) は4つのパラメータ \((w,\ x,\ y,\ z)\) を持つので、これをそのまま4次元ベクトルとしてみます。\(q\) に \(i\) をかけると、
$$
iq = wi + xi^2 + yij + zik = -x + wi – zj + yk
$$
となるので、\(i\) を行列であらわすならば、
$$
i = \left(\begin{array}{cccc} 0 & -1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & -1 \\ 0 & 0 & 1 & 0\end{array}\right)
$$
と書けます。同様に \(j, k\) は、
$$
j = \left(\begin{array}{cccc} 0 & 0 & -1 & 0 \\ 0 & 0 & 0 & 1 \\ 1 & 0 & 0 & 0 \\ 0 & -1 & 0 & 0\end{array}\right),\
k = \left(\begin{array}{cccc} 0 & 0 & 0 & -1 \\ 0 & 0 & -1 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0\end{array}\right)
$$
と書けます。そして、これらは
$$
i^2 = j^2 = k^2 = -I, \\
ij = -ji = k,\ jk = kj = i,\ ki = -ik = j
$$
の関係をちゃんと満たしています。

行列 \(i,\ j,\ k\) がどのような意味を持つのか考えてみましょう。\(i\) の下半分は \(y\)-\(z\) 平面での回転の生成子になっていますね。上半分はどうでしょう? やはり \(w\)-\(x\) 平面での回転の生成子になっています。同じように、\(j\) は \(z\)-\(x\) 平面 と \(w\)-\(y\) 平面、\(k\) は \(x\)-\(y\) 平面と\(w\)-\(z\) 平面の回転の生成子になっています。つまり、3次元の回転の場合は回転軸方向の成分は変化しなかったのに対し、クォータニオンの場合は回転軸が \(w\) 軸との間で回転しているのです。そして、回転軸も変化させることで、クォータニオンにとって重要な、クォータニオンとクォータニオンの積がまたクォータニオンになる、という性質を得ることができたのです。

2次元の複素空間の回転にしても、4次元の実空間の回転にしても、クォータニオンは4つある軸の中から2つの軸のペアを2つ作り、それら2つのペアで作られる2つの平面上で同時に回転する演算をあらわしていたのです。4つの軸から2つの軸のペアを2つ作る組み合せの数は \(\frac{{}_4 C_2}{2!} = 3\) 通りで、3次元の回転の軸の数に一致します。これは \(x,\ y,\ z\) 軸の中から2つの軸を選んで回転面を作り、残りの回転軸を \(w\) 軸と組み合わせて回転面を作ると考えればつじつまがあいます。それに、このように考えれば、\(i,\ j,\ k\) が3次元の回転と同じ交換関係を持つのもうなずけますよね。もちろん、このような回転は3次元空間の回転とは別物なのですが、交換関係が一致するため、かけ算のふるまいは同じになるわけです。

もしも後輩に「先輩、クォータニオンって一体なんなんすかっ?」と聞かれたら、この4次元ベクトルのくだりを教えてあげれば「へぇー先輩すげえっすね」と言ってもらえるかも知れません。ただ、生成子を説明するのはちょっと面倒なので、代わりに \(\cos\frac{\theta}{2}\, I + \sin\frac{\theta}{2}\, i\) がどんな回転になるかを説明するといいでしょう。

ここでは、もうちょっと高度に任意軸まわりの回転をあらわすクォータニオン \(r = (\cos\frac{\theta}{2},\ \sin\frac{\theta}{2}\, \vec{a})\) が別のクォータニオン \(q = (w,\ \vec{v})\) をどう回転しているかを確認してみることにします。
\begin{eqnarray*}
rq & = & \left(\cos\frac{\theta}{2},\ \sin\frac{\theta}{2}\, \vec{a}\right) \left(w,\ \vec{v}\right) \\
& = & \left(\cos\frac{\theta}{2}\, w\ – \sin\frac{\theta}{2}\, (\vec{a} \cdot \vec{v}),\ \cos\frac{\theta}{2}\, \vec{v} + \sin\frac{\theta}{2}\, w\vec{a} + \sin\frac{\theta}{2}\, \vec{a} \times \vec{v}\right) \\
& = & \left(\cos\frac{\theta}{2}\, w\ – \sin\frac{\theta}{2}\, (\vec{a} \cdot \vec{v}),\ \left\{\cos\frac{\theta}{2}\, (\vec{a} \cdot \vec{v}) + \sin\frac{\theta}{2}\, w\right\}\vec{a} \right. \\
& & \ + \left. \cos\frac{\theta}{2}\,(\vec{v}\ – (\vec{a} \cdot \vec{v})\, \vec{a}) + \sin\frac{\theta}{2}\, \vec{a} \times \vec{v}\right)
\end{eqnarray*}
最後の式変形では \(\cos\frac{\theta}{2}\, (\vec{a} \cdot \vec{v})\, \vec{a}\) を1行目に加え、2行目で引いています。こうして見ると、1行目が \(w\) 軸と \(\vec{a}\) 軸の間での回転、2行目が \(\vec{v}\) の \(\vec{a}\) 軸まわりの回転になっていることがわかります。

ここに、\(\overline{r}\) を右からかけると \(\vec{a}\) 軸まわりの角度 \(\theta\) の回転になるのは、\(w\) 軸と \(\vec{a}\) 軸の間での回転が逆方向にかかりキャンセルされ、\(\vec{a}\) 軸まわりは同じ方向に \(\frac{\theta}{2}\) の回転が加えられて合計 \(\theta\) の回転になるからです。

以上でクォータニオンと3次元空間の回転の関係についての解説は終わりになります。次の最後のページではちょっと話題を変えて3Dゲームの開発でなぜクォータニオンを使うのかについて解説したいと思います。

6 thoughts on “クォータニオン徹底解説

  • 2018/11/04 at 6:20 AM
    Permalink

    Baker-Campbell-Hausdorffの公式と X, Y, Z の交換関係
    [X, Y]=Z, [Y, Z]=X, [Z, X]=Y

    を使えば、 e^XC=e^XA*e^XB としたときの XC は
    XC={a⃗ +b⃗ +12(a⃗ ×b⃗ )+112{a⃗ ×(a⃗ ×b⃗ )+b⃗ ×(b⃗ ×a⃗ )}+⋯}⋅X
    これのどこに交換関係を利用しておられるのですか?

    Reply
  • 2018/11/04 at 6:22 AM
    Permalink

    9ページの最初の方に書かれている内容です

    Reply
  • 2018/11/05 at 11:47 AM
    Permalink

    コメントありがとうございます。
    $$ [X_A, X_B] = (\vec{a} \times \vec{b}) \cdot \vec{X} $$
    とするのに使っています。

    Reply
  • 2018/11/06 at 4:26 AM
    Permalink

    こんな質問にまで答えてくださりありがとうございます

    Reply
  • 2018/11/07 at 4:50 AM
    Permalink

    10ページの内容なのですがR(a→ 、 θ)にベクトルv→ をかけるとa→ を軸にθだけ回転した式が与えられるのであればRに対応したクォータニオンqで
    v→*qで回転したv→が求められそうだと思ったのですが、これでは値は求められないのでしょうか?

    Reply
    • 2018/11/07 at 1:18 PM
      Permalink

      9ページまでの説明で、回転行列同士の積とクォータニオン同士の積は同じ振舞いをすることがわかったわけですが、ベクトルに対する作用が同じということまでは言えません。そもそも、ベクトルにクォータニオンを作用させる方法も定義されていません。
      そこで、10ページ目では、回転行列の座標変換(これは回転行列同士の積だけで表される)を使ってベクトル(回転軸)が変換されることを示し、それに対応したクォータニオン同士の積から、クォータニオンでベクトルを回転させる方法を導いています。

      Reply

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Anti Spam Code *