四元数とその利点について入手可能







翻訳者から:正確に175年と3日前に四元数が発明されました。 このラウンドの日付に敬意を表して、私はこの概念を明確な言語で説明する資料を取り上げることにしました。



四元数の概念は、アイルランドの数学者ウィリアムローワンハミルトンirによって、1843年10月16日月曜日にアイルランドのダブリンで発明されました。 ハミルトンと彼の妻はロイヤルアイルランドアカデミーに行き、ブルームブリッジを越えてロイヤル運河を渡りました 。彼は驚くべき発見をし、すぐに橋の石をひっかきました。







i2=j2=k2=ijk=−1















四元数の乗算の基本式が発見されたことに敬意を表して、王立運河に架かるブルーム橋の記念額。



この記事では、四元数の概念をわかりやすい方法で説明しようとします。 クォータニオンを視覚化する方法を説明し、クォータニオンで実行できるさまざまな操作についても説明します。 さらに、マトリックス、オイラー角および四元数の使用を比較し、オイラー角またはマトリックスの代わりに四元数を使用する場合と、不要な場合の説明を試みます。



内容





45分でクォータニオンを完全に理解することはできません。



この記事には多くの数学が含まれているため、弱虫向けではありません。


はじめに



コンピュータグラフィックスでは、空間内の位置(変位)と空間内の方向(回転)を記述するためにマトリックスが使用されます。 単一の変換マトリックスを使用して、オブジェクトのスケールを記述することもできます。 この行列は「基底空間」と見なすことができます。 ベクトルまたはポイント(または別のマトリックス)に変換のマトリックスを掛けると、このベクトル、ポイント、またはマトリックスをこのマトリックスで表される空間に「変換」します。



この記事では、変換マトリックスについて詳しく説明しません。 私のマトリックスの記事で変換マトリックスの詳細を読むことができます。



この記事では、クォータニオンを使用して空間内のオブジェクトの方向(回転)を記述する別の方法について説明します。



複素数



クォータニオンを完全に理解するためには、まずクォータニオンがどこから来たのかを理解する必要があります。 四元数の原理は、複素数システムの概念に基づいています。



既知の数値セット( natural 、 integer 、 realおよびrational )に加えて、複素数のシステムは虚数と呼ばれる新しい数値セットを追加します。 架空の数値は、解のない特定の方程式を解くために考案されました。たとえば:







x2+1=0







この式を解決するには、 x2=−1 、そして、ご存知のように、これは不可能です。なぜなら、任意の数の二乗(正または負)は常に正だからです。



数学者は、式に解がないことを受け入れられなかったため、新しい概念が発明されました。そのような方程式を解くために使用できる虚数です。



虚数は次のとおりです。







i2=−1







この仮定を理解しようとしないでください。なぜなら、その存在には論理的な理由がないからです。 それを受け入れるだけです i -正方形は −1 。



虚数のセットは次のように表すことができます  mathbbI 。



