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


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

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

i2=j2=k2=ijk=1




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

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

内容



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

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

はじめに


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

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

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

複素数


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

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

x2+1=0


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

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

虚数は次のとおりです。

i2=1


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

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

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

z=a+bi  ab in mathbbR  i2=1


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

複素数の加算と減算


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

追加:

a1+b1i+a2+b2i=a1+a2+b1+b2i


減算:

a1+b1ia2+b2i=a1a2+b1b2i


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


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

 lambdaa+bi= lambdaa+ lambdabi


複素数の積


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

 beginarrayrclz1=a1+b1iz2=a2+b2iz1z2=a1+b1ia2+b2i=a1a2+a1b2i+b1a2i+b1b2i2=a1a2b1b2+a1b2+b1a2i endarray


複素数の二乗


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

 beginarrayrclz=a+biz2=a+bia+bi=a2b2+2abi endarray


共役複素数


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

 beginarrayrclz=a+biz=abi endarray


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

 beginarrayrclz=a+biz=abizz=a+biabi \&=a2abi+abi+b2=a2+b2 endarray


複素数の絶対値


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

 beginarrayrclz=a+bi|z|= sqrtzz= sqrta+biabi= sqrta2+b2 endarray


2つの複素数の商


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

 beginarrayrclz1=a1+b1iz2=a2+b2i cfracz1z2= cfraca1+b1ia2+b2i= cfraca1+b1ia2b2ia2+b2ia2b2i= cfraca1a2a1b2i+b1a2ibi2a22+b22= cfraca1a2+b1b2a22+b22+ cfracb1a2a1b2a22+b22i endarray


学位 i


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

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


このシリーズを記録し続けると、パターンに気付くでしょう 1i1i1\ド

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

 beginarrayrcri0=1i1=ii2=1i3=ii4=1i5=ii6=1 endarray


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


デカルト平面

複雑な飛行機


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


複雑な飛行機

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

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

p=2+i


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

 beginarrayrclp=2+iq=pi=2+ii=2i+i2=1+2i endarray


掛け算 qi 私たちは得る r

 beginarrayrclq=1+2ir=qi=1+2ii=i+2i2=2i endarray


そして、乗算 ri 私たちは得る s

 beginarrayrclr=2is=ri=2ii=2ii2=12i endarray


そして、乗算 si 私たちは得る t

 beginarrayrcls=12it=si=12ii=i2i2=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 thetaa prime+b primei=a cos thetab sin theta+a sin theta+b cos thetai\終


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

 beginbmatrixa primeb primeb primea prime endbmatrix= beginbmatrix cos theta sin theta sin theta cos theta endbmatrix beginbmatrixabba endbmatrix


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

四元数


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

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

q=s+xi+yj+zk  sxyz in mathbbR


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

i2=j2=k2=ijk=1



 beginarraycccij=kjk=iki=jji=kkj=iik=j endarray


の関係に気づくかもしれません ij そして 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


ハミルトンはまた、その虚数 ij そして 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=[sx mathbfi+y mathbfj+z mathbfk]  sxyz in mathbbR


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

四元数の加算と減算


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

 beginarrayrclqa=[sa mathbfa]qb=[sb mathbfb]qa+qb=[sa+sb mathbfa+ mathbfb]qaqb=[sasb mathbfa mathbfb] endarray


