クリッピング座標

clip-coordinates.png

カメラ座標投影行列を施して得られる座標系である。
クリッピング座標の原点はカメラ位置。
変換後のクリッピング座標系では同次座標を用いた視体積内外の 判定が容易になるように射影行列を決定する。
クリップ座標はまだ、ユークリッド座標じゃなくて同次座標です

クリッピング座標ではクリッピングが行われる。

どんな風にして行われるかというと、wより大きか小さいかで行われるのだ。
クリッピングは同次座標 w を用いて

(1)
\begin{equation} -w_c<x_c,y_c,z_c<w_c \end{equation}

という条件で行われる
この条件を満たない頂点は捨てられる。
条件に満たない頂点を捨てた後、
クリッピング範囲にぴったり沿うように新しい辺を作る。

透視投影の場合

gl_projectionmatrix01.png
左の図の範囲がクリッピング範囲になる
左の図はカメラが原点のカメラ座標系である。
それを、透視投影行列を使って、
右の図のような、立方体にマッピングするのだ。
錐台の形をしていたクリッピング範囲は、±1の範囲の立方体に変形する。
カメラ座標系右手座標系だけど、
正規化デバイス座標では左手座標系になってることに注意。
ちなみに、OpenGLでは普段は右手座標系だ。
原点にあるカメラは普通はz軸の負の方向を見ている。
しかし、正規化デバイス座標ではz軸の正の方向を見ていることになるのだ。
なぜなら、glFrustum()は、nearとfarで正の値しか受け付けないからだ。(2)
\begin{pmatrix} x_{ndc}\\ y_{ndc}\\ z_{ndc}\end{pmatrix} = \begin{pmatrix} \frac{x_{clip}}{w_{clip}}\\ \frac{y_{clip}}{w_{clip}}\\ \frac{y_{clip}}{w_{clip}} \end{pmatrix}

投影行列で変換する

Viewing Volumeの役割

  • スクリーンにオブジェクトがどのように映し出されるか決める要素になる。
  • どこからどこまでを最終的な出力画像に映すのか決める。(なにをクリップアウトするか決める)

視点はどこにいったか?

視点はビューイングボリュームの終端に行ったと思って良い。
frustum.pngorthogonal.png
頂点シェーダの出力であるgl_Positionは、このクリッピング空間に出力してるのである。
モデル空間からクリッピング空間に変換することを投影変換と呼ぶ。
クリップ座標の次はwで割って正規化デバイス座標系になる。
正規化デバイス座標系から2次元の画面へ映し出すことをビューポート変換と呼ぶ。

glFrustum()

真上から見た図

clip-coordinates.png

では、ワールド座標の中心(原点)はどこにあるかというと、ビュー変換でz軸を右図のカメラ位置からずらしたところにある。
たとえば、glLookAt(0,0,5 ,0,0,0, 0,1,0)としたなら、右図の眼の場所からz軸にまっすぐ5進んだところにあるってことだ。
glTranslate(0,0,-5)しても同じ。ワールド座標の中心(原点)を決めるのは透視投影行列じゃなくてビュー行列ってこと。

gl_Positionとの関係

GLSLのgl_Positionは、nearClip面の値を変えると変わる。
なぜなら、クリップ座標の中での相対的な位置が変わるからである。
nearclipの値が大きくなると(オブジェクトに近づくと)手前にある頂点のgl_Position.zは大きい値になるのである。
下の図で赤い点は、nearClipが手前の場合の原点だとする。
猫の胸までの座標の相対位置が変わる。
と考えると、gl_Positionの座標系は、クリッピング座標というより、正規化デバイス座標だ。
gl_vertex.png


homogeneous-coordinates

サポートサイト Wikidot.com homogeneous-coordinates