ブログトップ 記事一覧 ログイン 無料ブログ開設

SofiyaCatのプログラム日記 このページをアンテナに追加 RSSフィード


[描画エンジン] [群集]

2011-04-17 クォータニオン

クォータニオンから行列

q=(w;x,y,z) w:実数x,y,z:虚数

多分DirectXのにゃつ

 

¥begin{pmatrix} w &z &-y &-x ¥¥ -z &w &x &-y ¥¥ y &-x &w &-z ¥¥ x &y &z &w ¥end{pmatrix} ¥begin{pmatrix} w &z &-y &x ¥¥ -z &w &x &y ¥¥ y &-x &w &z ¥¥ -x &-y &-z &w ¥end{pmatrix} ¥¥ = ¥begin{pmatrix} w^2-z^2-y^2+x^2 &wz+zw+yx+xy &-wy+zx-yw+xz &xw+zy-yz-xw ¥¥ -wz-wz+xy+xy &-z^2+w^2-x^2+y^2 &zy+wx+xw+yz &-xz+wy+xz-yw ¥¥ yw+xz+wy+zx &yz-xw-xw+zy &-y^2-x^2+w^2+z^2 &xy-xy+wz-zw ¥¥ xw-yz+zy-xw &zx+yw-xz-yw &-xy+xy+zw-wz &x^2+y^2+z^2+w^2 ¥end{pmatrix} ¥¥ = ¥begin{pmatrix} 1-2y^2-2z^2 &2xy+2zw &2xz-2yw &0 ¥¥ 2xy-2zw &1-2z^2-2x^2 & 2xw+2yz &0 ¥¥ 2xz+2yw &2yz-2xw &1-2x^2-2y^2 &0 ¥¥ 0 &0 &0 &1 ¥end{pmatrix} *1

ただしx^2+y^2+z^2+w^2=1

 

GLにゃへ

 

(AB)^t=B^tA^tより

¥begin{pmatrix} 1-2y^2-2z^2 &2xy-2zw &2xz+2yw &0 ¥¥ 2xy+2zw &1-2z^2-2x^2 &2yz-2xw &0 ¥¥ 2xz-2yw &2xw+2yz &1-2x^2-2y^2 &0 ¥¥ 0 &0 &0 &1 ¥end{pmatrix} ¥¥ = ¥begin{pmatrix} w &-z &y &-x ¥¥ z &w &-x &-y ¥¥ -y &x &w &-z ¥¥ x &y &z &w ¥end{pmatrix} ¥begin{pmatrix} w &-z &y &x ¥¥ z &w &-x &y ¥¥ -y &x &w &z ¥¥ -x &-y &-z &w ¥end{pmatrix}

GLにゃの回転にゃは多分qpq^**2

q^*pqっていうにゃもあるにゃけど、多分、座標系にゃの違いにゃかにゃ。

クォータニオンの合成

q_2にゃでぐりぐり回転して、次にq_1にゃでうにゃうにゃ回転にゃの合成にゃはq_1q_2

クォータニオン+平行移動

クォータニオンで回転してそにょ後平行移動させるにゃ〜って変換にゃの合成にゃは、回転と平行移動にゃをわけて計算にゃ。

変換1(q_1で回転してt_1で平行移動)、変換2(q_2で回転してt_2で平行移動)。

変換2の後に変換1にゃをする合成にゃは、回転:q_1q_2、移動:q_1t_2q_1^* + t_1って感じにゃににゃるですにゃ。

// 脳内擬似コード
struct QuatTrans {
 Quat q;
 Vec3 t;
};
quatTrans12.q = quatTrans1.q * quatTrans2.q;
quatTrans12.t = quatTrans1.q * quatTrans2.t * quatTrans1.q.conjugate() + quatTrans1.t;

*1w^2-z^2-y^2+x^2=(x^2+y^2+z^2+w^2)-2y^2-2z^2=1-2y^2-2z^2

*2q^*にゃはqの共役 q=(w;x,y,z)ときq^* = (w;-x,-y,-z)