複素数のセット(で示される  mathbbC 次の形式の実数と虚数の合計です。







z=a+bi  a、b in mathbbR、  i2=−1

、、







また、すべての実数は b=0 、そしてすべての虚数は a=0 。



複素数の加算と減算



実数部と虚数部を加算および減算することにより、複素数を加算および減算できます。



追加:







(a1+b1i)+(a2+b2i)=(a1+a2)+(b1+b2)i

()()()()







減算:







(a1+b1i)−(a2+b2i)=(a1−a2)+(b1−b2)i

()()()()







複素数とスカラー値の乗算



複素数の各メンバーにスカラーを乗算することにより、複素数にスカラーが乗算されます。







 lambda(a+bi)= lambdaa+ lambdabi

()







複素数の積



さらに、通常の代数規則を使用して複素数を乗算することもできます。







 beginarrayrclz1&=&(a1+b1i)z2&=&(a2+b2i)z1z2&=&(a1+b1i)(a2+b2i)&=&a1a2+a1b2i+b1a2i+b1b2i2&=&(a1a2−b1b2)+(a1b2+b1a2)i endarray

&&()&&()&&()()&&&&()()







複素数の二乗



また、複素数は、それ自体を乗算することで2乗できます。







 beginarrayrclz&=&(a+bi)z2&=&(a+bi)(a+bi)&=&(a2−b2)+2abi endarray

&&()&&()()&&()







共役複素数



複素数の共役値は 、虚数部の符号が変更された複素数であり、 \バーzバー またはどのように z∗ 。







 beginarrayrclz&=&(a+bi)z∗&=&(a−bi) endarray

&&()&&()







複素数とその共役値の乗算は興味深い結果をもたらします。







 beginarrayrclz&=&(a+bi)z∗&=&(a−bi)zz∗&=&(a+bi)(a−bi) \&=&a2−abi+abi+b2&=&a2+b2 endarray

&&()&&()&&()()&&&&







複素数の絶対値



複素数の共役数を使用して、複素数の絶対値(またはnorm 、またはMagnitude )を計算できます。 複素数の絶対値は、複素数の平方根とその共役の積です。 それは |z| :







 beginarrayrclz&=&(a+bi)|z|&=& sqrtzz∗&=& sqrt(a+bi)(a−bi)&=& sqrta2+b2 endarray

&&()&&&&()()&&







2つの複素数の商



2つの複素数の商を計算するには、分子と分母に分母の共役数を掛けます。







 beginarrayrclz1&=&(a1+b1i)z2&=&(a2+b2i) cfracz1z2&=& cfraca1+b1ia2+b2i&=& cfrac(a1+b1i)(a2−b2i)(a2+b2i)(a2−b2i)&=& cfraca1a2−a1b2i+b1a2i−bi2a22+b22&=& cfraca1a2+b1b2a22+b22+ cfracb1a2−a1b2a22+b22i endarray

&&()&&()&&&&()()()()&&&&







学位 i



私たちがそれを主張する場合 i2=−1 その後の可能性がなければなりません i 他の程度に。







 beginarrayrrrrrrri0&=&&&&&&&1i1&=&&&&&&ii2&=&&&&&&−1i3&=&ii2&=&&&−ii4&=&i2i2&=&&&1i5&=&ii4&=&&&ii6&=&ii5&=&i2&=&−1 endarray

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&







このシリーズを記録し続けると、パターンに気付くでしょう (1、i、−1、−i、1、\ドット)(、、、、、ドット) 。



同様のパターンは、負の度合いの増加とともに発生します。







 beginarrayrcri0&=&1i−1&=&−ii−2&=&−1i−3&=&ii−4&=&1i−5&=&−ii−6&=&−1 endarray







あなたはすでに数学でこのパターンを見たかもしれませんが、 (x、y、−x、−y、x、\ドット) 、2次元デカルト平面でポイントを反時計回りに90度回転することによって取得されます。 行 (x、−y、−x、y、x、\ドット) 2次元デカルト平面上でポイントを90度回転させることにより作成されます。









デカルト平面



複雑な飛行機



同様に、 複素数を複素平面と呼ばれる2次元グリッドに適用して、 実数部を水平軸に、 虚数部を垂直軸にリンクできます。









複雑な飛行機



前の行からわかるように、複素数を乗算すると i 、その後、複素平面上で複素数を90度単位で回転させることができます。



これが正しいかどうかを確認しましょう。 複素平面上の任意の点を取ります p :







p=2+i







そしてそれを掛けます i 受け取った q :







 beginarrayrclp&=&2+iq&=&pi&=&(2+i)i&=&2i+i2&=&−1+2i endarray







掛け算 q に i 私たちは得る r :







 beginarrayrclq&=&−1+2ir&=&qi&=&(−1+2i)i&=&−i+2i2&=&−2−i endarray







そして、乗算 r に i 私たちは得る s :







 beginarrayrclr&=&−2−is&=&ri&=&(−2−i)i&=&−2i−i2&=&1−2i endarray







そして、乗算 s に i 私たちは得る t :







 beginarrayrcls&=&1−2it&=&si&=&(1−2i)i&=&i−2i2&=&2+i endarray







そして、私たちは正確に始めたところに行きました p ) これらの複素数を複素平面に配置すると、次の結果が得られます。









複素平面上の複素数



これで、複素平面上で時計回りに回転し、複素数に −i 。



ローター



また、複素数を次の形式で設定することにより、複素平面上で任意のターンを実行できます。







q= cos theta+i sin theta







複素数にローターを掛けるとき q 一般式が得られます:







 beginarrayrclp&=&a+biq&=& cos theta+i sin thetapq&=&(a+bi)( cos theta+i sin theta)a prime+b primei&=&a cos theta−b sin theta+(a sin theta+b cos theta)i\終了配列







