導入
単位四元数は、3 次元オブジェクトの向きと回転を表す便利な数学的表記法を提供します。オイラー角と比べて、構成が簡単で、ジンバルのブロッキングの問題を回避できます。回転行列と比較して、数値的に安定しており、より効率的です。クォータニオンは、コンピュータ グラフィックス、ロボット工学、ナビゲーション、分子動力学、衛星宇宙力学などのアプリケーションに採用されています。
クォータニオンを使用した回転操作
このセクションで使用されるプロパティの非常に厳密な説明は、Altmann によって提供されています。
回転の超球面
回転空間のアイデアを得る
単位四元数は、比較的単純な方法で 3次元の回転の数学的空間を表します。まず回転空間そのものについて直感的に理解することで、回転と四元数の対応を理解することができます。
3 次元での各回転には、特定の軸を中心とした特定の角度の回転が含まれます。角度が 0 の場合、軸は重要ではないため、 0度の回転は回転空間内の単純な点になります (これが恒等回転です)。角度が小さいがゼロではない場合、可能な回転のセットは回転アイデンティティを囲む小さな球であり、球の各点は特定の方向を指す軸を表します (天球と比較してください)。より大きな角度の回転は徐々に恒等回転から遠ざかり、半径が増加する同心球として想像できます。したがって、恒等回転の近傍では、回転の抽象空間は通常の 3 次元空間に似ています (異なる半径の球で囲まれた中心点として見ることもできます。回転角度が 180° を超えると、類似はそこで終了します)。 、異なる軸に沿った回転は発散を停止し、再び互いに類似し始め、最終的に角度が 360° に達すると同一 (同一回転と等しくなります) になります。

