四元数の勉強

はじめに

四元数(クォータニオン)は3D空間における回転等を表す方式として、航空宇宙業界やCG/ゲーム業界などで広く活用されています。

今回は、この四元数について勉強したことを備忘録としてまとめます。

 

 

基本的な演算や特徴など

以下、四元数について定義されている演算やその特徴をいくつか列挙します。

表記については参考文献[1]をベースとします。

 

・表記方法

 [w, (x, y, z)]や [w, \boldsymbol{v}]などとあらわす。

また、3つの虚数i, j, kを使い  w + xi + yj + zkと書ける。

 

・大きさ

 ||q|| = \sqrt{w^{2} + x^{2} + y^{2} + z^{2}}

※3D回転を扱う際は、大きさが1の四元数(単位四元数)を考える。

 

・共役と逆数

四元数の共役は、虚数部分の符号を反転することで得られる。

 q = [w, \boldsymbol{v}]に対し、 q* = [w, -\boldsymbol{v}]

逆数は共役を大きさで割ることで定義される。

 q^{-1} = \dfrac{q*}{||q||}

単位四元数の場合は、大きさ=1なので共役と逆数は同値。

 

・乗算

四元数同士の乗算は以下の形となる。

 [w1, \boldsymbol{v1}] [w2, \boldsymbol{v2}] = [w1w2 - \boldsymbol{v1}・\boldsymbol{v2},   w1\boldsymbol{v2} + w2\boldsymbol{v1} + \boldsymbol{v1} \times \boldsymbol{v2}]

※乗算について結合法則は成り立つが、交換法則は成り立たない。

 

四元数による回転

標準的な3Dの点(x, y, z)に対し、四元数p = [0, (x, y, z)]を定義する。これをある軸 \boldsymbol{n}の周りで \thetaだけ回転させる場合、四元数q = [cos  \theta/2,   \boldsymbol{n} sin \theta/2]を用いて以下の乗算によりpを回転させることができる。

 p' = qpq^{-1}

 

四元数の長所と短所 (角変位の表現形式として)

角変位を表す主要な形式として、「行列・オイラー角・四元数」の3つがあります。

ここでは、四元数の主な長所と短所について、他の二つと比較しつつ記載します。

 

長所

  • 滑らかな補間が可能

    slerpやsquadといった演算により、四元数間の滑らかな補間が可能。

    ※行列やオイラー角の場合、滑らかな補間は不可。

  • 角変位の連結が容易

    四元数の乗算の結合法則により、一連の角変位を連結できる。

    ※行列形式も連結可能だが比較的低速。オイラー角の場合は連結は容易でない。

  • メモリ消費が比較的少ない

    四元数は4つの数で表せるので、9つの数を使う行列よりは経済的。

    オイラー角は3つなので、この点はオイラー角の方が良い。

短所

  • 人間による解釈が難しい
    直感的な解釈のしやすさという点で、四元数オイラー角に大きく劣る。
  • 無効になる場合がありえる

    入力データのミスや浮動小数点の丸め誤差によりエラークリープが起こりえる。(正規化により対処可能)

    ※行列についても無効になる場合はありえる(正規直交性を満たさない場合)。オイラー角については、どんな3つの数値でも有効。

 

実際には、「行列・オイラー角・四元数」は相互に変換可能であるため、状況に応じてそれぞれの長所を組み合わせて使用されます。

(ユーザが直接指定する部分はオイラー角形式として、内部的には四元数形式で回転の補間を計算したり)

 

参考

[1] O'Reilly Japan - 実例で学ぶゲーム3D数学

[2] クォータニオン (Quaternion) を総整理! ~ 三次元物体の回転と姿勢を鮮やかに扱う