クォータニオンの除算 / magicien 

3Dのプログラムを書く人にとっては常識なのかもしれないけど、クォータニオンの除算ってどうやればいいんだっけと半日悩んだ結果を書いておく。

結論から言うと、除算は不要。回転角度の符号を反転したクォータニオンを乗算すればいいだけでした。考えてみれば当然なんだけど、思いつかなかったんだよ!

そもそもクォータニオンは何かと言うと、回転を表す4次元ベクトル。クォータニオンの便利なところは、クォータニオン同士を乗算することで、回転を合成できること。
右肩、右肘、右手首の回転がそれぞれわかっている時に、最終的に右手がどっちの方向を向くかは、右肩・右肘・右手首のクォータニオンを全部乗算すれば分かる。
数式で表すなら、右肩のクォータニオンをq1、右肘のクォータニオンをq2、右手首のクォータニオンをq3、最終的に右手が向く方向をqとすると、

\( q_1 \times q_2 \times q_3 = q \)

こんな感じになるわけです(q1、q2、q3はローカルの回転、qはワールド座標系(正確には右肩の親ノード)から見た回転であることに要注意)。
じゃあ、右肩・右肘の回転が決まっていて、最終的に右手をどちらに向かせたいか決まっているときに、右手首をどう回転すれば良いのか計算で求めるには、どうすれば良いのかな?と思ったわけです。(q1、q2、qが既知の時にq3を求める)

回転方向を逆にしたクォータニオンを使えば良いのだけれど、これを共役(きょうやく)クォータニオンと呼ぶらしい。w成分の符号を反転させるか、xyzを反転させるか、どっちでも良いと思うのだけど、xyzを反転するのが正式なのかなぁ。記号の書き方も人によってまちまちだけど、ここでは、クォータニオンqの共役クォータニオンをq*と書くことにする。

\( q = (x, y, z, w) \Leftrightarrow q^* = (-x, -y, -z, w) \)

で、qとq*をぶつけてやれば、回転が無かったことになるので、

\( q_2^* \times q_1^* \times q_1 \times q_2 \times q_3 = q_2^* \times q_1^* \times q \\ \Leftrightarrow q_3 = q_2^* \times q_1^* \times q \)

という感じで q3 が求められる。クォータニオンの積の計算は結構複雑なので、下手に方程式を解き始める前に気づいて良かった...

おまけ:SceneKitのクォータニオンの積はこんな感じ。

2017/12/31(Sun) 05:54:25