座標変換 (transformation)

 座標変換には,アフィン変換(affine transformation)や投影変換(projective transformation)などがあります。アフィン変換では,線分の直線性は保たれ,線分の始点と終点の距離も保存され,線分同士の平行性なども維持されます。一方,投影変換では,線分の直線性は保たれますが,線分の始点と終点の距離や線分同士の平行性は保存されません。アフィン変換は投影変換の特殊な場合になります。

 ここで,三次元空間の任意の点P0(x0,y0,z0)を点P1(x1,y1,z1)に変換することを考えると,点P0と点P1の関係は,以下のようになります。

        x1 = ax0 + dy0 + gz0 + l
        y1 = bx0 + ey0 + hz0 + m
        z1 = cx0 + fy0 + iz0 + n

ただし,それぞれの係数の行列式(determinant)の値は fig010.gif ≠ 0 とします。これを行列(matrix)を使って表現し直すと,

        fig020.gif

になります。それぞれの行列を転置して,縦形式を横形式に書き改めてみましょう。

        [x1 y1 z1] = [x0 y0 z0] fig030.gif + [l m n]

 座標変換を行列で表現する場合には,上記の縦形式と横形式の二通りあり,数学的な教科書では,縦形式(列ベクトル)で扱うことが多く,工学的(実務的)な教科書では,横形式(行ベクトル)で扱うことが多いようです。本書では横形式を採用します。文章中において縦形式よりも横形式が書きやすいこと,点が複数の変換行列によって順次変換されていく様子が表現しやすいことなどが,横形式を採用した理由です。

 したがって,座標変換行列を表現しているJunTransformationのサブクラス群(Jun3dTransformation, Jun2dTransformation)の要素(インスタンス変数)の並びは,すべて横形式に対応しています。縦形式の行列の転置行列になっていることに注意してください。

 また,本書では右手座標系(right hand coordinate system)を採用します。広げた右手の親指をX軸の正方向に取ると,残りの指の方向がY軸の正方向になり,手の平(内側の面)が向いている方向がZ軸の正方向になります。

fig040.gif

 軸の回転の方向は,その軸の正方向が自分に向かってくるように見た際に,反時計回り(CCW: counterclockwise rotation)になります。ちょうど右手の親指方向を軸の正方向に合わせた際に,その他の指が回り込む方向になります。

fig050.gif Face.jpg

 ここで,同次座標(homogeneous coordinate)を導入しましょう。前述の行列表現は,行列の積と和の形をしています。第二項の[l m n]も行列の積で表すことができれば,とても都合が良くなります。変換行列を3×3から,4×4の行列に拡張して,一次元追加した同次座標を考えます。

        [x1 y1 z1 1] = [x0 y0 z0 1] fig060.gif

 点P0と点P1の位置ベクトル[x0 y0 z0 1]と[x1 y1 z1 1]をP0P1とし,変換行列をTとすれば,座標変換は下記の式で表されます。

        P1 = P0T

 同次座標を使用することによって,拡大・縮小(scaling),平行移動(translation),回転(rotation),せん断(shearing),投影(projection)など,すべての座標変換が,行列の積の形で表現きるようになります。

参照 (see also)


1997年11月06日 文責: 青木 淳