クォータニオン作品


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

 beginarrayrclqa=[sa mathbfa]qb=[sb mathbfb]qaqb=[sa mathbfa][sb mathbfb]=sa+xai+yaj+zaksb+xbi+ybj+zbk=sasbxaxbyaybzazb+saxb+sbxa+yazbybzai+sayb+sbya+zaxbzbxaj+sazb+sbza+xaybxbyak end


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

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


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

 beginarrayrcl[sa mathbfa][sb mathbfb]=sasbxaxbyaybzazb[1 mathbf0]+saxb+sbxa+yazbybza[0 mathbfi]+sayb+sbya+zaxbzbxa[0 mathbfj]+sazb+sbza+xaybxbya[0 mathbfk] endarray


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

 beginarrayrcl[sa mathbfa][sb mathbfb]=[sasbxaxbyaybzazb mathbf0]+[0saxb+sbxa+yazbybza mathbfi]+[0sayb+sbya+zaxbzbxa mathbfj]+[0sazb+sbza+xaybxbya mathbfk] endarray


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

 beginarrayrcl[sa mathbfa][sb mathbfb]=[sasbxaxbyaybzazb mathbf0]+[0saxb mathbfi+yb mathbfj+zb mathbfk+sbxa mathbfi+ya mathbfj+za mathbfkyazbybza mathbfi+zaxbzbxa mathbfj+xaybxbya mathbfk] endarray


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

 beginarrayrcl[sa mathbfa][sb mathbfb]=[sasbxaxbyaybzazbsaxb mathbfi+yb mathbfj+zb mathbfk+sbxa mathbfi+ya mathbfj+za mathbfk+yazbybza mathbfi+zaxbzbxa mathbfj+xaybxbya 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=yazbybza mathbfi+zaxbzbxa mathbfj+xaybxbya mathbfk endarray


取得するもの:

[sa mathbfa][sb mathbfb]=[sasb mathbfa cdot mathbfbsa 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+0ia2+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 textwherev=| mathbfv| textand| mathbf hatv|=1


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

 beginarrayrclq=[0 mathbfv]=[0v 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 mathbfvs 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 mathbfj4 mathbfk]


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

 beginarrayrcl|q|= sqrt12+42+42+42= sqrt49=7 endarray


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

 beginarrayrclq prime= cfracq|q|[1.0em]= cfrac1+4 mathbfi+4 mathbfj4 mathbfk7[1.0em]= cfrac17+ cfrac47 mathbfi+ cfrac47 mathbfj cfrac47 mathbfk endarray


逆四元数


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

q1= fracq|q|2


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

qq1=[1 mathbf0]=1


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

qqq1=q


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

 beginarrayrcl|q|2q1=qq1= cfracq|q|2 endarray


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

q1=q


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


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

 beginarrayrclq1=[s1x1 mathbfi+y1 mathbfj+z1 mathbfk]q2=[s2x2 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 mathbfps mathbfp+ lambda mathbf hatv times mathbfp] endarray


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

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

p prime=[0s 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


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

 beginarrayrclp prime=qp=[ cos thetasin 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 cdot2 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 、結果は純粋な四元数になり、ベクトル成分のノルムが保持されます。 この例でこれを適用できるかどうか見てみましょう。

まず、計算しましょう q1

 beginarrayrclq= left[ cos theta sin theta left frac sqrt22 mathbfi+ frac sqrt22 mathbfk right right]q1= left[ cos theta sin theta left frac sqrt22 mathbfi+ frac sqrt22 mathbfk right right] endarray


 theta=45 circ 私達は得る:

 beginarrayrclq1= left[ frac sqrt22 frac sqrt22 left frac sqrt22 mathbfi+ frac sqrt22 mathbfk right right]= frac12\左[ sqrt2 mathbfi mathbfk\右] endarray


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

 beginarrayrclqp= left[1 sqrt2 mathbfi+ mathbfj right]qpq1=\左[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 から q1t=0 前に q2t=1

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

 mathbfp prime= mathbfp1+t mathbfp2 mathbfp1


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


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

四元数の差


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

\デq=q11q2


四元数を累乗する


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

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

qt= expt logq


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

 beginarrayrcl expq= 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= exp0 logq= exp[ cos0 sin0 mathbf hatv]= exp[1 mathbf0]=[1 mathbf0] endarray


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

 beginarrayrclq1= exp logq=q endarray


四元数の分数差


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

q prime=q1\左q11q2\右t


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

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

 mathbfvt= frac sin1t theta sin theta mathbfv1+ frac sint theta sin theta mathbfv2


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


四元数補間

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

qt= frac sin1t theta sin thetaq1+ frac sint theta sin thetaq2


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

 beginarrayrcl cos theta= cfracq1 cdotq2|q1||q2|= cfracs1s2+x1x2+y1y2+z1z2|q1||q2| theta= cos1\左 cfracs1s2+x1x2+y1y2+z1z2|q1||q2|\右 endarray


考慮すべき要素


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

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

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

分隊


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

四元数が多数ある場合:

q1q2q3 cdotsqn2qn1qn


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

si= exp left frac log leftqi+1q1i right+ log leftqi1q1i\右4\右qi


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

qi1qiqi+1qi+2


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

 mathrmsquadqiqi+1sisi+1t= mathrmslerp mathrmslerpqiqi+1t mathrmslerpsisi+1t2t1t


おわりに


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


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


四元数を実装する数学ライブラリは多数あり、そのうちの一部のみが四元数を正しく実装しています。 私自身の経験では、四元数の高品質な実装を備えた優れた数学ライブラリは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.

Source: https://habr.com/ru/post/J426863/


All Articles