QtでOpenGL - その2
GLUTによる「手抜き」OpenGL入門
を参考に多分2日目くらい。9.アニメーションまで終わった。
とりあえず立方体を三角関数使って簡単にアニメーションさせて喜べるようになりました。
関数名とかは当該ページを見れば分かるから考え方をメモ。
座標変換プロセス
- 図形の空間中の位置を決定する:モデリング変換
- 上記空間を視点から見た空間に直す:ビューイング変換(又は視野変換)
- その空間をコンピュータ内の空間にあるスクリーンに投影する:透視変換
- スクリーン上の図形をディスプレイ上の表示領域に切り出す:ビューポート変換
上記順番で各変換が行われる。
- モデリング変換はワールド座標系への各座標の配置や線を引いたりなどの3D空間への描画工程(3次元)
- ビューイング変換はワールド座標系の視点位置を変更する工程(3次元)
- 透視変換はワールド座標系を視点位置を元に正規化デバイス座標系へと変換する工程(3次元->2次元変換)
- ビューポート変換は正規化デバイス座標系をデバイス座標系へと変換する工程(2次元)
という解釈で合ってるはず。間違ってたら教えて下さい。
実際にコーディングする際は上記の各変換順序とは逆順に各関数を呼んで指定していくことになる。
モデリング変換とビューイング変換の工程は合わせて「モデルビュー変換」と呼ぶ。
このモデルビュー変換と透視変換の工程をそれぞれ独立させて変換行列を適用していくことが出来る。
- glMatrixMode(GL_PROJECTION)を指定した以降は透視変換を行う。
- glMatrixMode(GL_MODELVIEW)を指定した以降はモデルビュー変換を行う。
上記を指定しない場合はモデルビュー変換と透視変換の前後関係を意識しなければならない。
これはすごく面倒なので、必ず上記の指定をして別々に処理を行えるようにする。
QtでアニメーションさせるのってQTimer使ってシグナル送って貰うとか、タイマーイベント使う以外にもっとスマートな方法は無いのだろうか。
ちょっと調べたくらいじゃ出てこなかったけど、きっとに何かあるに違いない。