We will entertain your mind, enhance your brain, expand your lifestyle.

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

四元数とは

正確に理解しているわけではないので詳しく知りたい方は Wikipediaなどを。

数学的に言うと難解だが、ゲーム開発で利用する場合簡単に言うと、三次元空間での回転処理に使うものである。通常の三次元座標軸(x,y,z)での回転角(オイラー角)利用した回転と違い下記の特徴がある。

  • 三次元空間中での回転を簡単に記述でき、マトリックスの(行列)計算よりも計算量が少ない
  • オイラー角と違いジンバルロックが発生しない

なぜ記事にしているか?

Unityでは三次元グラフィックスを扱うので、当然のように内部の回転処理には四元数が使われている。内部と書いたのは、Unityのエディタ上ではオブジェクトの回転はオイラー角で表現されている。人が扱うには四元数の数値直接は困難である。

スクリプト処理においても、単に一定角分回転させたい時など四元数のまま処理できる。しかし任意で回転しているオブジェクトが、特定の角度まで回転した、といった判定する場合四元数の数値を直接使うのは困難なため、オイラー角に変換する必要がある。

この変換において期待と違う結果が返ってくる。例えば、オブジェクトをX軸の周りを5度づつ回転させ、その内部角度(四元数)をオイラー角に変換すると次の様になる。

(x, y, z) =
  (80.0, 0.0, 0.0)
  (85.0, 0.0, 0.0)
  (90.0, 0.0, 0.0)
  (85.0, 180.0, 180.0)
  (80.0, 180.0, 180.0)
  (75.0, 180.0, 180.0)

90度を超えたところで、急に回転していないy軸やz軸にまで数値が出てくる。この事象は 90度〜270度の間で発生する。オブジェクトの回転結果は同じでも期待とは違い、(95.0, 0.0, 0.0)で判定しようとしても一致しない。この事象は値の組み合わせにより他の座標軸の回転でも発生する。

いくつかの資料を見ると、四元数とオイラー角との相互変換では、Z-Y-X軸の順に処理するような記述がある。一意には変換できないことは分かっても、実運用では使用できないので、外部にカウンターを設けそれで角度を判断する処理を追加した。

ブルーム橋

余談だが、天才のひらめきエピソードが興味深く、Wikipediaの記事の以下のエピソードもそんな一つ。

妻とともにロイヤル運河の引き船道に沿って歩いているときであった。四元数の背景となる概念が頭の中で形になり、答えが明らかになったとき、ハミルトンは衝動を抑えられずに、四元数の基本公式
i^2 = j^2 = k^2 = ijk = -1
を、渡っていたブルーム橋の石に刻みつけた。