マトリックス形式で記述できるもの:







 beginbmatrixa prime&−b primeb prime&a prime endbmatrix= beginbmatrix cos theta&− sin theta sin theta& cos theta endbmatrix beginbmatrixa&−bb&a endbmatrix







原点を基準にして複素平面上の任意の点を反時計回りに回転させる方法は何ですか。



四元数



複素数のシステムと複素平面について学習したので、それらを3次元空間に持ち込むことができます。 i さらに2つの虚数。



四元数の一般的な形式は次のとおりです







q=s+xi+yj+zk  s、x、y、z in mathbbR







ハミルトンの有名な表現によると:







i2=j2=k2=ijk=−1













 beginarraycccij=k&jk=i&ki=jji=−k&kj=−i&ik=−j endarray







の関係に気づくかもしれません i 、 j そして k 単位デカルトベクトルのベクトル乗算のルールに非常に似ています。







 beginarrayccc mathbfx times mathbfy= mathbfz& mathbfy times mathbfz= mathbfx& mathbfz times mathbfx= mathbfy mathbfy times mathbfx=− mathbfz& mathbfz times mathbfy=− mathbfx& mathbfx times mathbfz=− mathbfy endarray







ハミルトンはまた、その虚数 i 、 j そして k 3つのデカルト単位ベクトルを表すために使用できます  mathbfi 、  mathbfj そして  mathbfk 虚数と同じ性質を持つため、  mathbfi2= mathbfj2= mathbfk2=−1 。









プロパティのグラフィカルな表現  mathbfij 、  mathbfjk 、  mathbfki



上の画像は、次の形式でデカルト単位ベクトル間の関係をグラフィカルに示しています  mathbfi 、  mathbfj そして  mathbfk 。



順序ペアとしての四元数



四元数を順序付きペアとして表すこともできます。







q=[s、 mathbfv]  s in mathbbR、 mathbfv in mathbbR3







どこで  mathbfv 個々のコンポーネントとして表すこともできます。







q=[s、x mathbfi+y mathbfj+z mathbfk]  s、x、y、z in mathbbR







このエントリを使用すると、四元数と複素数の一般的な特徴をより簡単に表すことができます。



四元数の加算と減算



四元数は、複素数と同様に加算および減算できます。







 beginarrayrclqa&=&[sa、 mathbfa]qb&=&[sb、 mathbfb]qa+qb&=&[sa+sb、 mathbfa+ mathbfb]qa−qb&=&[sa−sb、 mathbfa− mathbfb] endarray







クォータニオン作品



2つのクォータニオンの積も表現できます。







 beginarrayrclqa&=&[sa、 mathbfa]qb&=&[sb、 mathbfb]qaqb&=&[sa、 mathbfa][sb、 mathbfb]&=&(sa+xai+yaj+zak)(sb+xbi+ybj+zbk)&=&(sasb−xaxb−yayb−zazb)&&+(saxb+sbxa+yazb−ybza)i&&+(sayb+sbya+zaxb−zbxa)j&&+(sazb+sbza+xayb−xbya)k end配列







これにより、別のクォータニオンが得られます。 前の式の虚数を置き換えると i 、 j そして k 順序付きペア(クォータニオンユニットとも呼ばれます)を取得すると、







i=[0、 mathbfi]〜j=[0、 mathbfj]〜k=[0、 mathbfk]







そして、元の式に代入して [1、 mathbf0]=1 私達は得る:







 beginarrayrcl[sa、 mathbfa][sb、 mathbfb]&=&(sasb−xaxb−yayb−zazb)[1、 mathbf0]&&+(saxb+sbxa+yazb−ybza)[0、 mathbfi]&&+(sayb+sbya+zaxb−zbxa)[0、 mathbfj]&&+(sazb+sbza+xayb−xbya)[0、 mathbfk] endarray







この式を順序付きペアの合計に展開すると、次のようになります。







 beginarrayrcl[sa、 mathbfa][sb、 mathbfb]&=&[sasb−xaxb−yayb−zazb、 mathbf0]&&+[0、(saxb+sbxa+yazb−ybza) mathbfi]&&+[0、(sayb+sbya+zaxb−zbxa) mathbfj]&&+[0、(sazb+sbza+xayb−xbya) mathbfk] endarray







