課題
サイコロを転がすアニメーションを行うプログラムを作成して,提出してください.
どのように転がして止めるかは自由です.
できればうまく転がっているように見えるように工夫してみてください.
課題を進めるためのヒント
課題を行うにあたって,次のテンプレートファイルをダウンロードして利用してください. サンプルプログラムも参考にしてください. テンプレートではサイコロを描画できるようにしてあります. また[j][k][l][z]のキーを使って,サイコロの周囲でカメラを動かすことができるようになっています. これをもとにして,サイコロを転がすアニメーションを行うようにしてください.
以下に課題のプログラムを作成するためのヒントを示します.
- サイコロを回転させる方法
サンプルプログラムでは原点に配置された色付けされた立方体を視点をさまざまに変えて見ることができるようになっています.視点を連続してスムーズに変えていくと,画面では,あたかも立方体が回転しているかのように見えます.サイコロを「回転させる」のにも同様の手法が使えます.
なおテンプレート(dice_template.rb)で視点を決めているのはset_camera(theta,phi,psi,dist)というメソッドです. 原点中心の半径distの球面上の点(経度theta,緯度phi)から原点をとらえるようにしています.また視線を軸としてpsiだけカメラを回転させるようにしています. なおtheta,phi,psiの単位は度(degree)です.弧度(radian)ではありませんので注意してください.
- アニメーションを自動停止させる方法
アイドルコールバックにおいて,(適切な条件で)アイドルコールバックの登録を削除すれば,アニメーションを自動的に停止できます.idle = Proc.new { if サイコロが停止する条件 GLUT.IdleFunc(nil) end }
- プログラムにランダム性を与える方法
サイコロの転がり方にランダム性を与えるには,randを使います.rand(n) # 0,...,n-1のいずれかの整数をランダムに返す(nは正の整数とする) rand(m..n) # m,...,nのいずれかの整数をランダムに返す(m,nは正の整数でm ≦ nとする) rand(0) # 0以上1未満の数をランダムに返す