クォータニオン/回転について整理【Houdini VEX】

毎回忘れてしまうので整理

オイラー角やクォータニオンが数学的にはどんな感じのものなのかざっくり理解したうえで VEX 関数を正しく使えるようにするためのメモ

まず前提として回転と向きは本質的には同じものということに注意

オイラー角/クォータニオンはどういったものか

それぞれどういったものかについて、周辺知識と共にメモ

参考:

【Unity道場 博多スペシャル 2017】クォータニオン完全マスター
https://www.youtube.com/watch?v=uKWLPU8gfIY

1.2次元の回転

2次元の回転では以下の回転行列(マトリックス)を乗算する

角度θさえあれば回せる

2.オイラー角(Euler)

オイラー角は x, y, z 軸(三次元)に対する回転行列(マトリックス)はこれで、それぞれ乗算していく

3つの角度が必要

それぞれの軸に対して3回回すイメージ

オブジェクトの向きの表示にはオイラー角が使われることが多い

3.複素数

実部(a)と虚部(b)のある数

複素数平面

複素数平面とは実軸と虚軸を持つ平面

実数の座標は(a, b)とふたつの数のセットで2次元の情報を持つのに対し、複素数はひとつの数で2次元の情報を持てる

複素数の掛け算は回転

このような複素数平面の単位円上で

以下の公式は

と書き換えると i を90度回転したと解釈できる

(もちろん他の角度でも回転が成り立つ)

つまり、複素数は複素数平面上での回転は以下の式を乗算する

4.クォータニオン

クォータニオンは複素数の3次元版で、こういうの

こんな感じで虚部が3つある(実部と合わせて4つあるからクォータニオン)

ちなみにクォータニオンの回転はこれを乗算

4つの値が必要(回転角度と回転軸の座標)

まとめると、

  • クォータニオン(複素数の3次元版)による回転ではクォータニオンを乗算する
  • どの軸で何度回転したかという情報があればクォータニオンで回転できる

オイラー角ではx,y,z軸それぞれに対して計3回回転していたイメージだったのに対して、クォータニオンはひとつの軸で1回で回転できるイメージ

オイラー角の弱点

  • ジンバルロックが起きる

3軸あったはずが2軸の回転しかできない状態になってしまう現象

  • 計算時にメモリの消費が大きい

詳しくは以下:

なぜクォータニオンなのか

クォータニオンのベクトルによる回転

参考:

クォータニオンのかけ算

Houdiniなどでクォータニオンと呼んでいるデータの形式は、さっきのクォータニオンの回転式

の4つの係数を4次元ベクトルで表したこれ

そして、これを乗算しても回転を行える

つまり、上記のベクトルをpとして他のクォータニオンのベクトルpを回転させたベクトルは

また、3次元ベクトルvを回転させたベクトルは、qの逆行列をq¯として

といったように使える

(単純にqを乗算するだけではないことに注意)

Houdini の VEX 関数

(※これまでは複素数の拡張としてのクォータニオンと4次元ベクトルとしてのクォータニオンを区別して表記したが、これ以降クォータニオンは4次元ベクトルを指す)

クォータニオンが関係するVEX関数をまとめた

クォータニオンの生成

クォータニオンを生成

オイラー角からクォータニオンを生成

ベクトルAをベクトルBに回転するためのクォータニオン(または回転マトリックス)を生成

回転系

クォータニオンとクォータニオンの乗算(回転)

クォータニオンでベクトルを回転させる

クォータニオンとクォータニオンのブレンド(補間)

変換系

クォータニオンをオイラー角に変換

vector4のクォータニオンを他の形式(マトリックス、ベクトル)に変換

クォータニオンを反転

その他

クォータニオンとクォータニオンの間の角度