四元数単位を掛けて共通ベクトル成分を抽出すると、この方程式を次のように書き換えることができます。







 beginarrayrcl[sa、 mathbfa][sb、 mathbfb]&=&[sasb−xaxb−yayb−zazb、 mathbf0]&&+[0、sa(xb mathbfi+yb mathbfj+zb mathbfk)+sb(xa mathbfi+ya mathbfj+za mathbfk)&&(yazb−ybza) mathbfi+(zaxb−zbxa) mathbfj+(xayb−xbya) mathbfk] endarray







この方程式は、2つの順序付きペアの合計を示します。 最初の順序ペアは材料のクォータニオンで、2番目は純粋なクォータニオンです。 これらの2つの順序付きペアは、1つの順序付きペアに結合できます。







 beginarrayrcl[sa、 mathbfa][sb、 mathbfb]&=&[sasb−xaxb−yayb−zazb、&&sa(xb mathbfi+yb mathbfj+zb mathbfk)+sb(xa mathbfi+ya mathbfj+za mathbfk)&&+(yazb−ybza) mathbfi+(zaxb−zbxa) mathbfj+(xayb−xbya) mathbfk] endarray







代入すると、







 beginarrayrcl mathbfa&=&xa mathbfi+ya mathbfj+za mathbfk mathbfb&=&xb mathbfi+yb mathbfj+zb mathbfk mathbfa cdot mathbfb&=&xaxb+yayb+zazb mathbfa times mathbfb&=&(yazb−ybza) mathbfi+(zaxb−zbxa) mathbfj+(xayb−xbya) mathbfk endarray







取得するもの:







[sa、 mathbfa][sb、 mathbfb]=[sasb− mathbfa cdot mathbfb、sa mathbfb+sb mathbfa+ mathbfa times mathbfb]







これは、四元数の積の一般的な方程式です。



リアルクォータニオン



実際のクォータニオンは、ベクトルが  mathbf0 :







q=[s、 mathbf0]







そして、2つのマテリアルクォータニオンの積は、別のマテリアルクォータニオンです。







 beginarrayrclqa&=&[sa、 mathbf0]qb&=&[sb、 mathbf0]qaqb&=&[sa、 mathbf0][sb、 mathbf0]&=&[sasb、 mathbf0] endarray







これは、虚数項を含む2つの複素数の積に似ています。







 beginarrayrclz1&=&a1+0iz2&=&a2+0iz1z2&=&(a1+0i)(a2+0i)&=&a1a2 endarray







スカラー四元数乗算



次のルールを順守しながら、クォータニオンにスカラーを掛けることもできます。







 beginarrayrclq&=&[s、 mathbfv] lambdaq&=& lambda[s、 mathbfv]&=&[\ラムダs、\ラムダ mathbfv] endarray







上記の実際のクォータニオンの積を使用して、クォータニオンに実際のクォータニオンとしてスカラーを掛けることにより、これを確認できます。







 beginarrayrclq&=&[s、 mathbfv] lambda&=&[ lambda、 mathbf0] lambdaq&=&[ lambda、 mathbf0][s、 mathbfv]&=&[ lambdas、 lambda mathbfv] endarray







純粋な四元数



材料の四元数に加えて、ハミルトンは純粋な四元数をゼロスカラー項を持つ四元数として定義しました:







q=[0、 mathbfv]







または、コンポーネントを書き留める場合:







q=xi+yj+zk







また、2つの純粋な四元数の積を取得できます。







 beginarrayrclqa&=&[0、 mathbfa]qb&=&[0、 mathbfb]qaqb&=&[0、 mathbfa][0、 mathbfb]&=&[− mathbfa cdot mathbfb、 mathbfa times mathbfb] endarray







上記のクォータニオンの積則に従って。



加算四元数形式



さらに、クォータニオンは、クォータニオンの実部と純粋部の合計として表現できます。







 beginarrayrclq&=&[s、 mathbfv]&=&[s、 mathbf0]+[0、 mathbfv] endarray







単一四元数



任意のベクトルを取る  mathbfv 、このベクトルは、次のようにスカラー値と方向の両方で表現できます。







 mathbfv=v mathbf hatv〜 textwhere〜v=| mathbfv|〜 textand〜| mathbf hatv|=1







この定義を純粋な四元数の定義と組み合わせると、次のようになります。







 beginarrayrclq&=&[0、 mathbfv]&=&[0、v mathbf hatv]&=&v[0、 mathbf hatv] endarray







ゼロスカラーと単位ベクトルを持つ単位四元数を記述することもできます。







 hatq=[0、 mathbf hatv]







四元数バイナリ形式



