/*THK Analytics用解析タグ*/

GLUTを使わないOpeGL超入門_04【ビューポート】

2023年1月22日

前回は立方体の塗りつぶしを行いました。
view_cube関数で縦横0.5の正立方体を定義したはずなのに長方形に表示されていたと思います。
またウインドウサイズを変更するとそれに伴い縦横比が変わってしまいます。
ビューポート変換を行う事で、正しい比率の描画を行う事が出来ます

 

ビューポート変換

ざっくりですが、座標変換はモデル毎に決まる座標系(例えばティーカップの中心を原点とするなど)、それが3次元空間のどこにあるかを示すワールド座標系。
ワールド座標系のデータを(-1,-1,-1)~(1,1,1)のデータ範囲に収まるようにした正規化座標系、さらに表示デバイスにピクセルデータに変換したデバイス座標系があります。
(他にも視点座標系やクリップ座標系がありますが説明は割愛)

この中で正規化座標系からウインドウ座標系に変換する作業をビューポート変換と呼びます。

 

サンプルソースコード

このような画像が作成されれば成功です。
ウインドウの拡大縮小などを行ってみて下さい。
サイズは変わりますが縦横の比率は同じはずです。

解説

基本的にはopengl_view関数を書き換えています。
最初に画面サイズの取得を行っています。
これはビューポート設定に画面サイズが必要なためです。

glViewport(0,0,w,h);
ビューポート設定関数。画面サイズ全面を描画領域としています。

glMatrixMode(GL_PROJECTION);
ビューポートと直接関係ありませんが、遠くの物が小さく見える視野変換を行っています。

glLoadIdentity();
変換行列の初期化を行っています。

gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);
視界を設定しています。
最初の30は視野角で30°の視野角を設定しています。
次のパラメータは縦横比になります。
1.0は一番近いZ位置、100は一番遠いZ位置を示します。

glTranslated(0, 0, -5);
ユーザー視点になります。ここではxとyを0として、z方向に-5、つまり後ろに下がった位置を視点としています。

glEnable(GL_DEPTH_TEST);
隠面消去とよばれる深度テストの有効化です。
これによる手前のデータで奥のデータが見えないようにコントロールします。
ちなみにこの行をコメントアウトすると立方体上面の白が見えてしまいます。

サンプルソース全文

 

OpenGL関連記事一覧

GLUTを使わないOpeGL超入門_01【Visual Studio設定】
GLUTを使わないOpeGL超入門_02【立方体の表示】
GLUTを使わないOpeGL超入門_03【立方体の塗りつぶし】
GLUTを使わないOpeGL超入門_04【ビューポート】
GLUTを使わないOpeGL超入門_05【移動・回転】
GLUTを使わないOpeGL超入門_06【視点移動(球面上をなぞる)】

 

 Visual studio関連書籍