左手座標系と右手座標系間の変換

各種変換

メッシュの変換


あるn次元空間に頂点Va=(Va1,Va2・・・Van)が存在し、ある正規直行基底Ba={Ba1,Ba2・・・Ban}に対する表示形式で書かれているとします。
これを別の正規直行基底Bbに変換する事にし、変換後の頂点をVbと称することにします。

Ba・Va=Bb・Vbであるから、Vb=(Bb^-1)Ba・Va=(Bb^t)Ba・Va
n=3で、Baを右手系とし、Bbを左手系とし、第1軸と第2軸を一致させたとすれば、B=(Bb^t)・Ba={Bij|Bij=Ai*δij、A=(1,1,-1)}となるから、Vb=(Va1,Va2,-Va3)となる。

演算子の変換


あるn次正方行列演算子のBa基底に対する表示Maと、Bb基底に対する表示Mbを考える。

BaMa・Va = BbMb・Vbであり、Va=(Ba^t)Bb・Vbだから
(Bb^t)BaMa・Va = Mb・Vb
(Bb^t)BaMa(Ba^t)Bb・Vb = Mb・Vb
よって、Mb = (Bb^t)BaMa(Ba^t)Bb = BMa(B^t)

例に有ったような「X軸に対して右手系の方向にθ回転させる変換行列」を考える。
c = cosθ
s = sinθ

右手系の場合
{ +1 +0 +0 +0 }
{ +0 +c -s +0 }
{ +0 +s +c +0 }
{ +0 +0 +0 +1 }

左手系の場合
{ +1 +0 +0 +0 }
{ +0 +c +s +0 }
{ +0 -s +c +0 }
{ +0 +0 +0 +1 }

であり、
B=
{ +1 +0 +0 +0 }
{ +0 +1 +0 +0 }
{ +0 +0 -1 +0 }
{ +0 +0 +0 +1 }
だから、

{ +1 +0 +0 +0 }{ +1 +0 +0 +0 }{ +1 +0 +0 +0 }
{ +0 +1 +0 +0 }{ +0 +c -s +0 }{ +0 +1 +0 +0 }
{ +0 +0 -1 +0 }{ +0 +s +c +0 }{ +0 +0 -1 +0 }
{ +0 +0 +0 +1 }{ +0 +0 +0 +1 }{ +0 +0 +0 +1 }
=
{ +1 +0 +0 +0 }{ +1 +0 +0 +0 }
{ +0 +c -s +0 }{ +0 +1 +0 +0 }
{ +0 -s -c +0 }{ +0 +0 -1 +0 }
{ +0 +0 +0 +1 }{ +0 +0 +0 +1 }
=
{ +1 +0 +0 +0 }
{ +0 +c +s +0 }
{ +0 -s +c +0 }
{ +0 +0 +0 +1 }

たしかに変換されている事がわかる。

列ベクトルと行ベクトルの変換


OpenGLは列ベクトル、DirectXは行ベクトル
ブラ・ケット記法を使うならば、OpenGLでのベクトルVは|V>
DirectXでのベクトルVは<V|

行列に演算させる時は、
OpenGL:|M|V>
DirectX:<V|M|

よって、演算子M1の後にM2なる演算を行う場合は
OpenGL:|M2|M1|V>
DirectX:<V|M1|M2|

平行移動値の変換


Ta=(Ta1,Ta2,Ta3)という右手系での平行移動表示があるとする。
この平行移動値は行列
{ +1 +0 +0 +Ta1 }
{ +0 +1 +0 +Ta2 }
{ +0 +0 +1 +Ta3 }
{ +0 +0 +0 +1 }
と同等。

演算子の変換での議論より左手系での演算子の形は
{ +1 +0 +0 +Ta1 }
{ +0 +1 +0 +Ta2 }
{ +0 +0 +1 -Ta3 }
{ +0 +0 +0 +1 }
だから、Tb=(Ta1,Ta2,-Ta3)

回転値(オイラー角)の変換


Ra=(Ra1,Ra2,Ra3)という右手系におけるオイラー角表示が有るとする。
それぞれのRakは「第k軸に対して右手系の方向に回転する量」という意味を持つ。

少し考えればわかるが、行列表示して左手系に変換し、その各項を比べる事により
Rb=(-Ra1,-Ra2,Ra3)となることが分かる。

回転値(クオータニオン)の変換


Qa=(θ,V)とすれば、Qb=(-θ,V)

拡大縮小値の変換


Saという右手系におけるスケーリング値があるとする。
演算子の変換より明らかにSb=Sa
2005年12月17日(土) 13:52:16 Modified by atushiinliv




スマートフォン版で見る