数学をとらなかった人の為の3D数学 その4:概要2

行列(Matrix)

前回、行列とはベクトルを座標変換するものであると書いたが、具体的にどうか。


ある数nと分数1/mを考える。
分数1/mは、そのまま1/mという数を表現するものであるが、nを1/mする数でもある。
ここで、ある数nを1Dベクトルとして見れば、分数1/mは行列と同じ作用(座標変換)をしていないだろうか。
そう考えると、分数1/mは行列なのである。


N次元ベクトルの座標変換に必要な情報はNの2乗個なので、分数1/mは1x1行列ということになる。



逆に考えると、行列は算数で学んだ分数と、何ら変わらないものなのである。
分数とは数であり、数を座標変換するものである。
行列とはベクトルであり、ベクトルを座標変換するものである。


4Dプログラミング(4x4行列を使う理由)

3Dプログラミングで3x3行列ではなく主に4x4行列を使うのは、使用する座標系が、実は4次元だからである。
そう、世の中の3Dプログラマーは4Dプログラミングをしているのである。


1次元座標は「2次元座標のY軸に無数にある1次元座標(X軸)の1つ」を切り取ったもの、
2次元座標は「3次元座標のZ軸に無数にある2次元座標(XY平面)の1つ」を切り取ったもの、
3次元座標は「4次元座標のW軸に無数にある3次元座標(XYZ空間)の1つ」を切り取ったもの と考える(射影)。
Direct3DOpenGLでは、W軸成分は1で固定されている。
つまり4次元座標のw=1の部分を切り取った3次元座標と考え、3Dベクトルで表現できるのである。


勿論、演算時は4Dベクトルとして計算されて、最後に3Dベクトルに戻る。
3Dベクトルとして使う4Dベクトルを実装した3Dベクトルクラスは GDKのDraw3D/Vector3.h を見ていただきたい。
(TransformCoordや、オーバーライドされた*, *=演算子


軸成分配列[x,y,z,w,...]の上で、n行目のm列の値kは 軸成分[n]をk×軸成分[m]分 平行移動させる。
よって4Dベクトルを作れば、x,y,zの平行移動の倍率をw成分で設定することができる。
逆に考えると、w=1に射影すると平行移動の倍率が1になり、都合がよいのである。
(本来3次元の平行移動をするならば、それは6Dベクトルと6x6行列で表されるべきかもしれない。詳しくは別項。)


以上を簡単に言うと、多くの3Dプログラミング解説書にある「平行移動を表現する為に3x3行列に無理矢理1行1列を加えた」に帰結するものではあるが。
こういう事を考えてみるのもたまには面白いかもしれない。