■ 2004年12月30日 [OpenGL][テクスチャ] 第9回 視点マッピング
2005年07月05日 13:05更新
にしんそば
明日は大晦日です.またひとつ,憂鬱になりそうです.せめて晦日そばくらいは好物を,と「おそばにはニシンを入れてね」と申請したのですが,「ニシン?何それ?」と却下されそうになりました.結局,私のおそばだけにはニシンを入れていただけることになりました.楽しみです.
視点マッピング
ゲームなどでポリゴン数を減らすために,視点を向いたビルボードに対して視点側から見たテクスチャをマッピングするというテクニックがあるそうです.これを「視点マッピング」とか言うのかもしれません.ということで,これも試しにやってみましょう.雛形として,前回作成したプログラムを使います.
これは視点から視線方向にテクスチャを投影することになりますから,テクスチャ変換行列を現在の透視変換行列とモデルビュー変換行列の積と一致させます.このためにモデルビュー変換行列の設定が完了したところで,現在の変換行列を保存します.また,テクスチャ変換行列を設定している部分をモデルビュー変換行列の設定より後に移動し,そこで保存してある変換行列をテクスチャ変換行列に乗じます.
・・・ static void display(void) { /* フレーム数をカウントして時間として使う */ static int frame = 0; /* フレーム数 */ double t = (double)frame / (double)FRAMES; /* 時間とともに 0→1 に変化 */ if (++frame >= FRAMES) frame = 0; #if 0 /* テクスチャ変換行列の設定をモデルビュー変換行列の後ろに移動する */ /* テクスチャ行列の設定 */ glMatrixMode(GL_TEXTURE); glLoadIdentity(); glTranslated(0.5, 0.5, 0.0); glRotated(t * 360.0, 0.0, 0.0, 1.0); glScaled(0.5, 0.5, 1.0); gluPerspective(60.0, 1.0, 1.0, 100.0); gluLookAt(0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); /* トラックボール処理による回転 */ glMultMatrixd(trackballRotation()); #endif /* モデルビュー変換行列の設定 */ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /* 光源の位置を設定 */ glLightfv(GL_LIGHT0, GL_POSITION, lightpos); /* 視点の移動(物体の方を奥に移動)*/ glTranslated(0.0, 0.0, -5.0); #if 1 /* 視点の回転を有効にする */ /* トラックボール処理による回転 */ glMultMatrixd(trackballRotation()); #endif /* 現在の透視変換行列とモデルビュー変換行列を得る */ GLdouble model[16], proj[16]; glGetDoublev(GL_MODELVIEW_MATRIX, model); glGetDoublev(GL_PROJECTION_MATRIX, proj); /* テクスチャ生成関数の設定 */ glTexGendv(GL_S, GL_EYE_PLANE, genfunc[0]); glTexGendv(GL_T, GL_EYE_PLANE, genfunc[1]); glTexGendv(GL_R, GL_EYE_PLANE, genfunc[2]); glTexGendv(GL_Q, GL_EYE_PLANE, genfunc[3]); /* テクスチャ行列の設定 */ glMatrixMode(GL_TEXTURE); glLoadIdentity(); glTranslated(0.5, 0.5, 0.0); glRotated(t * 360.0, 0.0, 0.0, 1.0); glScaled(0.5, 0.5, 1.0); glMultMatrixd(proj); glMultMatrixd(model); /* モデルビュー変換行列の設定に戻す */ glMatrixMode(GL_MODELVIEW); /* 画面クリア */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* シーンの描画 */ scene(); /* ダブルバッファリング */ glutSwapBuffers(); } ・・・
これをコンパイルして実行すると,次のようが図形が表示されます.マウスをドラッグして物体を回転しても,テクスチャは静止しているように見えると思います.