クォータニオンとは何ですか?


50

クォータニオンとは何ですか?また、2D平面上の3点を使用してどのような利点が得られますか?最後に、四元数を使用することはいつ良い習慣と見なされますか?



歴史的には、四元数が最初に来たと思いますが、後にドットとクロス積は四元数から派生しました。

2
このアニメーション記事は非常に有益であることがわかりました:acko.net/blog/animate-your-way-to-glory-pt2/#quaternions
AShelly

純粋な数学では、四元数はi²=j²=k²= ijkのような3つの複素数であると信じています
-Vinz243

四元数は、回転をスムーズに補間する最良の方法です。結果として常に回転行列が得られるとは限らないため、回転行列を補間するだけでは機能しません。オイラー角を補間しても、滑らかな回転は得られません。そのため、コンピューターグラフィックスやロボット工学で必要な回転をアニメーション化するには、クォータニオンが最適です。そして、有用であるが、どういうわけかそれほど頻繁に使用されない拡張機能があります。これは、変換と回転を表すことができるデュアルクォータニオンと呼ばれます
トビアスB

回答:


43

数学的には、クォータニオンは4次元の複素数です。ただし、ゲーム開発では、クォータニオンを使用して、エンコードによって3D空間の回転を記述することがよくあります。

  1. 回転軸(3次元ベクトルの形式)
  2. その軸をどのくらい回すか

この情報はクォータニオン内のサインとコサインでエンコードされているため、一般的にクォータニオンの内部コンポーネント(xyzw)を個別に明示的に設定または読み取らないでください。そのようにして間違いを犯すと、意味のない結果が得られやすくなります。四元数数学ライブラリは通常、四元数を操作する関数を提供します(たとえば、オイラー角または軸角への変換、およびオイラー角からの変換など)。

回転を説明する別の方法は、3つの固定軸のx、y、z(別名オイラー角)の周りをどれだけ回転するかを記述することです。ただし、オイラー角はジンバルロックと呼ばれる問題の影響を受けますます。1つの軸を中心に90°回転すると、他の2つの軸は等価になります。クォータニオンでは、この問題は発生しません。

3D空間で回転を表現する別の方法は、4x4 変換行列を使用することです。しかし、変換マトリックスを使用すると、回転だけでなく、拡大縮小、平行移動、傾斜もできます。あなただけが欲しいとき回転、マトリックスは過剰になり、クォータニオンははるかに迅速で単純なソリューションになります。

この問題は3D空間にのみ関係します。2D空間では、回転軸は1つだけです。回転は、単一の浮動小数点数または単一の複素数で表現できるため、この問題は発生しません。理論的には、軸が平面を指す(または平面から出る)クォータニオンを持つ2D平面上の回転を表現できますが、通常は過剰です。


6
四元数から始めて四元数で終わる場合、四元数ではジンバルロックは問題になりません。ジンバルロックは、オイラー角に変換するステップまたは戻るステップがあるときに開始されます。
ラチェットフリーク

2
四元数は軸+角度ではなく、3つの複素数とスケールです。
トランジスタ

11
@ transistor09あなたは両方とも正しいと思いますか?単位四元数の3成分の虚数部は、回転軸に沿った単位ベクトルとして解釈でき、回転角の半分の正弦でスケーリングされます。単位四元数の実数部は、回転角の半分の余弦です。したがって、正確な角度軸形式ではないことは確かですが、クォータニオンのコンポーネントは、軸およびその軸の周りの回転距離の(非線形)尺度として解釈できることは事実です。
DMGregory

2
また、四元数が回転行列よりも優れている点に言及することもできます。それらは結合が高速です。回転を組み合わせる場合、2つのクォータニオンを乗算するのに必要な演算は、行列を乗算するよりも少なくなります。
モニカの復活

3
実際、2D空間では、複素数は正確なアナログです。2Dポイントに複素数を掛け、それを回転させました。実際、通常のsin / cos回転とまったく同じです(複素数を十分に理解している場合は明らかです)。これは少し悪用される可能性がありますが、最終的には、2Dグラフィックスは今日のようなパフォーマンス集約型ではないため、複雑な数値(ほとんどの人は明らかに-そこにある非常に貧弱な四元数ベースのコードによって証明されるように:D)。
ルアーン

13

これは、@ Philippの答え​​に追加することです。

また、2D平面上の3点を使用してどのような利点が得られますか?

あなたが興味を持っているすべてが回転している場合は、本当に四元数を必要としない、すなわち平面について z軸。この場合、必要なのはヨー角だけであり、z軸を中心とした連続した回転が可能であるという事実を活用できます。したがって、ローテーションは任意の順序で適用できます。

XY平面ではない平面上で回転している場合、状況は異なります。この回転は、任意の3D軸を中心に回転することに相当します。現在、2つの選択肢があります。

  • XY平面と一致するように平面を3Dで回転し、ヨーし、逆変換する、または

  • 回転は最初は3Dであると考えてください。

2番目の選択肢はコーディングが簡単です。@Philippが言ったように、クォータニオンはジンバルロックを回避します(中間のRPYまたは軸/角度の変換を回避する場合)。

最後に、四元数を使用することはいつ良い習慣と見なされますか?

3D回転がある場合は常に、クォータニオンを使用することをお勧めします。

例えば:

  • ではQtの。クォートを使用すると、slerp関数のように、回転間を簡単に補間できます。

  • ROSは、ロボットのポーズを変換するためにそれらを使用します。

  • 箇条書きのダイナミクスエンジン

  • 非常に洗練されたアプリケーションについては、古典的な3Dメカニクスでの使用についてはこちらをご覧ください。


「3D回転がある場合は常に、クォータニオンを使用することをお勧めします。」ただでやや強すぎます。 ほとんど常に優れています。代替が適切な状況があります。(不完全性の例として、クォータニオンのn番目のルートは複数値です)
Yakk

1
四元数は使用する商品であり、実装するのが面倒です。ジンバルロックに気づいていれば、それらなしでもうまくいくことができます。
半蔵H
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.