web-dev-qa-db-ja.com

四元数が回転に使用されるのはなぜですか?

私は物理学者であり、プログラミングを学んでおり、マトリックス/ベクター形式で物事を書くのではなく、回転に四元数を使用している多くの人々に出会いました。

物理学では、四元数を使用しない非常に良い理由があります(ハミルトン/ギブスなどについて時々話される奇妙な話にもかかわらず)。物理学では、記述に優れた分析動作が必要です(これには正確に定義された意味がありますが、通常のイントロクラスで教えられていることをはるかに超える技術的な方法であるため、詳細は説明しません)。四元数にはこのニースの動作がないため、役に立たず、ベクトル/行列にもあるため、それらを使用します。

ただし、分析構造を使用しない厳密な回転と記述に限定して、3D回転はどちらの方法(または他のいくつかの方法)でも同等に記述できます。

一般に、Xという制約に従う新しい点X '=(x'、y '、z')への点X =(x、y、z)のマッピングが必要です。2 = X '2。そして、これを行うことはたくさんあります。

素朴な方法は、三角形を定義して三角法を使用するか、点(x、y、z)とベクトル(x、y、z)と関数f(X) = X 'および行列MX = X'、またはクォータニオンを使用するか、他の方法(x、y、z)を使用して新しいベクトルに沿って古いベクトルのコンポーネントを投影するT。(a、b、c)(x '、y'、z ')など.

数学の観点から見ると、これらの説明はこの設定では(定理として)すべて同等です。それらはすべて同じ数の自由度、同じ数の制約などを持っています。

では、なぜ四元数がベクトルよりも優先されるように見えるのでしょうか?

私が見る通常の理由は、ジンバルロックや数値の問題ではありません。

これはオイラー角の問題にすぎないため、ジンバルロックなしの引数は奇妙に思えます。また、これは座標問題のみであり(極座標のr = 0での特異点(ヤコビアンがランクを失う)と同様)、これは局所的な問題のみであり、座標を切り替え、縮退から回転することで解決できることを意味し、または、2つの重複する座標系を使用します。

数値の問題についてはあまり確信がありません。なぜなら、これら(およびその他の代替)の両方がどのように実装されるのか詳細にはわからないからです。クォータニオンの再正規化は、回転行列に対して行うよりも簡単ですが、これは一般的な行列に対してのみ当てはまります。回転には、これを単純化する追加の制約があります(クォータニオンの定義に組み込まれています)(実際、同じ自由度数を持っているため、これは真でなければなりません)。

それでは、ベクトルまたは他の代替物の上に四元数を使用する理由は何ですか?

97
JMP

ジンバルロックが理由の1つですが、あなたが言うように、それはオイラー角の問題であり、簡単に解決できます。オイラー角は、3つの数字のみを保存する必要があるため、メモリが問題になる場合に使用されます。

クォータニオンと3x3回転行列の場合、クォータニオンにはサイズ(4スカラー対9)と速度の利点があります(クォータニオン乗算は3x3行列乗算よりもはるかに高速です)。

これらの回転表現のallが実際に使用されることに注意してください。オイラー角は最小のメモリを使用します。行列はより多くのメモリを使用しますが、ジンバルロックの影響を受けず、ニース分析特性を備えています。四元数は両方ともバランスが取れており、軽量でありながらジンバルロックはありません。

51
Peter Alexander

物理学では、四元数を使用しない非常に良い理由があります(ハミルトン/ギブスなどについて時々話される奇妙な話にもかかわらず)。物理学では、記述に優れた分析動作が必要です(これには正確に定義された意味がありますが、通常のイントロクラスで教えられていることをはるかに超える技術的な方法であるため、詳細は説明しません)。四元数にはこのニースの動作がないため、役に立たず、ベクトル/行列にもあるため、それらを使用します。

まあ、私も物理学者です。また、四元数が単純に揺れる状況もあります!たとえば、球面調和関数。電子を交換する2つの原子が散乱しています。軌道スピン移動とは何ですか?四元数の場合、それは単なる乗算です。つまり、四元数として表されるSH基底関数の指数を合計します。 (ルジャンドル多項式を四元数表記に変換するのは少し面倒です)。

しかし、私は同意します、それらは普遍的なツールではなく、特に剛体力学では、使用するのは非常に面倒です。しかし、物理学者がどれだけの数学を知る必要があるかという学生の質問にバートランドラッセルの答えを引用するために:"できるだけ多く!"

とにかく:コンピューターグラフィックスで四元数が好きなのはなぜですか?彼らは多くの魅力的な特性を持っているからです。最初にそれらをうまく補間できます。これは、ジョイントの周りの手足など、回転するものをアニメートする場合に重要です。クォータニオンでは、単なるスカラーの乗算と正規化です。これを行列で表現するには、sinとcosを評価してから、回転行列を作成する必要があります。それから、ベクトルと四元数の乗算は、完全なベクトル行列の乗算を経るので、まだ安価です。また、後で翻訳を追加すれば、さらに安くなります。多数の頂点の多くの変換/回転を評価する必要がある人間のキャラクターの骨格アニメーションシステムを検討する場合、これは大きな影響を及ぼします。

クォータニオンを使用することのもう1つの素晴らしい副作用は、変換が本質的に正規直交であることです。変換行列では、数値の丸め誤差により、アニメーションステップごとに再正規化する必要があります。

33
datenwolf

これはオイラー角の問題にすぎないため、ジンバルロックなしの引数は奇妙に思えます。また、これは座標問題のみであり(極座標のr = 0での特異点(ヤコビアンがランクを失う)と同様)、これは局所的な問題のみであり、座標を切り替え、縮退から回転することで解決できることを意味し、または、2つの重複する座標系を使用します。

多くの3Dアプリケーションは、オブジェクトの向きを定義するためにオイラー角を使用することを好みます。特にフライトシムの場合、それらは簡単に変更可能な方法で方向を格納する理論的に有用な方法を表します。

また、「座標の切り替え、縮退からの回転、または2つの重複する座標系の使用」などのすべての作業が必要であることにも注意する必要があります。努力とはコードです。そして、コードはパフォーマンスを意味します。 haveを持たない場合のパフォーマンスの低下は、多くの3Dアプリケーションにとって良いことではありません。結局、クォータニオンを使用するだけで必要なものがすべて得られる場合、これらのすべてのトリックによって得られるものです。

数値の問題についてはあまり確信がありません。なぜなら、これら(およびその他の代替)の両方がどのように実装されるのか詳細にはわからないからです。クォータニオンの再正規化は、回転行列に対して行うよりも簡単ですが、これは一般的な行列に対してのみ当てはまります。回転には、これを単純化する追加の制約があります(クォータニオンの定義に組み込まれています)(実際、同じ自由度数を持っているため、これは真でなければなりません)。

方向の複数の連続した回転を処理する場合、数値の問題が発生します。宇宙に物があると想像してください。そして、タイムスライスごとに、ヨーの小さな変化をそれに適用します。各変更後、方向を再正規化する必要があります。そうしないと、精度の問題が忍び寄って物事を台無しにします。

行列を使用する場合、行列の乗算を行うたびに、行列を再正規化する必要があります。正規化する行列はyet回転行列ではないため、その簡単な正規化についてはあまり確信が持てません。ただし、これについては確信できます。

4Dベクトル正規化ほど高速ではありません。これは、クォータニオンが連続回転後に正規化するために使用するものです。

四元数の正規化は安価です。特殊な回転行列の正規化でさえ、as安価ではありません。繰り返しますが、パフォーマンスが重要です。

マトリックスが簡単に実行できない別の問題もあります。2つの異なる方向間の補間です。

3Dキャラクターを扱う場合、キャラクターの各ボーンの位置を定義する一連の変換がよくあります。このボーンの階層は、特定のポーズのキャラクターを表します。

ほとんどのアニメーションシステムでは、特定の時間にキャラクターのポーズを計算するために、変換を補間します。これには、対応する変換を補間する必要があります。

2つの行列を補間するのは簡単です。少なくとも、最後に回転行列に似たものが必要な場合です。結局、補間の目的は、2つの変換の途中で何かを生成することです。

クォータニオンに必要なのは、4D lerpに続いてノーマライズすることだけです。それだけです:2つのクォータニオンを取得し、コンポーネントを線形補間します。結果を正規化します。

より良い品質の補間が必要な場合(場合によっては)、 spherical lerp を使用できます。これにより、より異なる方向の補間の動作が改善されます。この数学はmuchより難しく、四元数よりも行列に対してより多くの演算を必要とします。

24
Nicol Bolas

意見:四元数は素晴らしいです。

回転行列:軽微な不利益:行列の乗算は四元数の約2倍遅くなります。 マイナーアドバンテージ:行列ベクトルの乗算は最大で2倍速く、大きくなります。 Huge短所:正規化! Ghram-Shmitは非対称であり、微分方程式を行うときに高次の正確な答えを与えません。より洗練された方法は非常に複雑で高価です。

軸(角度=軸の長さ)軽微な利点:小さい。 中程度の欠点:トリガーを使用すると、乗算とベクトルへの適用が遅くなります。 中程度の欠点:すべての軸方向が何もしないため、長さ= 2 * piでの北極特異点。 2piに近づいたときに自動的に再スケーリングするための追加コード(およびデバッグ)。

6
Kevin Kostlan

一般的に、X ^ 2 = X '^ 2の制約に従って、ポイントX =(x、y、z)を新しいポイントX' =(x '、y'、z ')にマッピングするだけです。そして、これを行うことはたくさんあります。

私たちは絶対にjust望んでいません。 多くの人が見逃している という非常に重要な微妙さがあります。あなたが話している構造(三角形を描き、トリガーを使用するなど)は、一方のベクトルを他方に正しく回転させます。しかし、これを行う回転は無限にあります。特に、あなたがあなたの回転をした後にやって来て、それからX 'ベクトルの周りでシステム全体を回転させることができます。 X 'の位置はまったく変わりません。回転と私の組み合わせは、別の単一の回転と同等です(回転 グループを形成 であるため)。一般に、このような回転を表現できる必要があります。

あなたはcanがベクトルだけでこれを行うことができることがわかります。 (これが 回転の軸角度表現 です。)しかし、軸角度表現で回転を組み合わせるのは困難です。四元数は、他の多くのものと一緒に簡単にします。基本的に、クォータニオンには他の表現のすべての利点があり、欠点はありません。 (私は、他の表現がより良いかもしれない特定のアプリケーションがあるかもしれないと認めますが。)

5
Mike

私が見る通常の理由は、ジンブルロックや数値の問題ではありません。

そして、それらは正当な理由です。

既に理解しているように、四元数はオイラー3空間での3つの連続した回転とは対照的に、任意の軸の周りの単一の回転をエンコードします。これにより、クォータニオン ジンバルロックに対する免疫 になります。

また、 [〜#〜] slerp [〜#〜] のように、いくつかの形式の補間がニースで簡単になります。

...または、2つの重複する座標系を使用します。

パフォーマンスの観点から、なぜソリューションが優れているのですか?

続行できますが、クォータニオンは使用可能なツールの1つにすぎません。ニーズに合わない場合は、使用しないでください。

3
Sage Gerard

回転に関連するすべてのプロパティは、四元数のプロパティではないことに注意してください:それらはEuler-Rodrigues Parameterisationsのプロパティです。 3D回転を記述するために使用される実際の4要素構造。

四元数との関係は、純粋にケイリーの論文「四元数に関連する特定の結果について」によるものです。著者は、四元数の乗算とオイラーロドリゲスのパラメーター化の組み合わせの相関関係を観察しています。これにより、四元数理論の側面を回転の表現、特にそれらの間の補間に適用できるようになりました。

この記事は https://archive.org/details/collmathpapers01caylrich で読むことができます。しかし、当時、四元数と回転の間に関連性はなく、ケイリーは次のことがわかって驚いた:

実際、式は、M。Olinde Rodrigues Liouville、t。によるそのような変換のために正確に与えられたものです。 v。、「Des loisgéométriquesquirégissentlesdéplacementsd'unsystèmesolide [...]」(またはComb。Math。Journal、t。iii。p。224 [6])。ここでこれらの係数の出現について、演prior的に説明することは興味深い質問です。

ただし、Quaternionには、回転に利点をもたらす固有のものはありません。四元数はジンバルロックを回避しません。オイラー・ロドリゲスのパラメーター化は行います。回転を実行するコンピュータープログラムはほとんどなく、一級の複雑な数学値であるクォータニオンタイプを実際に実装する可能性があります。残念ながら、クォータニオンの役割の誤解がどこかで漏れてしまい、かなりの数のグラフィックス学生が複数の虚数定数を使用して複雑な数学の詳細を学習し、それが回転の問題を解決する理由について困惑しているようです。

3
Mark Green