正規化デバイス座標

最終更新日23 Mar 2018 14:41

normalized-device-coordinates.png

Normalized Device Coordinates
NDCと略されることもある。
空間の範囲は$-1 \leq x \leq 1, -1 \leq y \leq 1, -1 \leq z \leq 1$

ワールド座標から正規化デバイス座標の変換

    vec4 view = uViewMatrix*worldPos;
    vec4 clip = uProj*view;
    vec3 ndc = clip.xyz / clip.w;               // perspective divide

クリップ座標wで割ると正規化デバイス座標になる
クリップ座標系の各点の同次座標の x, y, z 成分を w で割った ものである。
視体積が(1)
\begin{equation} -1 <= x ,y,z <= 1 \end{equation}

となり、 透視投影変換の場合には透視投影処理がなされる。
ここから、ビューポート変換すると左上が原点で右下が(width,height)のウィンドウ座標系になる。

カメラ座標系との関係

カメラ座標系 正規化デバイス座標
x right 1
x left -1
y top 1
y bottom -1
z -near -1
z -far 1

カメラ座標から正規化デバイス座標への変換

(2)
\begin{align} カメラ座標\xrightarrow{投影変換行列}クリップ座標\xrightarrow{\div w}正規化デバイス座標 \end{align}
(3)
\begin{align} ndc_z = \frac{clip_z}{clip_w} =\frac{proj[2][2]view_z+proj[2][3]}{-view_z} =-proj[2][2] - \frac{proj[2][3]}{view_z} \end{align}

near,farで表現すると

(4)
\begin{align} ndc_z = \frac{f+n}{f-n}-\frac{fn}{(f-n)view_z} \end{align}

正規化デバイス座標からカメラ座標への変換

さっきのを式変形して逆にする

(5)
\begin{align} view_z = \frac{proj[2][3]}{ndc_z-proj[2][2]} \end{align}

near,farで表現すると

(6)
\begin{align} view_z=\frac{-2fn}{(f+n)-(f-n)ndc_z} \end{align}
Ndc

Ndc


ndc perspective-matrix viewport-matrix


ファイル

サポートサイト Wikidot.com ndcperspective-matrixviewport-matrix