単位四元数と、それらを使用して回転を表現および構成する方法について学んでいます。ウィキペディアは、行列表現よりも数値的に安定していると述べていますが、参照を提供していません。回転行列ではなく単位四元数を使用して回転を処理する方が数値的に安定している理由を誰かが私に説明できますか (できればいくつかの数学的推論を使用して) (たとえば、OpenGL アプリケーションの場合)。ジンバルロックを回避しているからでしょうか?
5 に答える
そのウィキペディアの記事は偏っています。から
2014 年 4 月 18 日現在:
コンピューターで複数の回転を構成する場合、丸め誤差は必然的に蓄積されます。わずかにずれている四元数は、正規化された後でも回転を表します。わずかにずれている行列は、もはや直交していない可能性があり、適切な直交行列に戻すのが難しくなります。
これは偏っています。回転行列を再直交化することは難しいことではありません。例を参照してください。
クォータニオンも再正規化する必要があります。「わずかにオフのクォータニオンは、正規化された後の回転を表します」。ここでは、クォータニオンに大きな利点はありません。
ウィキペディアでそれを修正しようとします。この偏った意見は、ウィキペディアの他の場所にも現れています... :(
それはあなたの質問に答えます。
更新:言及するのを忘れていました: ジンバル ロックはここでは役割を果たしません。四元数も回転行列もこれに悩まされません。
いくつかの補足事項。クォータニオンは回転行列よりもコンパクトですが、クォータニオンを使用するとアプリケーション全体の数値計算が少なくなるということはまったく明確ではありません。以下を参照してください。
記録のために: 回転行列は、リソースに制約のあるマイクロコントローラーで方向を追跡するために使用され、大きな成功を収めています。方向余弦行列 IMU:ウィリアム プレメルラーニとポール ビザードによる理論を参照してください。私はまた、マイクロコントローラー (MSP430) で方向を追跡する直接の経験があり、方向を追跡するために回転行列が高速で安定していることに次ぐことができます。
私のポイントは、方向を追跡するために使用される場合、回転行列と四元数の間に大きな違いはないということです。
クォータニオンを使用して回転を表すライブラリが既にある場合は、クォータニオンを使用してください。ライブラリが既に回転行列を使用している場合は、回転行列を使用してください。1 つの表現であちこちの浮動小数点演算を節約できたとしても、アプリケーションやライブラリを変更して別の表現を使用しても意味がありません。リソースに制約のあるマイクロコントローラーでさえ、節約は重要ではありません。
私が見ているクォータニオンの唯一の真の利点は、補間にクォータニオンを使用できることです。回転行列もオイラー角もそれを行うことはできません。
これが数学的にあなたの好みに合うかどうかはわかりませんが、とにかく試してみます。回転行列の問題は、冗長な情報が含まれていることです。3 つの自由度のみで変換をエンコードする 9 つの値があります。
この冗長性のため、有効な回転行列を形成するために、行列内の 9 つの値に制約があります。行列は直交している必要があります。つまり、行ベクトルは正規直交である必要があります (各ベクトルの長さは 1 で、各ペアのスカラー積は 0 です)。
回転行列を更新すると、通常は増分回転行列と連結して、数値エラーが発生します。これらのエラーは、更新ごとに蓄積されます。あなたがそれについて何もしない限り、行ベクトルは正規直交からどんどん遠ざかっていきます。マトリックスが直交から十分に離れると、マトリックスが適用されているジオメトリが視覚的に変形し始める可能性があります (スキュー、スケーリングなど)。
行ベクトルを定期的に直交正規化することにより、回転行列を使用するときにこれらの問題を回避できます。これを行うには単純なベクトル操作が必要なだけなので、大したことではありません。
スプラインに続く「車」があるアプリケーションがあります。スプラインの導関数を計算して順方向ベクトルを定義し、次に左方向ベクトルと上方向ベクトルを計算して方向行列を作成します。次に、それを四元数に分解します。
これらのクォータニオンをアニメーションのキーフレームに変えると、Q_z が -1 から 1 にフロップするターンがいくつかあります。blender の python ライブラリを取得して、小さな変更に対して安定した分解を得る方法をまだ調査していません。