2012-03-31 14 views
1

UPベクトルとDirectionベクトルを持つカメラの回転軸と回転角を求めなければなりません(どちらも互いに垂直です)。私は回転されたカメラのUPと方向ベクトルの初期と最後の位置を持っています。私は、カメラの回転の軸と角度を探したい。私は自分のプロジェクトにC#を使用しています。私はこの3Dローテーションを初めて利用しています。あなたがそれらを愚かにするなら、私の質問を許してください。最初と最後に回転した四元数から回転軸を取得する

uはあなたが vector cross product(U X F のS =)を行うことにより、サイドベクターSを得ることができ方向(前方)ベクター fおよびベクトルアップから

答えて

0

。 3つのベクトルはすべて直交しています。また、それぞれを正規化することによってそれらを正規直交にする必要があります。まとめると、これらのベクトルは正規直交基底を形成する。

これで2つの基準があります。最初のカメラ方向からのものと最終的なカメラ方向からのものです。両方の基底を回転行列として表すことができます。例えば

  1. 前方ベクトル
  2. アップベクトル
  3. 側ベクトル

、マトリックス:

回転行列は、単純に3行がそれぞれ3×3行列であります
[[1 0 0] 
[0 1 0] 
[0 0 1]] 

は、起動時に、その順方向ベクトル、上方向ベクトル、および側方ベクトルのポイントgを正のx軸、y軸、z軸に向かって移動させる。

algorithmを使用して、これらの2つの基準(M1とM2)を2つの単位四元数(Q1とQ2)に変換できるようになりました。

ここでは、カメラの初期および最終的なカメラ方向を表す2つの単位四元数があります。

q2 = qT * q1 
q2 * q1^-1 = qT * (q1 * q1^-1) = qT 
=> qT = q2 * q1^-1 

単位クォータニオンの逆数がそのconjugateに等しいことを知っている:あなたは、今では、Q2にQ1を変換四元QTを見つけなければならない

q1^-1 = q1* iif ||q1|| = 1 
qT = q2 * q1^-1 = q2 * q1* 

左シングルステップがあります:extracting the axis and angle from quaternion q:

angle = 2 * acos(qw) 
x = qx/sqrt(1-qw*qw) 
y = qy/sqrt(1-qw*qw) 
z = qz/sqrt(1-qw*qw) 

角度は、もちろんラジアンで与えられます。 x、y、zを計算するときは、ゼロ除算に注意してください。このような状況は回転がない場合や非常に小さい場合に発生するため、εを非常に小さい角度(たとえば1/10度)に選択し、ベクトルを計算しない場合はangle>εの場合にテストする必要がありますその場合です。

+0

返信いただきありがとうございます。それは本当に私をたくさん助けました。行列を四元数に変換するアルゴリズムには小さな問題が1つあります。私のソフトウェアカメラは、1つよりも少ない行列のトレースを与えているいくつかのアップベクトルと方向ベクトルを生成します。回転行列のトレースが1より小さい場合、回転軸と角度の計算は奇妙な値を与えています。あなたはこの問題を解決する方法を知っていますか? – user1304687

+0

238行目の関数を参照してください:http://java.net/projects/vecmath/sources/svn/content/trunk/src/javax/vecmath/AxisAngle4f.java?rev = 144 あなたの問題を解決する場合は、この回答を適宜チェックしてください。 – gsimard

関連する問題