[openGL, GLSL] openGL+GLSLのメモ #2 座標系
openGLとかGLSLやっていくうえで座標系がしっかり理解できてないとこの先理解できないので、
基礎的なことだけどちゃんとメモ。
座標系と変換の流れ
1. オブジェクト座標系(モデリング座標、ローカル座標)
オブジェクトの頂点や法線を表す座標系
- ▼ モデリング変換 : オブジェクト座標系をワールド座標系に変換
空間中のオブジェクトの位置を示す座標系
- ▼ 視野変換(ビューイング変換) : ワールド座標系から視点座標系への変換
空間を視点(カメラ)から見た空間へ変換した座標系。
- ▼ 射影変換 : 視点座標系からクリップ座標系への変換(オブジェクトの奥行き情報を保持する変換)
視点からの近平面と遠平面をクリッピングする座標系(たぶん)
- ▼ 遠近除算 : 遠近除算(正規化)処理をすることで、クリップ座標系から正規化デバイス座標系になる
クリップ座標系の座標 x, y, z 成分を w で割った座標系
- ▼ ビューポート変換 : 正規化デバイス座標系からウインドウ座標系への変換
表示画面に対応するピクセル単位の座標系
以下は実際のopenGLでの処理。流れは逆からになる。
ビューポート変換 5 → 6
正規化デバイス座標系からウインドウ座標系への変換
ウインドウに設定される実際の描画領域の設定
通常は表示ウインドウとビューポートのサイズを一致させて作る
void glViewport(GLint x , GLint y , GLsizei width , GLsizei height);
▼
射影変換 3 → 4, 5
視点座標系からクリップ座標系に変換
投影の設定
glMatrixMode( GL_PROJECTION ); glLoadIdentity();
射影行列を使うことを宣言してから、変換を行う
・透視投影の場合
void gluPerspective( GLdouble fovy , GLdouble aspect , GLdouble zNear , GLdouble zFar );
aspectをビューポート変換で設定した width / height に設定することで
図形の長さの比が保たれるようになる
・正射影の場合
void glOrtho( GLdouble left , GLdouble right , GLdouble bottom , GLdouble top , GLdouble near , GLdouble far );
▼
視野変換 2 → 3
ワールド座標系から視点座標系への変換
視点の設定と中心点の設定を行う
glMatrixMode( GL_MODELVIEW ); glLoadIdentity();
モデルビュー行列を使うことを宣言してから、変換を行う
void gluLookAt(GLdouble ex, GLdouble ey, GLdouble ez, GLdouble cx, GLdouble cy, GLdouble cz, GLdouble ux, GLdouble uy, GLdouble uz) //例) gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
ex, ey, ez : 視点(カメラ)の位置
cx, cy, cz : シーンの中心点
ux, uy, uz : 視体積の上方部分( 通常は 0.0, 1.0, 0.0 でおっけ)
▼
モデリング変換 1 → 2
オブジェクト座標系をワールド座標系に変換
下記の関数を利用して変換することを「アフィン変換(モデリング変換)」という
glScale*(sx, sy, sz); glRotate*(angle, ax, ay, az); glTranslate*(tx, ty, tz);
▼
オブジェクトの描画
実際に表示させるオブジェクトを描画する
参考
・OpenGL+GLSLによる画像処理プログラミング―「OpenGL」と「シェーダ言語」で「レタッチ・ソフト」の仕組みを知る! (I・O BOOKS)
・OpenGLの座標系
シェーダーむずいですね。とりあえずは基礎からしっかりとな感じで頑張ってます。