これで、単一の四元数の定義と四元数の加法形式を組み合わせて、複素数の説明で使用される表記法に似た形式の四元数を取得できます。







 beginarrayrclq&=&[s、 mathbfv]&=&[s、 mathbf0]+[0、 mathbfv]&=&[s、 mathbf0]+v[0、 mathbf hatv]&=&s+v hatq endarray







これは、四元数を複素数に非常によく似た形式で表す方法を提供します。







 beginarrayrclz&=&a+biq&=&s+v hatq endarray







四元数の共役数



四元数の共役数は、符号の反対側の四元数のベクトル部分を取ることで計算できます。







 beginarrayrclq&=&[s、 mathbfv]q∗&=&[s、− mathbfv] endarray







四元数とその共役数の積により、次のことがわかります。







 beginarrayrclqq∗&=&[s、 mathbfv][s、− mathbfv]&=&[s2− mathbfv cdot− mathbfv、−s mathbfv+s mathbfv+ mathbfv times− mathbfv]&=&[s2+ mathbfv cdot mathbfv、 mathbf0]&=&[s2+v2、 mathbf0] endarray







四元数ノルム



複素数のノルムの定義を思い出してください:







 beginarrayrcl|z|&=& sqrta2+b2zz∗&=&|z|2 endarray







同様に、クォータニオンのノルム(または大きさ)は次のように定義されます。







 beginarrayrclq&=&[s、 mathbfv]|q|&=& sqrts2+v2 endarray







これにより、次のようにクォータニオンのノルムを表現できます。







qq∗=|q|2







四元数の正規化



クォータニオンノルムの定義があれば、それを使用してクォータニオンを正規化できます。 四元数は、 |q| :







q prime= fracq sqrts2+v2







たとえば、クォータニオンを正規化しましょう:







q=[1,4 mathbfi+4 mathbfj−4 mathbfk]







まず、四元数率を計算する必要があります。







 beginarrayrcl|q|&=& sqrt12+42+42+(−4)2&=& sqrt49&=&7 endarray







次に、正規化された四元数を計算するために、四元数を四元数のノルムで除算する必要があります。







 beginarrayrclq prime&=& cfracq|q|[1.0em]&=& cfrac(1+4 mathbfi+4 mathbfj−4 mathbfk)7[1.0em]&=& cfrac17+ cfrac47 mathbfi+ cfrac47 mathbfj− cfrac47 mathbfk endarray







逆四元数



逆四元数は q−1 。 逆四元数を計算するには、四元数の共役数を取り、それをノルムの二乗で除算します。







q−1= fracq∗|q|2







これを示すために、逆数の定義を使用できます。







qq−1=[1、 mathbf0]=1







そして、両側に四元数の共役数を掛けると、次のようになります。







q∗qq−1=q∗







置換により、以下が得られます。







 beginarrayrcl|q|2q−1&=&q∗q−1&=& cfracq∗|q|2 endarray







ノルムが1の単一の四元数ノルムの場合、次のように記述できます。







q−1=q∗







クォータニオンスカラープロダクト



ベクトルのスカラー積と同様に、対応するスカラー部分を乗算して結果を合計することにより、2つの四元数のスカラー積を計算できます。







 beginarrayrclq1&=&[s1、x1 mathbfi+y1 mathbfj+z1 mathbfk]q2&=&[s2、x2 mathbfi+y2 mathbfj+z2 mathbfk]q1 cdotq2&=&s1s2+x1x2+y1y2+z1z2 endarray







四元数のスカラー積を使用して、四元数間の角度差を計算することもできます。







 cos theta= fracs1s2+x1x2+y1y2+z1z2|q1||q2|







単一の四元数ノルムの場合、方程式を単純化できます。







 cos theta=s1s2+x1x2+y1y2+z1z2







ターン



ローターと呼ばれる特別な形式の複素数を特定したことを思い出してください。これは、次のように2次元平面上の点を回転させるために使用できます。







q= cos theta+i sin theta







四元数との複素数の類似性により、四元数を表現することが可能になります。これは、3次元空間で点を回転するために使用できます。







q=[ cos theta、 sin theta mathbfv]







四元数の積を計算して、この理論が正しいかどうかを確認しましょう q およびベクトル  mathbfp 。 まず、表現することができます  mathbfp 次のように純粋な四元数として:







p=[0、 mathbfp]







A q 次の形式の単一の四元数ノルムです。







