UPベクトルとDirectionベクトルを持つカメラの回転軸と回転角を求めなければなりません(どちらも互いに垂直です)。私は回転されたカメラのUPと方向ベクトルの初期と最後の位置を持っています。私は、カメラの回転の軸と角度を探したい。私は自分のプロジェクトにC#を使用しています。私はこの3Dローテーションを初めて利用しています。あなたがそれらを愚かにするなら、私の質問を許してください。最初と最後に回転した四元数から回転軸を取得する
uはあなたが vector cross product(U X F のS =)を行うことにより、サイドベクターSを得ることができ方向(前方)ベクター fおよびベクトルアップから
1
A
答えて
0
。 3つのベクトルはすべて直交しています。また、それぞれを正規化することによってそれらを正規直交にする必要があります。まとめると、これらのベクトルは正規直交基底を形成する。
これで2つの基準があります。最初のカメラ方向からのものと最終的なカメラ方向からのものです。両方の基底を回転行列として表すことができます。例えば
- 前方ベクトル
- アップベクトル
- 側ベクトル
、マトリックス:
回転行列は、単純に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>εの場合にテストする必要がありますその場合です。
関連する問題
- 1. 四元からOpenGLの回転に
- 2. 方向ベクトルを四元数回転に変換する
- 3. 最後の2次元で5D配列を回転する
- 4. オイラーZXZ回転から固定軸XYZ回転への変換
- 5. 回転行列から任意の回転軸を取り除く
- 6. 回転のための四元数演算?
- 7. キューブを時計回りにx軸回りに回転する
- 8. x軸でアニメーションを回転
- 9. 3次元テッセレーションのための四面体の回転
- 10. OpenGLのz軸回りの回転
- 11. 各軸の3D回転角度を取得する方法は?
- 12. 最短経路、最低回転アルゴリズム
- 13. 各サブプロットの回転軸テキスト
- 14. Jenkinsはテストランの最後に無限に回転します
- 15. d3のx軸テキストを回転する
- 16. 回転軸ベクトルを結合する
- 17. Androidの軸でビットマップを回転する
- 18. 2軸のOpenGLシーンを回転する
- 19. ggplot2の軸ラベルの回転と間隔
- 20. iOSサブビューの回転を取得する
- 21. 回転軸を見つける
- 22. x軸とy軸の周りのポリゴンを回転する
- 23. Quaternionからユーラー回転を取得しますか?
- 24. 回転後のビューステートを正しく復元する方法
- 25. 回転した要素をJavaScriptの回転方向に移動
- 26. CGAffineTransform角度の代わりに回数を回転する回転
- 27. LWJGL回転:回転しません
- 28. Python回転ファイルハンドラが回転しない
- 29. パーティクルシステムを回転させてワールド軸を回転させない方法
- 30. 回転したグラフと回転していないグラフを結合するR
返信いただきありがとうございます。それは本当に私をたくさん助けました。行列を四元数に変換するアルゴリズムには小さな問題が1つあります。私のソフトウェアカメラは、1つよりも少ない行列のトレースを与えているいくつかのアップベクトルと方向ベクトルを生成します。回転行列のトレースが1より小さい場合、回転軸と角度の計算は奇妙な値を与えています。あなたはこの問題を解決する方法を知っていますか? – user1304687
238行目の関数を参照してください:http://java.net/projects/vecmath/sources/svn/content/trunk/src/javax/vecmath/AxisAngle4f.java?rev = 144 あなたの問題を解決する場合は、この回答を適宜チェックしてください。 – gsimard