同様の現象が球の表面でも観察されます。北極に立って、そこからいくつかの方向に直線(実際には子午線)を引くと、それらは発散し、南極で再び収束します。北極の周りに描かれた半径が増加する同心円 (平行線) は、極間の距離がカバーされると、最終的には南極の点に崩壊します。私たちは、極からのさまざまな方向 (つまり、さまざまな経線) をさまざまな回転軸に、そして北極までのさまざまな距離をさまざまな角度に同化することができます。したがって、回転空間の類似性が得られます。ただし、球の表面は 2 次元ですが、回転軸はすでに 3 次元を使用しています。したがって、回転空間は超球、つまり 4 次元の球によってモデル化されます。円が球の一部であるのと同じように、通常の球を超球の一部と考えることができます。たとえば、 xy平面内の軸の回転のみを表すセクションを取得できます (反対の図を参照)。回転角度が北極との緯度の差の2 倍であることがわかります。実際、赤道上の点は 90 度ではなく 180 度の回転を表し、南極は 360 度の回転を表します。 180°の半回転ではありません。
北極と南極は同じ回転を表し、実際、これは互いの対蹠点にある点の任意のペアに当てはまります。点がベクトルによって方向付けられた軸の周りの角度αの回転に対応する場合
回転スペースを構成する
緯度と経度などの 2 つの座標を使用して球の表面をパラメータ化できます。しかし、北極と南極では、球上の他の点と本質的に変わらないにもかかわらず、緯度と経度の動作が悪くなります (劣化しています)。北極と南極 (緯度 +90° と -90°) では、経度は意味を失います。
2 つのパラメータを持つ座標系はこの縮退を回避できないことがわかります (これはヘアリー ボール定理です)。このような問題は、球を 3 次元空間に埋め込み、3 つの デカルト座標(ここではw 、 x 、 y ) を使用してパラメータ化し、北極を ( w , x , y ) = (1, 0, 0)、南極は ( w , x , y ) = (−1, 0, 0) にあり、赤道は方程式w = 0 およびx 2 + y 2 = 1 の円になります。球上の点は次の条件を満たします。制約w 2 + x 2 + y 2 = 1 なので、座標は 3 つありますが、自由度は常に 2 になります。球の点 ( w 、 x 、 y ) は、ベクトルによって方向付けられた水平軸の周りの通常空間の回転を表します。
同様に、3 次元空間の回転空間を記述する超球は 3 つの角度 (オイラー角) を使用してパラメータ化できますが、このタイプのパラメータ化は超球の特定の点で縮退し、次の問題が発生します。ジンバルのブロック。これは、4 つのユークリッド座標w 、 x 、 y 、 z ( w 2 + x 2 + y 2 + z 2 = 1) を使用することで回避できます。座標点 ( w 、 x 、 y 、 z ) は、軸の周りの回転を表します。ベクトルによって導かれる
回転から四元数へ
クォータニオンの概要
代数の通常の規則に準拠し、さらに規則i 2 = −1 に従う抽象記号i を導入することによって、複素数を定義できます。これは、複素数を計算するためのすべてのルールを再現するには十分です。たとえば、
同様に、四元数は、規則i 2 = j 2 = k 2 = ijk = −1 と、乗算の可換性を除く通常の代数規則を満たす抽象記号i 、 j 、 k を導入することによって定義できます (よく知られた例です)。非可換乗算は行列乗算です)。すべての計算ルールはこれらの定義から生じます。たとえば、次のように示すことができます
虚数部
学校でベクトルを勉強した人は、ベクトルに数値を加算すること、または 2 つのベクトルを掛け合わせることが奇妙に感じるかもしれません。なぜなら、これらの演算は通常は定義されていないからです。ただし、これが四元数の実部と虚部の単なる表記であることを覚えておくと、より正当なものになります。
クォータニオンの乗算は、ベクトル積とベクトルの内積(実際には最初はクォータニオンからインスピレーションを得たもの) の現代語で表現できます。ルールi 2 = j 2 = k 2 = ijk = −1 の代わりに、2 つのベクトルの乗算のルールがあります。
- $$ {\vec{v} \vec{w}} $$ベクトルの乗算です。
- $$ {\vec{v} \wedge \vec{w}} $$はベクトル積 (ベクトル)、
- $$ {\vec{v} \cdot \vec{w}} $$はドット積 (数値) です。
ベクトルの乗算は (外積のため) 可換ではありませんが、スカラー間およびスカラーとベクトルの間の乗算は可換です。これらの規則から直ちに次のことがわかります。
非ゼロ四元数の逆(左と右) は次のとおりです。
回転と四元数の関係
前述したように、 ( w , x , y , z ) を回転の座標とします。クォータニオンを定義しましょう。
- $$ {q \vec{v} q^{-1}} $$
ベクトルを返します
したがって、四元数の乗算は回転の合成に対応します。p とq が回転を表す四元数である場合、 pqによる回転 (共役) は次のようになります。
- $$ {p q \vec{v} (p q)^{-1} = p q \vec{v} q^{-1} p^{-1} = p (q \vec{v} q^{-1}) p^{-1}} $$、
これは、 qで回転 (共役) し、次にpで回転することになります。
回転の逆四元数は逆回転に対応します。
四元数の共役と空間の回転の等価性の実証
どちらか
- $$ {\vec{v’} = q \vec{v} q^{-1} = \left( \cos \frac{\alpha}{2} + \vec{u} \sin \frac{\alpha}{2} \right) \, \vec{v} \, \left( \cos \frac{\alpha}{2} – \vec{u} \sin \frac{\alpha}{2} \right)} $$
ベクトルを返します
- $$ {\begin{array}{lll} \vec{v’} &=& \vec{v} \cos^2 \frac{\alpha}{2} + (\vec{u}\vec{v} – \vec{v}\vec{u}) \sin \frac{\alpha}{2} \cos \frac{\alpha}{2} – \vec{u}\vec{v}\vec{u} \sin^2 \frac{\alpha}{2} \\ &=& \vec{v} \cos^2 \frac{\alpha}{2} + 2 (\vec{u} \wedge \vec{v}) \sin \frac{\alpha}{2} \cos \frac{\alpha}{2} – (\vec{v} (\vec{u} \cdot \vec{u}) – 2 \vec{u} (\vec{u} \cdot \vec{v})) \sin^2 \frac{\alpha}{2} \\ &=& \vec{v} (\cos^2 \frac{\alpha}{2} – \sin^2 \frac{\alpha}{2}) + (\vec{u} \wedge \vec{v}) (2 \sin \frac{\alpha}{2} \cos \frac{\alpha}{2}) + \vec{u} (\vec{u} \cdot \vec{v}) (2 \sin^2 \frac{\alpha}{2}) \\ &=& \vec{v} \cos \alpha + (\vec{u} \wedge \vec{v}) \sin \alpha + \vec{u} (\vec{u} \cdot \vec{v}) (1 – \cos \alpha) \\ &=& (\vec{v} – \vec{u} (\vec{u} \cdot \vec{v})) \cos \alpha + (\vec{u} \wedge \vec{v}) \sin \alpha + \vec{u} (\vec{u} \cdot \vec{v}) \\ &=& \vec{v}_{\bot} \cos \alpha + (\vec{u} \wedge \vec{v}_{\bot}) \sin \alpha + \vec{v}_{\|} \end{array}} $$
または
例
活用によるアクション