q=[s、 lambda mathbf hatv]







それから







 beginarrayrclp prime&=&qp&=&[s、 lambda mathbf hatv][0、 mathbfp]&=&[− lambda mathbf hatv cdot mathbfp、s mathbfp+ lambda mathbf hatv times mathbfp] endarray







結果は、スカラー部分とベクトル部分を持つ一般的な四元数であることがわかります。



最初に「特別な」ケースを見てみましょう。  mathbfp 垂直  mathbf hatv 。 この場合、スカラー積のメンバー − lambda mathbf hatv cdot mathbfp=0 結果は純粋な四元数になります:







p prime=[0、s mathbfp+ lambda mathbf hatv times mathbfp]







この場合、  mathbfp に関して  mathbf hatv 私たちはただ置き換える s= cos theta そして  lambda= sin theta 。







p prime=[0、 cos theta mathbfp+ sin theta mathbf hatv times mathbfp]







たとえば、ベクトルを回転させましょう  mathbfp Z軸に対して45°。 その後、四元数 q に等しくなります:







 beginarrayrclq&=&[ cos theta、 sin theta mathbfk]&=& left[ frac sqrt22、 frac sqrt22 mathbfk right] endarray







そして、ベクトルを取りましょう  mathbfp これは特別な場合に関連します  mathbfp 垂直  mathbfk :







p=[0.2 mathbfi]







それでは作品を見つけましょう





qp





:







 beginarrayrclp prime&=&qp&=& left[ frac sqrt22、 frac sqrt22 mathbfk right][0.2 mathbfi]&=& left[0.2 frac sqrt22 mathbfi+2 frac sqrt22 mathbfk times mathbfi right]&=&[0、 sqrt2 mathbfi+ sqrt2 mathbfj] endarray







軸を中心に45°回転したきれいな四元数を与えるもの  mathbfk 。 最終ベクトルの値が保持されることを確認することもできます。







 beginarrayrcl| mathbfp prime|&=& sqrt sqrt22+ sqrt22&=&2 endarray







まさに私たちが期待したもの!



これを次の画像でグラフィカルに表示できます。









四元数の回転(1)



では、直交しないクォータニオンを見てみましょう  mathbfp 。 クォータニオンのベクトル部分について、45°のオフセットを  mathbfp 次に取得します:







 beginarrayrcl mathbf hatv&=& frac sqrt22 mathbfi+ frac sqrt22 mathbfk mathbfp&=&2 mathbfiq&=&[ cos theta、 sin theta mathbf hatv]p&=&[0、 mathbfp] endarray







そして、ベクトルを掛けます  mathbfp に q 私達は得る:







 beginarrayrclp prime&=&qp&=&[ cos theta、sin theta mathbf hatv][0、 mathbfp]&=&[− sin theta mathbf hatv cdot mathbfp、 cos theta mathbfp+ sin theta mathbf hatv times mathbfp] endarray







置換後  mathbf hatv 、  mathbfp そして  theta=45 circ 私達は得る:







 beginarrayrclp prime&=& left[− frac sqrt22 left( frac sqrt22 mathbfi+ frac sqrt22 mathbfk right) cdot(2 mathbfi)、 frac sqrt222 mathbfi+ frac sqrt22 left( frac sqrt22 mathbfi+ frac sqrt22 mathbfk right) times2 mathbfi right]&=&[−1、 sqrt2 mathbfi+ mathbfj] endarray







つまり、それはもはや純粋な四元数ではなく、45°回転されておらず、ベクトルのノルムは2に等しくありません(それは  sqrt3 )



この結果はグラフィカルに表示できます。









クォータニオンターン(2)



厳密に言えば、四元数を表すのは間違っています p prime なぜなら、実際には4次元のベクトルだからです! 簡単にするために、クォータニオンのベクトルコンポーネントのみを示します。


ただし、すべてが失われるわけではありません。 ハミルトンは、結果を掛けると qp 反対の値に q 、結果は純粋な四元数になり、ベクトル成分のノルムが保持されます。 この例でこれを適用できるかどうか見てみましょう。



まず、計算しましょう q−1 :







 beginarrayrclq&=& left[ cos theta、 sin theta left( frac sqrt22 mathbfi+ frac sqrt22 mathbfk right) right]q−1&=& left[ cos theta、− sin theta left( frac sqrt22 mathbfi+ frac sqrt22 mathbfk right) right] endarray







