サンプル4


  今回は、立方体がくるくる回るアニメーションを作ってみます。


目次

アニメーションの基本

  今回は、プログラムを見る前に、どうやってアニメーションさせるかといった、基本的なことを見ておきます。2Dでも3Dでも同じですが、コンピュータでアニメーションを作るときは、ちょっとずつ違った絵を連続して表示させることで、動いているように見せるのです。ちょうど、パラパラ漫画のようなものです。
  ですから、アニメーションさせるには、図形を描いて、消して、ちょっと動かしてまた描くという処理を続ければ良いわけです。


glutでのアニメーションの作り方

  アニメーションさせるには、ひたすら描いて消して、を繰り返せば良いことはわかりましたが、どうやって繰り返したらよいでしょうか。例えば、display_func()の中でループして、描いて、消してという処理をやったとしましょう。そうすると、たしかにアニメーションはしますが、キー入力やマウス入力ができなくなってしまいます。これでは困ります。
  glutでアニメーションを作るときは、次の2つの関数のどちらかを使います。

void glutIdleFunc(void (*func)(void))

  キー入力や、画面の書き換えといった、イベント処理がないときに呼ばれ続ける関数を登録する。アニメーション用の関数を1つ作って、それを登録すれば、呼ばれ続けるので、アニメーション処理ができる。
void glutTimerFunc(unsigned int msecs, void (*func)(int value), value)
  glutIdleFunc()は、イベントがないときに呼ばれ続ける関数を登録するが、glutTimerFunc()は、一定時間が経過したときに呼ぶ関数を登録する。
  どちらも、繰り返し関数を呼ぶため、アニメーションできますが、今回は、glutIdleFunc()を使うことにしました。


サンプルプログラム

  そうしたら、サンプルを見てください。

グローバル変数

  立方体の回転角度を持つ変数として、rotを宣言しています。
main()の中
  glutIdleFunc()を呼んで、idle_func()を登録しています。
display_func()の中
  今回は、回転角度を変数で持っているので、glRotatef()にこの値を渡して回転させます。
idle_func()の中
  この関数では、時刻から立方体の回転角度を計算します。計算するといっても、単に0.1倍しているだけですが。
  使っている関数は、次の2つです。

glutGet(GLUT_ELAPSED_TIME)

  glutInit()を呼んだときからの時間(ミリ秒単位)を返します。
glutPostRedisplay()
  glutに画面を描き直す必要があることを知らせます。

  アニメーションもできて、だんだんできることが増えてきました。


戻る