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


107

私は物理学者で、プログラミングを学んでおり、行列/ベクトル形式で書く代わりに回転に四元数を使用する多くの人々に出会ってきました。

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

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

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

単純な方法は、これが定義する三角形を描画して三角法を使用するか、点(x、y、z)とベクトル(x、y、z)と関数f(X)= X 'の間の同型を使用することです。行列MX = X '、またはクォータニオンを使用するか、他の方法(x、y、z)T。(a、b、c)(x'、y '、 z ')など

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

では、なぜ四元数がベクトルよりも好まれるように見えるのですか?

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

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

私はこれらの両方(および代替手段)がどのように実装されるか詳細に知らないので、数値の問題についてはあまり確信がありません。四元数の再正規化は、回転行列の場合よりも簡単であると読みましたが、これは一般的な行列にのみ当てはまります。回転には、これを自明にする追加の制約があります(これは、四元数の定義に組み込まれています)(実際には、自由度が同じであるため、これは真でなければなりません)。

それでは、ベクトルまたは他の選択肢よりも四元数を使用する理由は何ですか?


2
とにかく「ジンバルロックなし」というのは嘘です。四元数で2つの直交回転を使用する場合、オイラー角と同じジンバルロックの問題があります。それはない、3 1つの動作であるので、あなただけの一回転のために問題を持っていない
デイモン

2
@デーモンこれは完全に真実ではありません。mathoverflow.net/a/95908/97344を
Plasmacel

回答:


61

ジンバルロックが1つの理由ですが、オイラー角の問題であり、簡単に解決できます。オイラー角は、3つの数値を格納するだけでよいため、メモリが問題になる場合でも使用されます。

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

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


しかし、回転行列にはそれほど多くの独立したコンポーネントはありません-制約されています。2次元の回転は、表現に関係なく、3次元の3つの座標によって指定されます。行列は、回転以外のこともできるため、一般により多くのコンポーネントを持っています。ただし、回転の場合、追加のコンポーネントは他のコンポーネントによって決定されます。
JMP 2012年

1
@JMP:その通りです。多くの人がマトリックスを「圧縮」して、必要な量の情報のみを保存しますが、圧縮されたマトリックスは処理が難しいため、パフォーマンスが低下します。それはすべて、メモリとパフォーマンスのトレードオフについてです。
Peter Alexander

10
ただし、@ JMP標準の行列乗算ルーチンでは、9つの値すべてが必要です。独立しているのは3つだけですが、実際に計算を行うときは、9桁分のメモリが必要です(ここでも、実際にコンピューターで行列の乗算を行っている場合)。
David Z

1
「四元数の乗算は3x3行列の乗算よりもはるかに高速です」本当に?四元数ローテーションには24回の加算/乗算演算が必要です(クロス積と補足演算の2倍のため)、3x3マトリックスには15回の加算/乗算演算しか必要ありません。
Marat Buharov、

2つのベクトル(6つのフロート)を使用して、3Dの向きを完全に表すことができます。3番目のベクトルは、十字形です。マトリックスの利点は、多くのアプリケーションですぐに使用できる形式になっていることです。EulerとQuatsはどちらも、(行列からの)パッキングと(行列への)アンパッキングを必要とし、余分な処理を消費します。オイラーとクアットは、コンパクトな長期保管に役立ちます。
user3015682

39

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

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

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

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

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


1
球面調和関数/四元数のルジャンドル多項式のリファレンスはありますか?関連するトピックを扱った論文を提出しようとしています。これに関する他の研究を(引用できるように)見たいと思います。
マイク

4
@マイク:残念ながら何も発表されていません。残念ながら、四元数は物理学者にはまだかなりあいまいです。Quantum Mechanic 2のチューターがこれをエクササイズにしたので、私はそれに圧倒されました。私たちが本質的に行ったことは、exp((a・iω+ b・jθ+ c・kη+ d)r)という用語を使用することでした。ここで、r自体は複素変数です。これをプロットすると、3次元分布が得られます(最初に、四元数変数に関して指数系列を作成する必要がありました)。これにより、「フーリエ」変換が可能になり、既知のSH用語に変換できる結果が得られます。
datenwolf 2013

31

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

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

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

私はこれらの両方(および代替手段)がどのように実装されるか詳細に知らないので、数値の問題についてはあまり確信がありません。四元数の再正規化は、回転行列の場合よりも簡単であると読みましたが、これは一般的な行列にのみ当てはまります。回転には、これを自明にする追加の制約があります(これは、四元数の定義に組み込まれています)(実際には、自由度が同じであるため、これは真でなければなりません)。

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

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

4Dベクトルの正規化ほど速くはありません。これが、連続ローテーション後に正規化に使用する四元数です。

四元数の正規化は安価です。でも、特殊な回転行列の正規化はされませんように安いです。ここでも、パフォーマンスが重要です。

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

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

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

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

四元数の場合、必要なのは4Dラープとそれに続く正規化だけです。以上です。2つの四元数を取り、コンポーネントを線形補間します。結果を正規化します。

より良い品質の補間が必要な場合(および場合によっては)、球面lerpを引き出すことができます。これにより、補間がより異なる方向でより適切に動作します。この数学は四元数よりもはるかに困難であり、行列に対してより多くの演算を必要とします。


7

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

回転行列: マイナーなデメリット:行列の乗算は、クォータニオンの約2倍遅くなります。 マイナーアドバンテージ:行列とベクトルの乗算は、約2倍速く、大きいです。 大きな 欠点:正規化!Ghram-Shmitは非対称であり、微分方程式を実行するときに高次の正確な答えを与えません。より洗練された方法は非常に複雑で高価です。

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


5

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

私たちは絶対にしないでくださいだけのことをしたいです。多くの人が見逃してしまう非常に重要な微妙な点があります。あなたが話しているコンストラクション(三角形を描き、トリガーを使用するなど)は、1つのベクトルを別のベクトルに正しく回転させます。しかし、これを行うローテーションは無限にあります。特に、回転を行った後、システム全体をX 'ベクトルを中心に回転させることができます。X 'の位置はまったく変わりません。ローテーションと私の組み合わせは、1つのローテーションと同じです(ローテーションがグループを形成するため)。一般に、そのような回転を表現できる必要があります。

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


4

私が目にする通常の理由は、ジンバルロックまたは数値的な問題ではありません。

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

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

また、SLERPのように、いくつかの形式の補間は見やすく、簡単に実行できます。

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

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

私は続けることができますが、四元数は使用できる1つのツールにすぎません。ニーズに合わない場合は、使用しないでください。


しかし、回転行列も同様に機能し、きちんと使用できる代数的特性も備えています。その上で、マトリックス操作は、コンピューターが特に得意なことの1つです。
paul23 2018

3

回転に関連するすべてのプロパティは、実際にはQuaternionsのプロパティではないことに注意してください。これらは、3D回転を説明するために使用される実際の4要素構造であるオイラーロドリゲスパラメーター化のプロパティです。

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

この論文は、https//archive.org/details/collmathpapers01caylrichで読むことができます。しかし、当時、クォータニオンとローテーションとの間には関係がありませんでした。ケイリーは、以下の点に気づいてかなり驚いていました。

実際、式はM. Olinde Rodrigues Liouvilleがテレビでそのような変換のために与えた式、「Des loisgéométriquesquirégissentlesdéplacementsd'unsystèmesolide [...]」(またはComb。Math。Journal、t。 iii。p。224 [6])。ここでこれらの係数の出現をアプリオリに説明することは興味深い質問になります。

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


1

誰かが読むかもしれない答え:すべての表現には退屈な問題があります。四元数は行列よりも小さいですが、四元数の乗算は単なるベクトル内積などではなく、実際には、2つの3x3行列の内積よりもコンピューターで時間がかかります。(コンピューターは通常のマトリックスでの操作が非常に得意です)

ただし、マトリックスには他の迷惑な機能があります。たとえば、長期的には安定した生き物ではありません。3D空間で回転をモデリングする場合、通常、回転を積み重ねて方向行列にまとめます。これは、参照フレームの方向を格納する単一の回転行列です。このプロセスにより、何百万回もの追加が行われると、Oマトリックスが厳密な回転マトリックス形式から分岐します。これは、マトリックスを定期的に再構成することで回避できますが、これが重要な場合があります。つまり、単位行列の非回転の場合です。

回転の軸角度表現(またはクォータニオン表現)を見つけて、その行列を再現する必要があります。ほとんどのアルゴリズムはゼロベクトルを生成し、この場合はゼロ除算が発生します。これらの種類のケースでは、「if 0 then ...」タイプのソリューションを使用してこのようなケースを回避しようとすることも一般的にはお勧めできません。特異性と恐ろしいエラーで終わります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.