同次座標の説明と3次元座標と相互変換する方法

同次座標について利用する観点からの説明と、通常の3次元座標と相互変換する方法について書いています。

同次座標とは

同次座標とは、利用する立場からの観点で言うと、理屈はさておき3次元空間の座標を4次元ベクトルで表現したものという認識でいいと思います。 同次座標を使うと無限遠点(位置を持たず方向のみを表す)の表現や4x4行列による変換が可能になります。

例えば、オブジェクトの位置など3次元空間の座標を4x4行列で変換するときに、座標点を(x,y,z,w)のように4次元ベクトルで与えますが、これが座標点を同次座標で表現したものです。そして、それを行列で変換した結果も同次座標になります。 ベクトルを行列で変換することについては「行列とベクトルの積・行列と行列の積の説明」で説明しています。

一般的なプログラムで利用する観点からは、通常の3次元空間と同次空間の関係が分かっていれば(座標を相互に変換できれば)十分だと思います。

同次座標と3次元座標の相互変換

以降、各座標を次のように表記します:

  • 3次元座標
    (xyz)\begin{pmatrix}x & y & z\end{pmatrix}
  • 同次座標
    (xyzw)\begin{pmatrix}x & y & z & w\end{pmatrix}

3次元座標を同次座標に変換

座標点(変換行列の平行移動の影響を受ける)として扱う場合:

xx, yy, zz はそのまま、ww に 1 を代入します。

(xyz1)=(xyz)\begin{pmatrix}x & y & z & 1\end{pmatrix} = \begin{pmatrix}x & y & z\end{pmatrix}

無限遠点・方向(変換行列の平行移動の影響を受けない)として扱う場合:

xx, yy, zz はそのまま、ww に 0 を代入します。

(xyz0)=(xyz)\begin{pmatrix}x & y & z & 0\end{pmatrix} = \begin{pmatrix}x & y & z\end{pmatrix}

同次座標を3次元座標に変換

w0w \ne 0 (座標点)の場合:

xx, yy, zzww で割った値を代入します。

(xwywzw)=(xyzw)\begin{pmatrix}\frac{x}{w} & \frac{y}{w} & \frac{z}{w}\end{pmatrix} = \begin{pmatrix}x & y & z & w\end{pmatrix}

w=0w = 0 (無限遠点・方向)の場合:

xx, yy, zz を代入し、方向ベクトルとして扱います。

(xyz)=(xyz0)\begin{pmatrix}x & y & z\end{pmatrix} = \begin{pmatrix}x & y & z & 0\end{pmatrix}

結果が単位ベクトルであるとは限らないので必要に応じて正規化します。