四元数ベースの3Dカメラは、四元数またはオイラー角を蓄積する必要がありますか?

StackOverflow https://stackoverflow.com/questions/319189

質問

だから、新しいプログラマ向けのQuaternionベースの3Dカメラを書いたので、統合して使い始めるのは非常に簡単です。

それを開発している間、最初はユーザー入力をオイラー角として取得し、そのフレームの入力に基づいてクォータニオンを生成しました。次に、カメラのクォータニオンを取得し、入力用に生成したもので乗算します。理論的には、カメラの回転の現在の状態に入力回転を追加するだけで、すべてが太って幸せになります。クォータニオンのみを保存および追加するため、これを「クォータニオンの累積」と呼びましょう。

しかし、この方法には問題があることに気付きました。ヨーという1つのオイラー角だけを回転させていたとしても、何度も繰り返し使用すると、別のオイラー角に回転し始めます(ピッチなど)。それはわずかでしたが、かなり受け入れられませんでした。

それで、私はさらに調査を行ったところ、オイラー角を累積する方が良いという記事を見つけたので、カメラはその現在の回転をオイラー角として保存し、入力は各フレームに単純に追加されます。次に、各フレームからクォータニオンを生成し、それを使用して回転行列を生成します。これにより、回転軸が不適切な軸に流れ込む問題が修正されました。

だから、Stackoverflowのメンバーはこの問題に関する洞察を持っていますか?それは適切な方法ですか?

役に立ちましたか?

解決

四元数を乗算すると、浮動小数点の丸めの問題が累積します(45度のような単純な角度でも正確ではありません)。これは回転を合成するのに最適な方法ですが、各四元数コンポーネントの精度は時間とともに低下します。ブリードスルーは副作用の1つであり、視覚的には悪いことですが、クォータニオンにスケールファクターが組み込まれる可能性があります。それを回復するには、いずれにしてもオイラー角に再正規化する必要があります。固定小数点のオイラー角は丸めを累積しません。

フレームごとのクォータニオンの再計算は最小限です。私はそれを最適化しようとして気にしません。精度を取り戻すために再正規化する前に、おそらくいくつかのクォータニオンが蓄積することを許可できますが、実際には努力する価値はありません。

他のヒント

蓄積は不正確なプロセスです。多くのインクリメンタル回転を累積すると、クォータニオンまたはマトリックスを使用して丸め誤差を累積します。

次のようなものを想像します:コードを立ち上げて実行しましたが、一定量のナビゲーションの後、カメラがいらいらしているのに気づきました-前もって考えていなかった不変条件に違反しています。事実上、回転を蓄積したくない ことに気づきました。代わりに、他の何かをしたいです。

これは、数値精度の問題というよりも、インターフェース設計の問題として見ることができます。基本的に、人々はカメラがピッチ、ヨー、ロールに従ってナビゲートすることを期待しているため、角度を直接制御して表現することを選択すると、多くの問題を回避できます。

ここでの残念な点は、四元数が冗長になったように見えることです(少なくとも、この特定の用途では)。ただし、クォータニオンが必要な場合は、生のピッチ/ヨー/ロール角度で補間するのは面倒です。繰り返しますが、これはインターフェイス設計の質問です。クォータニオンが必要な場所と、クォータニオンを出し入れする方法を把握する必要があります。

私は両方の主張を見てきました。対処しなければならない本当の問題は、カメラシステムの柔軟性です。 IMOヨーは一般に、3人称視点ではより興味深いものです(キャラクターの垂直軸を中心に回転するため)。ほぼ間違いなく「ヨー」一人称視点での垂直方向についても、それが本当に同じものかどうかはわかりません。

ただし、クォータニオンをフレームごとに再計算するのは一種の無駄だと思います。おそらく、フレームが入力を受け取った場合、最新のクォータニオンを保存してダーティマークを付けた方が良いでしょうか。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top