床井研究室

にしんそば

明日は大晦日です.またひとつ,憂鬱になりそうです.せめて晦日そばくらいは好物を,と「おそばにはニシンを入れてね」と申請したのですが,「ニシン?何それ?」と却下されそうになりました.結局,私のおそばだけにはニシンを入れていただけることになりました.楽しみです.

視点マッピング

ゲームなどでポリゴン数を減らすために,視点を向いたビルボードに対して視点側から見たテクスチャをマッピングするというテクニックがあるそうです.これを「視点マッピング」とか言うのかもしれません.ということで,これも試しにやってみましょう.雛形として,前回作成したプログラムを使います.

これは視点から視線方向にテクスチャを投影することになりますから,テクスチャ変換行列を現在の透視変換行列とモデルビュー変換行列の積と一致させます.このために,「トラックボール処理で図形を回転」のところの glMultMatrixd( trackballRotation() ); のコメントを外します,そしてモデルビュー変換行列の設定が完了した後にその時点の投影変換行列とモデルビュー変換行列を取り出し,それぞれをテクスチャ変換行列に乗じます.「トラックボール処理でテクスチャを回転」のところの glMultMatrixd( trackballRotation() ); はコメントにして,無効にします.

/*************************
** GLUT のコールバック関数 **
*************************/

/* アニメーションのサイクル */
#define FRAMES 360

static void display()
{
  /* フレーム数をカウントして時間として使う */
  static int frame = 0;                      /* フレーム数        */
  double t = (double)frame / (double)FRAMES; /* 時間とともに 0→1 に変化 */

  /* アニメーションのサイクルごとにフレーム数をリセットする */
  if (++frame >= FRAMES) frame = 0;

  /* モデルビュー変換行列の設定 */
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  /* 光源の位置を設定 */
  glLightfv(GL_LIGHT0, GL_POSITION, lightpos);

  /* 視点の移動(物体の方を奥に移動)*/
  glTranslated(0.0, 0.0, -5.0);
  //gluLookAt(1.5, 2.0, 2.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

  /* トラックボール処理で図形を回転 */
  glMultMatrixd(trackballRotation());

  /* テクスチャ生成関数の設定 */
  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);

  /* 現在の投影変換行列とモデルビュー変換行列を取り出す */
  GLdouble projection[16]m, ;odelview[16]
  glGetDoublev(GL_PROJECTION_MATRIX, projection);
  glGetDoublev(GL_MODELVIEW_MATRIX, modelview);

  /* 取り出した投影変換行列と投影変換行列をテクスチャ行列に掛ける */
  glMultMatrixd(projection);
  glMultMatrixd(modelview);

  /* トラックボール処理でテクスチャを回転 */
  //glMultMatrixd(trackballRotation());

  /* 画面クリア */
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  /* シーンの描画 */
  scene();

  /* ダブルバッファリング */
  glutSwapBuffers();
}

これをコンパイルして実行すると,次のようが図形が表示されます.マウスをドラッグして物体を回転しても,テクスチャは静止しているように見えると思います.

視点マッピング