ビューワーもどき

2010年1月5日

ファイル

19-view.tar.gz

使い方

マウスでモデルがぐりぐり動きます。

  • 左ボタンドラッグ: 回転
  • 真中ボタンドラッグ: 移動
  • 右ボタンドラッグ: 拡大 (上)/縮小 (下)

キーボードのキー "p" で "Perspective" と "Orthogonal" が切り替わります。

内容

ビューワーもどきです。対象であるワイヤーフレームティーポットをマウス操作に応じてぐりぐり動かします。移動は glTranslatef(), 拡大・縮小は glScalef() で行っています。回転がやっかいですが、めんどくさいのでここでは GLUT の examples に入っている trackball.c, trackball.h を利用しました。これはクォータニオンを使ってトラックボールを模擬したものだそうですが、使い方は以下のようになります。

定義

static float curquat[4];
static float lastquat[4];

初期化 (init() 内)

	trackball(curquat, 0., 0., 0., 0.);

マウスの移動に応じて回転量を計算… (motion() 内)

		trackball(lastquat,
		  (2.*mouseStartX - w)/w,
		  (h - 2.*mouseStartY)/h,
		  (2.*x - w)/w,
		  (h - 2.*y)/h
		);
		add_quats(lastquat, curquat, curquat);

上の trackball() の第 2 〜 5 引数には -1 〜 1 の値を与えるようです。

そして回転 (applyRotateMatrix() 内)

	GLfloat m[4][4];

	build_rotmatrix(m, curquat);
	glMultMatrixf(&m[0][0]);

クォータニオンから回転行列を作り、それを変換行列にかけます。

OpenGL プログラミング 目次へ