で  theta=45 circ 私達は得る:







 beginarrayrclq−1&=& left[ frac sqrt22、− frac sqrt22 left( frac sqrt22 mathbfi+ frac sqrt22 mathbfk right) right]&=& frac12\左[ sqrt2、− mathbfi− mathbfk\右] endarray







前の値を組み合わせる qp そして q−1 私達は得る:







 beginarrayrclqp&=& left[−1、 sqrt2 mathbfi+ mathbfj right]qpq−1&=&\左[−1、 sqrt2 mathbfi+ mathbfj\右] frac12\左[ sqrt2、− mathbfi− mathbfk right]&=& frac12 left[− sqrt2− left( sqrt2 mathbfi+ mathbfj right) cdot(− mathbfi− mathbfk)、 mathbfi+ mathbfk+ sqrt2 left( sqrt2 mathbfi+ mathbfj right)− mathbfi+ sqrt2 mathbfj+ mathbfk right]&=& frac12 left[− sqrt2+ sqrt2、 mathbfi+ mathbfk+2 mathbfi+ sqrt2 mathbfj− mathbfi+ sqrt2 mathbfj+ mathbfk right]&=& left[0、 mathbfi+ sqrt2 mathbfj+ mathbfk\右] endarray







これは純粋な四元数であり、結果の標準は次のとおりです。







 beginarrayrcl|p prime|&=& sqrt12+ sqrt22+12&=& sqrt4&=&2 endarray







等しい  mathbfp 、つまり、ベクトルのノルムが保持されます。



下の画像は、回転の結果を示しています。









クォータニオンターン(3)



結果は純粋な四元数であり、元のベクトルのノルムは保持されていますが、ベクトルは必要な2倍である45°ではなく90°回転しています。 したがって、ベクトルの正しい回転のために  mathbfp 角に \シータ 任意の軸に対して  mathbf hatv 半角を取り、次のクォータニオンを作成する必要があります。







q=\左[ cos frac12 theta、 sin frac12 theta mathbf hatv\右]







クォータニオンターニングの一般的なビューとは何ですか!



四元数補間



コンピューターグラフィックスでクォータニオンを使用する最も重要な理由の1つは、クォータニオンが空間の回転を非常によく表現していることです。 四元数は、問題がオイラーコーナーの回転を表している折りたたみフレームなど、3D空間でポイントを回転させる他の方法の負担を取り除きます。



クォータニオンを使用して、3D空間での回転補間を表すいくつかの方法を定義できます。 私が検討している最初の方法はSLERPと呼ばれます 。 2つの方向の間のポイントをスムーズに補間するために使用されます。 2番目の方法はSLERPの開発であり 、 SQUADと呼ばれます。 パスを指定する一連の方向に沿って補間するために使用されます。



SLERP



SLERPは、Spherical L inear Interpolation(球面線形補間)の略です。 SLERPは、2つの方向の間のポイントをスムーズに補間する機能を提供します。



私は最初のオリエンテーションを q1 、および2番目の q2 。 補間された点は  mathbfp 、補間された点は  mathbfp prime 。 補間パラメーター t 補間します  mathbfp から q1 で t=0 前に q2 で t=1 。



標準の線形補間式は次のとおりです。







 mathbfp prime= mathbfp1+t( mathbfp2− mathbfp1)







この方程式を適用する基本的な手順は次のとおりです。





同じ基本原理を使用して、四元数の2つの方向の間を補間できます。



四元数の差



最初のステップは、以下の差を計算する必要があることを意味します q1 そして q2 。 クォータニオンのコンテキストでは、これは2つのクォータニオン間の角度差を計算することに似ています。







\デルタq=q−11q2







四元数を累乗する



次のステップは、この差の小数部分を取得することです。 クォータニオンの小数部を計算するには、値が範囲内の累乗になる [0...1] 。



クォータニオンを累乗する一般式は次の形式になります。







qt= exp(t logq)







四元数の指数関数は次のようになります。







 beginarrayrcl exp(q)&=& exp left([0、 theta mathbf hatv] right)&=&[ cos theta、 sin theta mathbf hatv] endarray







四元数の対数の形式は次のとおりです。







 beginarrayrcl logq&=& log( cos theta+ sin theta mathbf hatv)&=& log left( exp( theta mathbf hatv)\右)&=& theta mathbf hatv&=&[0、 theta mathbf hatv] endarray







