1-8 座標変換其の参


 

fuck you…ぶち殺すぞ…ゴミめ

利根川幸雄(ホールマスター)



1.平行移動

 前回までのお話で向きは自由に決められるようになったかと思います。なれ。
今度は位置でも動かしてみましょう。とりあえず2Dの図を。

(図1-8.1)

回転のときと同様に、'{ O'; X' Y' }から倍 O; X Y }への変換は
回転と平行移動を表すということが分かります。この変換を行うには、
'の軸を行ベクトルとした回転行列Mrotと'の原点を表す位置ベクトルO'()を用いて

P() = P(')Mrot + O'()

としてやればいいわけです。おしまい。


…とここで行列再び。しかも4次正方行列にパワーアップしています。
つられてベクトルも4次元になりました。
4次行列Mの3×3の部分はMrotと同じで、3行0〜2列にはO'()を突っ込みます。
3列目は( 0 0 0 1 )とします。ベクトルの4次元目の要素は1にします。
ではこいつらの積を計算してみましょう。

(式1-8.1)

最後のベクトルは見やすくするため列ベクトルで表記しています。
さてこの結果なんですが、最後の1をとりあえず無視すればPMrot + O'と同じ結果になっています。
つまりこの4次行列は、原点の違いも含めた座標変換を表していることになります。ぉぉすげぇ。
以後、この手の行列を回転平行移動行列と呼ばせてもらうことにし、
回転平行移動行列の回転を表す3×3の部分を回転部、平行移動を表す3行0〜2列を
平行移動部と名づけさせていただきます。(勝手に呼んでるだけです。念のため。)
ちなみに平行移動部を0にすれば回転のみを、回転部を単位行列の形にすれば
平行移動のみを表す行列になります。回転平行移動行列も掛け合わせて結合することが出来ます。
例えば(式1-8.1)の回転平行移動行列自体も回転行列MRと平行移動行列MTの積

(式1-8.2)

であるともいえます。ちなみに掛ける順番を入れ替えてMTMRとすると
平行移動してから回転を行うという処理になり、結果が異なります。
もちろん両方の行列が回転と平行移動を含んでいてもかまいません。この場合、
左の行列の回転->平行移動->右の行列の回転->平行移動 の順で適用されます。

 では回転平行移動の逆変換はどうなるでしょうか。
まじめに逆行列を求めてもいいのですが、この場合はもうちょっと簡単にできます。
まず回転部については回転行列と同様に転置でOKです。で、平行移動部分は逆変換なので-O'。
だけでは駄目です。回転してから平行移動するという処理になるので、平行移動分を加算するときには
変換対象の向きは既に'に変換済みです。したがって-O'も'の向きに変換してやる必要があります。
…われながらいいかげんな説明だ。
結局、回転平行移動行列とその逆行列は、

(式1-8.3)

となります。


さて有無を言わさずでてきた4次元のベクトルなんですが、これは同時座標といわれるもんなんです。
追加した4次元目の要素をw座標とよびます。上の説明では4次行列を掛けた後
wを無視して3次元としてたんですが、ホントはwで各要素を除算してやる必要があります。
また、3次元ベクトルが自由ベクトルの場合、w=1ではなくw=0としてから変換します。
こうすることで平行移動部分が無視されます。このときは変換結果のwも0になるので
wによる除算は行わず、そのまま3次元に戻してかまいません。
なんか3次元の自由ベクトルは同時座標では無限遠の点というような解釈になるそうです。


 3次元ベクトルを4次行列で変換するD3DXの関数は

D3DXVec3Transform
D3DXVec3TransformCoord
D3DXVec3TransformNormal

の3種類がありやがりますが、これはさっきの話と関連してきます。
Transformは3次元ベクトルをw=1として4次行列で変換し、結果を同時座標のまま(4次元ベクトルで)返します。
TransformCoordはw=1として変換するまでは同じですが、結果をwで除算して3次元にして返します。
TransformNormalはw=0として変換して結果を3次元で返します。つまり自由ベクトルの変換に使います。
w=1として回転平行移動行列で変換した場合、結果のwは必ず1となるので、
wで除算するのは無駄無駄無駄ァですね。Transformで変換して3次元にコピーするのもあれなんで、
専用の関数を作ったほうが良いかもしれません。


2.スケーリング

 スケーリングを表す行列は

(式1-8.4)

となります。
この行列は(0 0 0)を中心としたスケーリングを表していることに注意してください。
例えば(0 0 0)を中心とした半径1の球があったとします。
これに2倍のスケーリング(Sx=Sy=Sz=2)をかけて(1 0 0)に平行移動させると
結果は(1 0 0)を中心とした半径2の球になりますが、平行移動してからスケーリングをかけると
(2 0 0)を中心とした半径2の球となります。
スケーリング->回転->平行移動の順番で変換するのが最も結果がわかりやすいと思います。


目次に戻る
1-9座標変換其の四