1

私はGoogleを通じて何度もここに来ましたが、SOに関する最初の質問です。クォータニオンを使用して回転を表すことや、同様の問題を抱えている人を見つけることについて、かなり多くのことを読みました。私はまだ良い解決策、または理解できる解決策を見つけていません..そのため、確かな答えを生成するのに十分明確な質問をすることに挑戦しています。

現在、カメラの向きを表すためにクォータニオン (具体的には 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 乗算に対する回転を累積し続けます。これにより、リー群問題として知られるロールが生成されます (私が思うに) ピッチとヨーを連続的に適用すると、純粋なロールを生成できます。私が言うことができる)。

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

4

1 に答える 1

0

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

  1. 標準的な方向から始めます (+x は右、+y は上、-z は前)。
  2. ピッチを 90° 下げます。(-z はアップ、-y はフォワード)
  3. 右に 90° ヨーイングします。(+y は右、+x は前方)
  4. ピッチアップ 90°。(-x はアップ、-z はフォワード)
  5. あなたは再び標準的な前方を向いていますが、左に 90° 回転しています。

代わりに何をしたいですか?これは、ピッチとヨーを常にカメラ/ボディの参照フレームに対して定義する場合の正常な動作です。代わりに、'yaw' を常にワールドの y 軸を中心に回転させ、'pitch' を常にカメラ/ボディの x 軸を中心に回転させたい場合 (カメラの x 軸が常に地面に対して平行になるように)、次に、90°ピッチを下げると、ヨーの動きは視覚的にロールのように見えます (下を向いて円を描くように回転します)。そのプロパティを維持するクォータニオンは、常にゼロの「z」コンポーネントを持ちます。四元数にその制約を適用するだけです(必ず再正規化してください)。

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

于 2012-04-12T03:48:50.527 に答える