はじめに
2つのベクトルを一致させる座標変換をクォータニオンを使って作る という記事を読んでまして、良い記事だなって思ったので自分用にまとめておきます。
アプリなら、入力者がマウスクリックで指定した三角形の法線方向をビュー座標系のz+にする場合などに使えるかなって思います。
導出
移動元のベクトルを 、移動先のベクトルを とします。
ただし、 とします。原点周りの回転を考えるのだから、当然の仮定だと思います。
を に一致させる任意軸回りの回転による変換を求めてみます。
まず、角度を求めます。
のなす角度を とすると、
次に、回転する軸のベクトル を求めます。
より、回転軸と回転角度が求まったので、あとはこれを単位四元数にするなり、回転行列にすれば、 を に一致させることができます。
このときの回転を表す単位四元数 であり、 を使って を表すと以下のようになります。
また、このときの回転行列 は以下のようになります。
を使って を表すと以下のようになります。のお好きな方法で、ベクトルを変換してください。
の場合どうなるか
の場合でも、 は同じものが求まります。
このとき、 とすると、 となります。