2012-04-10 7 views
1

私はGoogleで何度もここにいたが、最初の質問。回転を表現するために四元数を使うという話題と、同様の問題を抱えている人々を見つけるという話はかなり読んでいます。私はまだ良い解決策、または私が理解できるものを見つけることができませんでした。だから、私は確かな答えを得るために十分な疑問を尋ねてショットを出しています。6DOFでのクォータニオンカメラの表現 - 固有のローリングを避ける

私は現在、カメラの向きを表すために四元数(特にQt 4.7四元数/ C++)を使用しています。プログラムの各ステップで、私はマウスの動きをチェックし、fromAxisAndAngle(xaxis、x_mouse_movement)とfromAxisAndAngle(yaxis、y_mouse_movement)を実行します。私はこれらの2つの四元数をとり、それらを乗算します(yaxis * xaxis)。初期化のために私は乗算する単位四元数(w、x、y、z - > 1,0,0,0)を持っています。私はこれらのfromAxisAndAngle乗算の回転を現在の向きで累積し続けます。これは、嘘グループ問題(私は思う)として知られているロールを生成します。ピッチとヨーを連続して適用すると、純粋なロールを生成することができます。これが私の現在の実装にあります。私が言うことができる)。

私はpitch、yaw、rollがインクリメントされ、これらの値から毎回ゼロからAxisAndAngleから四元数が構築される別の方法を実装しました。これは正しいFPSスタイルのカメラを生成しますが、ジンバルロックに苦しんでいます。私の目標は、純粋なクオータニオンの表現を維持しながら、ピッチやヨーだけで得られるローリング効果を除去(または補償)しながら、一般的な6DOFカメラをFPSカメラや宇宙船スタイルのカメラとして使用できるようにすることです。私はこのロールを修正するための提案(特定のルーチン)、または私のニーズに合った代替表現を探しています。テキストの壁には申し訳ありませんが、私は非常に明確になりたかったのです。あなたの時間とハッピーハッキングありがとう!

+0

この「嘘グループ問題」の参考情報はありますか?私は関連する参考文献を探すのに苦労しました。私の理解は、四捨五入を回避するために四元数を使ってインクリメンタルアプローチを可能にしていたことです。この問題は私には新しくありました。 –

答えて

0

あなたが達成しようとしていることは完全にはっきりしていません。検討:

  1. は90°ピッチ
  2. (+ X前方である-Z、権利である、+ yがアップしている)正規の向きでダウン始めます。 (-zは上、-yは前進)
  3. 右90度。 (+ yは正、+ xは前方)
  4. ピッチアップ90°。 (-xは上、-zは前進)
  5. もう一度正規のフォワードに直面していますが、左に90度回転しています。

代わりに何をしたいですか?これはカメラ/ボディの参照フレームに対して常にピッチとヨーを定義する場合、通常の動作です。代わりに、カメラのx軸が常に地面と平行になるように、yawが常にy軸を中心に回転し、 'pitch'がカメラ/ボディのx軸を中心に回転するようにしたい場合は、あなたが90°のピッチで投げられた場合、ヨー運動は目に見えるようになります(あなたは見下ろしていて、円を描いています)。そのプロパティを維持する四元数は、常にゼロの 'z'成分を持ちます。クォータニオンに制約を適用するだけで(常に再正規化してください)

しかし、単にピッチとヨーを別々に記録する方法は、その場合にはうまくいくはずです。最初に2つの軸だけを使用している場合、ジンバ​​ルロックは問題になりません。あなたはピッチとヨーを確実に適用する必要があります。

関連する問題