■ 2005年06月11日 [OpenGL][テクスチャ] 第17回 部屋の中心であたりを見回す
2005年06月18日 22:01更新
箱の中に入ってみる
前回はキューブマッピングに使ったテクスチャを立方体の6面に貼り付けました.そこで,今回は前回作ったプログラムを雛形にして,その箱の中に入ってみようと思います.何が見えるかな?
箱を大きくする
箱の中に入るというより,箱をデカくして,視点が箱に含まれるようにしてみます.
・・・ /* ** シーンの描画 */ static void scene(void) { static const GLfloat color[] = { 1.0, 1.0, 1.0, 1.0 }; /* 材質 (色) */ /* 材質の設定 */ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color); /* テクスチャマッピング開始 */ glEnable(GL_TEXTURE_2D); /* トラックボール処理による回転 */ glMultMatrixd(trackballRotation()); /* 箱を描く */ box(50.0, 50.0, 50.0); /* テクスチャマッピング終了 */ glDisable(GL_TEXTURE_2D); } ・・・
なんだか暗いので,テクスチャが陰影に影響されないように,テクスチャ環境を GL_MODULATE から GL_REPLACE に変更します.
・・・ /* ** 初期化 */ static void init(void) { ・・・ /* テクスチャを拡大・縮小する方法の指定 */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); /* テクスチャの繰り返し方法の指定 */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); /* テクスチャ環境 */ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); ・・・
箱の中心から見てみる
そして,視点をこの箱の中心に移動します.視点はもともと Z 軸の正の方向にずらしていた(実際には,物体の方を Z 軸の負の方向にずらしていた)ので,この部分を無効にします.
・・・ static void display(void) { /* 画面クリア */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* モデルビュー変換行列の設定 */ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /* 光源の位置を設定 */ glLightfv(GL_LIGHT0, GL_POSITION, lightpos); #if 0 /* 視点の移動(物体の方を奥に移動)*/ glTranslated(0.0, 0.0, -5.0); #endif ・・・
マウスをドラッグしてこの箱をぐるぐる回すと,部屋を内側から見回すことができます.テクスチャの境界が目立っているのは,テクスチャ自体の作り方が悪くて,最外周の画素の色が変化しているからです.
箱の中心から見ると環境のテクスチャは歪まない
この画像から,テクスチャの境界を横断している画像中の直線が,テクスチャの境界前後で折れ曲がったりしていないことが確認できます.キューブマッピングでは,環境のテクスチャが反射点に対して無限の遠方にあると仮定しているため,環境が映り込む物体表面上のどの点も,環境のテクスチャの中心にあることになります.この条件では,たとえ環境が立方体にマッピングされていても,面の境界においてテクスチャがゆがむことはありません.