始めに
過去記事
当初の目標であるQuaternionを扱っていきます。恐らく今回でラストの予定です。
虚数・複素数
Quaternionでは複素数を扱うので簡単に解説します。
この虚数を利用して、複素数を表現します。2つの実数 a, b を使って次のように表現します。a を z の実数部、b を虚部と言います。
原点から複素数を結んだ線と実軸からなる角度を θ とすると次のように書き換えることが出来ます。 ( r は絶対値、大きさ、ノルムと言います。今回は大きさで話していきます)
複素数はとても便利なことに、絶対値が1の点を原点を軸に θ' だけ回転したいとすると次のように書くことが出来ます。
Quaternion
では、次に3次元での回転を扱っていきます。因みにですが、Quaternionは四元数と訳されます。
この3つの虚数を使用してQuaternionは次のように表現されます。
ここからQuaternionの計算について簡単にまとめていきます。
符号反転
大きさ
共役
逆数
乗算(外積)
とすると
また、次のように表現することも出来ます。
Quaternionの乗算は結合法則は成り立ちますが、交換法則は成り立ちません。
2つのQuaternionの積の大きさは次のようになります。 これは2次元の複素平面と同様です。
2つのQuaternionの積の逆数は順序を逆にした逆数の積と等しくなります。
内積
Quaternionの内積はベクトルと同様にスカラーとなります。
また、2つのQuaternionの大きさがそれぞれ1の場合、値域が-1から1になります。(たまに使える)
Quaternionを使用した回転表現
ここからQuaternionで回転を表現してきます。軸を 、回転させる量を とすると次のようになります。 また、軸の大きさは1とします。
3次元上の点P(x, y, z)をQuaternion に置き換えて、軸 に対して だけ回転させて得られる点 p' は次のようになります。
では、計算して回転を表現しているか確かめていきます。
ここからの計算は量が増えるので実部と虚部に分けて計算していきます。
の計算
ここで と は直交するため
よって、実部の値が 0 になります。
の計算
ここで、外積の順序を入れ替え -1 を掛けたものが元の外積と等しいことから次のように計算できる。
ここでベクトルの三重積を使用します。wikipedia等にも解説されているので知らない方は参考にして下さい。
ここで三角関数の二倍角の公式より は次のようにまとまります。
以上から求められたQuaternionは次のようになります。
ここまで整理出来ました。そして虚部の式は前回解説したロドリゲスの回転行列と一致します。
つまり、は回転を表しています。
このQuaternionの計算で求まった は座標 を軸 で 回転した座標となります。
Quaternionの利点・欠点
Quaternionはオイラー角に比べて以下の利点があります。
- ジンバルロックがない
- slerpで滑らかな補完が可能
- 連結と逆数の計算が高速
しかし、欠点として次のものがあります。
- 私たちにとって理解しずらい。
- オイラー角と比べると変数が一つ増える
最後に
やっとQuaternionについてまとめることが出来ました。Quaternionが回転を表していることをどうしても理解したかったのでいい機会となりました。
UnityでもQuaternionクラスが実装されており、とても便利なのでオイラー角で求めるのが難しい場合は使うべきものかもしれません。
ちなみに、昔にオイラー角での回転とQuaternionでの回転の計算速度を簡単に計測した結果、Quaternionのほうがわずかに高速だとわかりました。
EulerAngleとrotationの実行速度を調べてみた
— ひさし (@CCPJ_a) 2019年5月7日
・二つともx軸に30度回転
・1000万回実行
因みに、Rotate関数では約4.5秒 pic.twitter.com/Tzd6MxCeKr
また、ドローンの動きを作成する際にもQuaternionを使用してドローンが傾くように実装しました。
どろーん pic.twitter.com/hzjn3hiM8S
— ひさし (@CCPJ_a) 2019年7月9日
参考
3D数学の復習と実践の始めのブログで載せた参考書に加えて次の参考書を参考に式を導出しました。
- 作者:Fletcher Dunn,Ian Parberry
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/10/04
- メディア: 大型本