「がんばれない」けど「がんばりたい」

ITエンジニアの仕事のこと。AI、機械学習、ディープラーニング。地頭力。車のこと。

座標変換と順序

openGLでの座標変換の種類と、 その変換順序について。

■変換順序 下の順序で行われるが、 コーディング上では、 この逆に書いて行く。

1)モデリング変換

ローカル座標系でモデリングされたものを、 ワールド座標系に配置する操作。

  • 平行移動|translate
  • 回転|rotation
  • スケーリング|scaling

2)ビューイング変換

視点(カメラ)から見た視点座標に変換する操作。 前の投稿の視点座標系にあたると思います。

gluLookAt関数で、

  • 視点の位置(ワールド座標系)
  • 注視点(ワールド座標系)
  • ビューアップベクトル

 注視点を通る平面は、投影面に平行である。  カメラの姿勢に関係なく上方向を、  この投影面の上方向とするのが、  普通らしい。  この場合ビューアップベクトルは、  (0,1,0)と指定する

3)投影変換

(プロジェクション変換) (射影変換)

ビューイング変換で得られたシーンを 投影座標系に変換する操作。 透視変換を使う場合は、 gluPerspective関数を使用する。

openGL内部では、 gluPerspective関数で作成した、 視体積をx,y,z座標がすべて[-1,1]に 正規化された正規化デバイス座標系に、 変換する。

4)ビューポート変換

正規化デバイス変換されたオブジェクトを ディスプレイに表示する操作。

コーディング上では最初に書いたように、 1)〜4)を逆に書いて行く事になる。 それは、書いた設定(コード)の内容が、 それよりも下に書いた設定すべてに影響を与えるため。

コードの例としては、こういう感じらしい。 具体的に理解する為に、時間が出来たら、 oFで検証してみよう。

1.ビューポート変換

glViewport(x, y, w, h);

2.投影変換

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

この2行で、今から投影座標を行う事を宣言し、

gluPerspective(fovy, aspect, zNear, zFar);

によって透視投影を行う。

3.ビューイング変換

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

この2行で以下の演算がモデルビュー座標変換である事を宣言する。 gluLookAt(vx, vy, vz, cx, cy, cz, ux, uy, uz);

4.モデリング変換

glTranslate(); glRotate(); glScale();

ここでglMatrixModeを行っていないのは、 モデリング変換で使う行列が、 ビューイング変換で使用したGL_MODELVIEW行列(モデルビュー行列) と同じなため。