デュアルクォータニオンの対数/指数/sclerp

  • Logarithm of Dual Quaternion, Exponential of Dual Quaternion and ScLERP

まえおき

 東日本大震災は、まさに未曾有の災害となり、今なお波及した大きな影響が続いています。問題の収束を願うところです。
 こちらでは震源から距離がありそれほどではなかったとはいえ、帰宅してみれば、棚のものやゲーム機が落ちたり、不安定な置き方だったタブレットPCが落下して液晶が割れたりといった影響があり、揺れや被害は実体験の中で最大のものでした。
 ニュースが気になり、計画停電のこともあって、ゲームをプレイする気分も萎縮している状況です。
 とはいえ、せめても、なるべく平常通りの生活に戻ることが必要です。ブログもそろそろ更新しておこうと思った次第です。個人的な活動が前回ブログ記事から何もなかったわけではなく、HTML5+WebGLJavaScriptプログラミングを進展させたり、二元数関連の理解や実装を進めたりしていました。

本題

 先日、sclerp(SCrew Linear intERPolation)関数についてあれこれやっていて、その後、デュアルクォータニオンの対数と指数のコードを実装しました。

デュアルクォータニオンの対数と指数のメモ

 デュアルクォータニオンの対数と指数の式の整理についてのメモです。実装に際して検討した結果を書き直したものです。

http://xelf.info/knowledge/DualQuaternion.pdf

内容について

 式の変形の途中経過は派手になっていますが、最終的に、同じ項を別の変数にまとめることで計算量、式全体の外観の長さはそこそこに収まります。実部は、クォータニオンの対数と指数として使えます。

sclerp関数

 sclerp関数とは、回転クォータニオン(単位クォータニオン)のslerp(Spherical Linear intERPolation)関数の実部単位デュアルクォータニオン版といえます。
※「実部の大きさが1」のことをここでは「実部単位」と呼ぶことにする。
 slerp関数は、滑らかに回転を(球面上において、等速度、最短距離で)補間するものです。同じように、回転と位置を表現する実部単位デュアルクォータニオンにおけるsclerp関数は、回転と位置を(ネジ(screw)を回転させるようにして、等速度、最短距離で)補間するものです。

 実部単位デュアルクォータニオンのsclerp関数は、次のように定義されます。
\hat{q_1} = \mathrm{sclerp} \left( \hat{a}, \hat{b}; t \right) = \hat{a} \left(\hat{a}^{-1} \hat{b}\right)^t = \hat{a} \left(\hat{a}^* \hat{b}\right)^t = \hat{a} \left(\cos t \frac{\hat \theta}{2} + \hat{n} \sin t \frac{\hat \theta}{2}\right)

 式の最後の辺は、\left(\hat{a}^* \hat{b}\right)^tの部分を、デュアル軸\hat{n}とデュアル角\hat{\theta}に分解すれば計算できることを意味しています。

デュアルクォータニオンのsclerp関数についての試行

 デュアルクォータニオンの対数と指数を実装できたので、sclerp関数のべき乗部分を対数と指数に置き換えても計算が合うものかどうか気になりました。
クォータニオンにおいて、適用の仕方次第では、近似式になってしまうという前提知識から来る疑問です。

 以下は、それについて軽く試行した結果から言えそうなことのメモです。それでは、べき乗部分を対数と指数に置き換えてみます。まずは比較のために、実数から始めます。

実数の場合

{q_1} = a \left( {a}^{-1} {b} \right) ^ t
{q_2} = {a} \exp\left(\ln\left({a}^{-1}{b}\right) t \right)
{q_3} = {a} \exp\left(\exp\left(\ln\left(\ln \left({a}^{-1}{b} \right)\right) + \ln\left( t \right) \right)\right)
{q_4} = {a} \exp\left(\left(\ln\left({b}\right) - \ln\left({a}\right)\right) t \right)
試しに数値を入れた結果を加味して、
q_1=q_2=q_3=q_4
{q_1}, {q_2}, {q_3}は等価です。{q_4}も一致します。

実部単位デュアルクォータニオンの場合

 実数と同じ式を実部単位デュアルクォータニオンに当てはめます。

\hat{q_1} = \mathrm{sclerp} \left( \hat{a}, \hat{b}; t \right) = \hat{a} \left(\hat{a}^* \hat{b}\right)^t = \hat{a} \left(\cos t \frac{\hat \theta}{2} + \hat{n} \sin t \frac{\hat \theta}{2}\right)
\hat{q_2} = \hat{a} \exp\left(\ln\left(\hat{a}^{-1}\hat{b}\right) t \right)
\hat{q_3} = \hat{a} \exp\left(\exp\left(\ln\left(\ln\left(\hat{a}^{-1}\hat{b}\right)\right) + \ln\left(t\right) \right)\right)
\hat{q_4} = \hat{a} \exp\left(\left(\ln\left(\hat{b}\right) - \ln\left(\hat{a}\right)\right) t \right)
試しに数値を入れた結果を加味して、
\hat{q_1}=\hat{q_2}=\hat{q_3}\neq\hat{q_4}
\hat{q_1}, \hat{q_2}, \hat{q_3}は等価となり、\hat{q_4}は一致しません。

 各変形式の数値演算の結果からは以上のような関係が確認でき、\hat{q_1}, \hat{q_2}, \hat{q_3}は、どれでも問題ないことがわかります。

 一方、\hat{q_4}には問題があります。(\hat{a}^{-1}\hat{b})^tに対応する部分の問題です。

\hat{a}^{-1}\hat{b}は、相対的な変換を表す

 tに代表的な値を入れてみるとイメージできそうです。

(sclerp関数に求める機能であり、sclerp関数の定義として)

  • \mathrm{sclerp} \left( \hat{a}, \hat{b}; 0 \right) = \hat{a}になるはずです。
  • \mathrm{sclerp} \left( \hat{a}, \hat{b}; 1 \right) = \hat{b}になるはずです。

↓(そこで、計算してみると)

  • (\hat{a}^{-1}\hat{b})^0 = 1 : 乗法の単位元になりました。\mathrm{sclerp} \left( \hat{a}, \hat{b}; 0 \right) = \hat{a} (\hat{a}^{-1}\hat{b})^0 = \hat{a}
  • (\hat{a}^{-1}\hat{b})^1 = \hat{a}^{-1}\hat{b} : べき乗が外れた形となります。この場合の\hat{q_1}を、先に\hat{a} \hat{a}^{-1} = 1となることを使って整理すれば、\mathrm{sclerp} \left( \hat{a}, \hat{b}; 1 \right) = \left(\hat{a} \hat{a}^{-1}\right) \hat{b} = \hat{b}となることが見て取れます。

 このようなことから、\hat{a}^{-1}\hat{b}の部分は、\hat{a}から\hat{b}への相対的な変換(回転と位置)ととらえることができます。

 \hat{q_4}は、その「相対的」な変換の形を無視して、直接計算しようとした結果です。

 実部単位デュアルクォータニオンにおいて、相対的な変換の形(t=0のとき乗法の単位元となる形)を崩すと、値は一致しなくなり、相対的な変換の形を崩さなければ、対数や指数が含まれた計算でも問題ないといえそうです。