16

そこで、新しいプログラマー向けに Quaternion ベースの 3D カメラを作成したので、統合して使用を開始するのは非常に簡単です。

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

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

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

では、Stackoverflow のメンバーはこの問題について洞察を持っていますか? それは物事を行うための適切な方法ですか?

4

3 に答える 3

13

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

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

于 2008-11-25T23:26:57.403 に答える
4

累積は不正確なプロセスです。多くのインクリメンタル回転を累積すると、クォータニオンまたはマトリックスのどちらを使用する場合でも、丸め誤差が累積されます。

私は次のようなことを想像します: コードを起動して実行しましたが、ある程度のナビゲーションの後、カメラがいらいらするほど傾いていることに気付きました。事前に考えていなかった不変条件に違反しています。事実上、回転を累積したくないことに気付きました。代わりに、何か他のことをしたいのです。

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

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

于 2008-11-26T00:11:31.620 に答える
1

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

ただし、フレームごとに四元数を再計算するのはちょっともったいないと思います。フレームが入力を受け取った場合、最新のクォータニオンを保存し、それらをダーティとしてマークした方がよいでしょうか?

于 2008-11-25T23:19:21.617 に答える