の方向の軸の周りの回転f を考えます。
- $$ {\alpha = \frac{2 \pi}{3}} $$
の基準
- $$ {\begin{array}{lll} u &=& \cos\frac{\alpha}{2} + \sin\frac{\alpha}{2}\cdot \frac{1}{\| \vec{v} \| }\vec{v}\\ &=& \cos \frac{\pi}{3} + \sin \frac{\pi}{3}\cdot \frac{1}{\sqrt{3}}\vec{v}\\ &=& \frac{1}{2} + \frac{\sqrt{3}}{2}\cdot \frac{1}{\sqrt{3}}\vec{v}\\ &=& \frac{1}{2} + \frac{\sqrt{3}}{2}\cdot \frac{\mathbf{i} + \mathbf{j} + \mathbf{k}}{\sqrt{3}}\\ &=& \frac{1 + \mathbf{i} + \mathbf{j} + \mathbf{k}}{2} \end{array}} $$
fが回転関数の場合、
- $$ {f(a\mathbf{i} + b\mathbf{j} + c\mathbf{k}) = u (a\mathbf{i} + b\mathbf{j} + c\mathbf{k}) u^{-1}} $$
虚数座標の符号を変更するだけで、単位四元数の逆数が得られることを証明できます。それに応じて、
- $$ {u^{-1} = \frac{1- \mathbf{i} – \mathbf{j} – \mathbf{k}}{2}} $$
そして
- $$ {f(a\mathbf{i} + b\mathbf{j} + c\mathbf{k}) = \frac{1 + \mathbf{i} + \mathbf{j} + \mathbf{k}}{2} (a\mathbf{i} + b\mathbf{j} + c\mathbf{k}) \frac{1 – \mathbf{i} – \mathbf{j} – \mathbf{k}}{2}} $$
クォータニオンを使用した通常の計算規則を適用すると、次のようになります。
- $$ {f(a\mathbf{i} + b\mathbf{j} + c\mathbf{k}) = c\mathbf{i} + a\mathbf{j} + b\mathbf{k}} $$
予想のとおり、回転は立方体の頂点の 1 つを持ち、その点を通る最長の対角線に沿って 120 度回転することと同じです。 3 つの軸がどのように円順列を経るかを観察します。
実際のクォータニオン計算
前回の結果を証明してみましょう。 fの式を (2 つのステップで) 作成し、ルールを適用します。
- $$ {\begin{alignat}{2} \mathbf{ij} & = \mathbf{k}, & \mathbf{ji} & = \mathbf{-k}, \\ \mathbf{jk} & = \mathbf{i}, & \mathbf{kj} & = \mathbf{-i}, \\ \mathbf{ki} & = \mathbf{j}, & \mathbf{ik} & = \mathbf{-j}, \\ \mathbf{i}^{2} & = \mathbf{j}^{2}& = \mathbf{k}^{2} & = -1 \end{alignat}} $$
以下を取得します。
- $$ {\begin{array}{lll} f(a\mathbf{i} + b\mathbf{j} + c\mathbf{k}) &=& \frac{1 + \mathbf{i} + \mathbf{j} + \mathbf{k}}{2} (a\mathbf{i} + b\mathbf{j} + c\mathbf{k}) \frac{1 – \mathbf{i} – \mathbf{j} – \mathbf{k}}{2} \\ && (1 – \mathbf{i} – \mathbf{j} – \mathbf{k})\\ &=& \frac{1}{4} ( (a\mathbf{i} + b\mathbf{j} + c\mathbf{k}) +(- a + b\mathbf{k} – c\mathbf{j}) + (-a\mathbf{k} – b +c\mathbf{i}) + (a\mathbf{j} – b\mathbf{i} – c))\\ && (1 – \mathbf{i} – \mathbf{j} – \mathbf{k})\\ &=& \frac{1}{4} ( (-a – b – c) + (a – b+ c) \mathbf{i} + (a + b – c) \mathbf{j} + (-a + b + c) \mathbf{k})\\ && (1 – \mathbf{i} – \mathbf{j} – \mathbf{k})\\ &=& \frac{1}{4} ( ( (-a – b – c) + (a – b + c) \mathbf{i} + (a + b – c) \mathbf{j} + (-a + b + c) \mathbf{k})\\ &&+ ( (a + b + c) \mathbf{i} + (a – b + c) + (a + b – c) \mathbf{k} + (a – b – c) \mathbf{j})\\ &&+ ( (a + b + c) \mathbf{j} + (-a + b – c) \mathbf{k} + (a + b – c) + (-a + b + c) \mathbf{i})\\ &&+ ( (a + b + c) \mathbf{k} + (a – b + c) \mathbf{j} + (-a – b + c) \mathbf{i} + (-a + b + c))\\ &=& \frac{1}{4} ( ( (-a – b – c) + (a – b + c) + (a + b – c) + (-a + b + c) )\\ &&+ ( (a – b + c) + (a + b + c) + (-a + b + c) + (-a – b + c) ) \mathbf{i}\\ &&+ ( (a + b – c) + (a – b – c) + (a + b + c) + (a – b + c) ) \mathbf{j}\\ &&+ ( (-a + b + c) + (a + b – c) + (-a + b – c) + (a + b + c) ) \mathbf{k})\\ &=& \frac{1}{4} (0 + 4c \mathbf{i} + 4a \mathbf{j} + 4b \mathbf{k})\\ &=&c\mathbf{i} + a\mathbf{j} + b\mathbf{k} \end{array}} $$
これは実際に発表された結果です。このような計算を手作業で行うのは比較的面倒であることがわかりますが、コンピュータープログラムでは、結局のところ、四元数乗算ルーチンを 2 回呼び出すことになります。

