[[OpenGL講習 インデックスに戻る>OpenGL講習]]

*内容 [#vf2b6d64]
3次元空間上に三角形が表示できるようになりましたが、~
これの色と表示の角度がリアルタイムに変わるようにします。~
#ref(Sample04_1.gif)
#ref(Sample04.gif)

*ソースダウンロード [#u772b2aa]
http://dl.getdropbox.com/u/235401/OpenGL/Sample04.zip

*解説 [#c7b5758a]
**タイマー [#n4f1caf1]
#sh{{
|c|
void OnTimer( int value )
{
	glutPostRedisplay();
	glutTimerFunc( 100, OnTimer, 0 );
}

int WINAPI WinMain( ... )
{
	...
	glutReshapeFunc( Resize );
	glutTimerFunc( 100, OnTimer, 0 );
	...
}
}}
glutTimerFuncという関数を使って、指定した時間が経過した後に~
OnTimer関数が呼ばれるようコールバックを設定します。~
この例では100ミリ秒後ですね。~
第1引数がミリ秒単位での時間指定、第2匹数がコールバック関数、~
第3引数はコールバック関数へ渡す値です。~
~
ちなみにこの第3引数には、何らかの構造体等のポインタを渡して~
コールバック先とデータを共有するというのが一般的です。~
この辺は興味があれば調べてみてください。~
~
なおglutTimerFuncは、指定された時間の経過後に1回だけコールバックを~
呼ぶようになっているので、この例では100ミリ秒ごとにタイマー動作し続けるように~
OnTimerの最後で再びglutTimerFunc呼び出しを行っています。~
~
#sh{{
|c|
glutPostRedisplay();
}}
OnTimer関数内で呼んでいるこの関数ですが、~
これはウィンドウを再描画するように命令する機能を持っています。~
そのため、結果的に100ミリ秒ごとにウィンドウを更新する、~
つまりRender関数が呼ばれる、という動作をするようになります。

**色 [#e13105cc]
#sh{{
|c|
void Render()
{
	int time = GetTickCount() % 3000;

	float r = 0;
	float g = 0;
	float b = 0;
	if ( time < 1000 )
	{
		b = ( 1000 - time ) / 1000.0f;
		r = time / 1000.0f;
	}
	else if ( time < 2000 )
	{
		r = ( 2000 - time ) / 1000.0f;
		g = ( time - 1000 ) / 1000.0f;
	}
	else 
	{
		g = ( 3000 - time ) / 1000.0f;
		b = ( time - 2000 ) / 1000.0f;
	}	 
	glColor3f( r, g, b );
}
}}
Render関数内のこの部分で、三角形の色をリアルタイムに変えています。~
前の項で、Render関数が100ミリ秒ごとに定期的に呼ばれるようになっているので、~
そのたびに違う色で描画するようにしてやりましょう。~
~
まず色を変えるタネとして、時刻を取得します。~
WindowsAPIのGetTickCount関数を使うと現在時刻がミリ秒単位で取得できるので、~
今回はこれを使うことにします。(正確には、システム立ち上げからの時間です。)~
~
あとはうまいことごにょごにょしてやって、赤・緑・青の色要素を作ってやります。~

**角度 [#r7b7658c]
#sh{{
|c|
void Render()
{
	glRotatef( 5, 0, 1, 0 );
}
}}
このglRotatef関数により、物体を回転させます。~
(厳密にはいろいろややこしいのですが、とりあえず端折ります。)~
~
第1引数は角度を度単位で(rad単位でないのがなんとも...)、~
第2〜4引数には回転の軸となるベクトルを指定してやります。~
この場合は(X,Y,Z)=(0,1,0)、つまりY軸を中心に5度回転させるわけです。~
~
この回転操作は状態が保持されるので、次にRenderが呼ばれるときは~
さらに5度回転させることになります。~
これにより、Y軸中心に回転し続けられるようになります。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS