スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

クォータニオンを少し理解してみよう

書くことがなかったので昔調べたクォータニオンを使った軸回転について書いてみる。

クォータニオンの前に複素数をおさらい

実数   :普段使っている数、頭に浮かぶからかわいいやつ
虚数   :2乗したらマイナスになる数(iを使って表す)この世界にないわけで想像することすらできない
複素数  :実数と虚数が混ざった数(2+3iといった感じで表す 実数と虚数は計算し合えないので困る)
複素共役:2+3i と 2-3iの様な関係

軸回転に必要なものは以下
・回転させたい座標
・軸(単位ベクトルにノーマライズしてあるもの)
・クォータニオン
・共役クォータニオン


クォータニオンQは
実数t
虚数i, j, k
Q = t + xi + yj + zk
と表せる
虚数i,j,kの関係は
i*i = j*j = k*k = -1

ここまではいいんだけどお互いに絡み合ってて(別にここは理解しなくてもいいかも)
i*j=k  
j*k=i
k*i=j

掛ける順序が逆だと符号が反転
j*i=-k  
k*j=-i
i*k=-j

となる。

と言うことは掛ける順とか気をつけないとだめだね。
あとi,j,kは虚数同士といえども計算がまとめられない、こまったやつらだ。

これを
Q = (t; x, y, z)
と表したり、
(x,y,z)をベクトルVとして
Q = (t; V)
と書ける。

xnaで4元数は
Vector4(x,y,z,w)
で扱う。(Quaternion構造体はちゃんと用意されてる)


クォータニオンAとBの掛け算で求めるCは面倒な計算を経て
A = (a; V1) 
B = (b; V2)
C = ( ab - dot(V1,V2) ; aV2 + bV1 + cross(V1,V2) )

となる
書き換えると
w = A.w * B.w - dot(A.xyz, B.xyz)
xyz = (B.xyz * A.w) + (A.xyz * B.w) + cross(A.xyz, B.xyz)


Q = (t; x, y, z)

の共役クォータニオンQ'は
Q' = (t; -x, -y, -z)

となる
よって
Q*Q' 
= ( t; V ) * ( t; -V )
= ( t^2 - dot(V, -V); -tV + tV + cross(V , -V) )
= ( t^2 - |V||V|cos180 ; 0 )
= t^2 + |V|^2
= Q*Q

の関係になる。

~実際に回転させてみる~
開始位置P = (0; V)
軸=単位ベクトル(X,Y,Z)を使って角度θ回転させたい時
作成するクォータニオンは
Q = (cos(θ/2); X*sin(θ/2), Y*sin(θ/2), Z*sin(θ/2))
となり
順回転後の座標=Q'*P*Q 
逆回転後の座標=Q*P*Q'

となる。
P.wが0なので求める実数部分が0になる。
共役クォータニオンにより虚数部分は実数となる。


どこか間違ってたらすいません。
ねよっと。

コメントの投稿

非公開コメント

プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。