で t=0 次のものがあります。







 beginarrayrclq0&=& exp(0 logq)&=& exp([ cos(0)、 sin(0) mathbf hatv])&=& exp([1、 mathbf0])&=&[1、 mathbf0] endarray







そしていつ t=1 私たちは持っています







 beginarrayrclq1&=& exp( logq)&=&q endarray







四元数の分数差



補間された角回転を計算するには、初期の向きを変更します q1 の差の小数部に q1 そして q2 。







q prime=q1\左(q−11q2\右)t







四元数の球面線形補間の一般的なビューは何ですか。 ただし、これは実際に一般的に使用される種類のSLERP方程式ではありません。



同様の式を適用して、ベクトルの四元数への球面補間を実行できます。 ベクトルの球面補間の一般的な形式は次のように定義されます。







 mathbfvt= frac sin(1−t) theta sin theta mathbfv1+ frac sint theta sin theta mathbfv2







グラフィカルに、これは次の画像に示すことができます。









四元数補間



この式は、変更せずにクォータニオンに適用できます。







qt= frac sin(1−t) theta sin thetaq1+ frac sint theta sin thetaq2







そして、角度を取得することができます \シータ スカラー積の計算 q1 そして q2 。







 beginarrayrcl cos theta&=& cfracq1 cdotq2|q1||q2|&=& cfracs1s2+x1x2+y1y2+z1z2|q1||q2| theta&=& cos−1\左( cfracs1s2+x1x2+y1y2+z1z2|q1||q2|\右) endarray







考慮すべき要素



この実装には、使用時に考慮すべき2つの問題があります。



第一に、四元数のスカラー積が負の値であることが判明した場合、補間は4次元の球で長く進みますが、これは必ずしも望ましいとは限りません。 この問題を解決するには、スカラー積の結果を確認し、それが負の場合、いずれかの方向と反対の値を取ることができます。 クォータニオンのスカラー部分とベクトル部分を反転しても、それらが表す方向は変わりませんが、これを行うことにより、回転が「最短」パスに沿って行われることが保証されます。



角度の差が q1 そして q2 とても小さい  sin theta 0になります。これが発生した場合は、  sin theta 不確かな結果を得ることができます。 この場合、次の間の線形補間の使用に戻ることができます q1 そして q2 。



分隊



SLERPを2つのクォータニオン間の補間に使用できるのと同様に、 SQUAD ( S球面および四角形のラング-球面および四角形)を使用して、回転経路に沿ったスムーズな補間を行うことができます。



四元数が多数ある場合:







q1、q2、q3、 cdots、qn−2、qn−1、qn







そして、「補助」クォータニオン( si )、これを中間制御点と見なすことができます:







si= exp left(− frac log left(qi+1q−1i right)+ log left(qi−1q−1i\右)4\右)qi







曲線の一部に沿った方向は次のように定義されます:







qi−1、qi、qi+1、qi+2







時間tでこれは次のようになります。







 mathrmsquad(qi、qi+1、si、si+1、t)= mathrmslerp( mathrmslerp(qi、qi+1、t)、 mathrmslerp(si、si+1、t)、2t(1−t))







おわりに



理解するのは困難ですが、ターンを操作する場合、四元数はオイラー行列と角度に対していくつかの明らかな利点を提供します。





ただし、クォータニオンを使用するすべての利点に加えて、いくつかの欠点もあります。





四元数を実装する数学ライブラリは多数あり、そのうちの一部のみが四元数を正しく実装しています。 私自身の経験では、四元数の高品質な実装を備えた優れた数学ライブラリはGLM (OpenGL Math Library)です。 独自のアプリケーションでクォータニオンを使用する場合は、このライブラリをお勧めします。



デモをダウンロード



クォータニオンを使用して空間内のオブジェクトを回転させるデモを作成しました。 デモはUnity 3.5.2で作成されました。このエンジンを無料でダウンロードして、デモのソースコードを表示できます。 zipファイルにはWindowsバイナリ実行可能ファイルも含まれていますが、UnityではMac用のアプリケーションもビルドできます。



quaternions.zipを理解する



参照資料



Quaternions for Computer Graphics



ビンス、J(2011)。 コンピューターグラフィックスの四元数。 1日 編 ロンドン:スプリンガー。







Dunn、F. and Parberry、I.(2002)。 グラフィックスおよびゲーム開発用の3D Math Primer。 1日 編 テキサス州プラノ:Wordware Publishing、Inc.



All Articles