4- 1 4. アニメーション 4.1. 設定方法 静止画→1回display call back関数を呼び出してイベント待ち アニメーション→イベントが起きるまで,display call back関数を 繰り返し呼び出して画面更新を行うことで絵を動かす glutDisplayFunc(display); glutIdleFunc(idle); void idle(void); { param +=d; glutPostRedisplayFunc(); glutMainLoop( ); } 4- 2 4.1.2. ダブルバッファの設定 読み出し側はフレームバッファを一定周期で読み直しながら 表示装置に出力しているので,走査中の☆のところで絵が (1)から(2)に書き直されると,途中までは楕円,その後は三 角というように絵が乱れる(実際はもっとおかしなことになる). 表示装置 へ ☆ (1)フレームバッファへの書き込み (2)フレームバッファから の読み出しと書き込み 4- 3 ダブルバッファ フレームバッファを2つ用意し表示用に使用するバッファを 切り替える(表示用に使われているバッファをフロントバッファ,書き 込みされているバッファをバックバッファと呼ぶ). 2)表示用に読 み出す 1)フレームバッファ1に書き 込む 1’)次の絵を書き込む 4)書き込みが終 わった時点で表 示用バッファを切 り替える(swap) 3)フレームバッファ2に書き込 み中(この時点では表示用には フレームバッファ1を使用) 4- 4 ダブルバッファの宣言 glutInitDisplayMode(GLUT_DOUBLE |GLUT_RGBA); バッファのスワップ glutSwapBuffers( ); 描画の最後でglFlush( )のかわりに記述する. 4- 5 4.1.3 ポリゴンを回転させる 実行! c4-1.cをコピーして実行する. 実行結果 4- 6 練習問題4-1: 1)c4-1.cにおいて四角形の回転軸をx軸,回転方向を逆方向,回転速度を2 倍に変える. p4-1-1.c 解答例 ヒント: a)glRotatef(theta,0.0,1.0,0.0)ではy軸を軸にしている. b)回転方向,速度はthetaの大きさの変え方による 2)c4-1.cにおいて四角形の回転と同時に前後方向に往復運動を加える. p4-1-2.c 解答例 z ヒント: #define PAI 3.1415926536 glTranslatef(0.0,0.0,2.0*sin(theta*PAI/180.0)); によりz軸上の平行移動を加える 3)c4-1.cにおいて,ダブルバッファを解除したらどうなるかたしかめる. theta 4- 7 4.2 ビューイング変換 ビューイング変換とは視点位置を変えたときにその位置に 合った投影像が得られるような座標変換である. 例1:c4-1.c のglTranslatef(0.0,0.0,-5.0); で,座標系をz方向に-5.0平行移動させる操作(物体が奥に 行く)は視点位置を(0.0,0.0,5.0)に設定する(見る位置を手 前に引く)ことに相当する. 例:c5-2で,マウスを動かすと異なる視点位置から見た絵が できる. 4- 8 4.2.2 視点の直線的な動き表現 gluLookAt( x0,y0,z0, x1,y1,z1, l, m, n); 視点位置 注視点位置 カメラの上方向ベクトル (0.0,1.0,0.0) y (0.0,1.0,1.0) この値を変化させる ことで表示される絵 を変えられる x z ワールド座標 系 4- 9 4.2.3 ウォークスルーアニメーション 実行! c4-2.cをコピーして実行する. 4- 10 練習問題4-2: 1)c4-1.cにおいて17行目のglTranslatefをgluLookAtを用いて 書き換え,結果が一致することを確かめる. c4-1-lookuAt:解答例 2)c4-2.cにおいてgluLookAt関数の視点位置を(0.0,10.0,10.0), 注視点位置を(0.0,0.0,15.0)に固定した場合に何が見えるか確 認せよ.ただし,z軸方向が画面の上を向くように(l,m,n) = (0.0,0.0,1.0)とすること. c4-2-lookuAt:解答例 4- 11 4.2.5 物体を視野中心におく polarviewを設定することで,物体をつねに視野中心におい て近づいたり周りから眺めるビューイング変換が可能となる. 本ルーチンはユーザが定義する必要がある. polarview( distance,twist,elevation,azimuth); distance:物体までの y 距離 azimuth distance twist:首のひねり azimuth:物体周りの twist 物体 角度 elevation elevation:物体を見 下ろす角度 x z 4- 12 void polarview(float distance,float twist,float elevation,float azimuth) { glTranslatef(0.0,0.0,-distance); glRotatef(-twist,0.0,0.0,1.0); glRotatef(-elevation,1.0,0.0,0.0); glRotatef(-azimuth,0.0,1.0,0.0); } 4- 13 練習問題4-3: 1)c4-1.cにpolarviewを加え,17行目のglTranslatefの代わりに 用いて結果を確認する. distance=5.0,twist=0.0,elevation=0.0,azimuth=0.0とする. ヒント:display関数の前にpolarview関数を記述し,displayの中 で,最初の視点設定周辺(gltranslatef等)で呼び出す. 解答例:p4-1-polar 2)polarviewの変数に適当な値をいれ,視点を動かしてみる. 4- 14 参考:コマンドラインから数値設定する方法 int comandnum; int main( int argc, char** argv ) { comandnum=atoi(argv[1]); … } とし, コマンドライン入力時に >test.exe 5 とすると グローバル変数comandnumに数値5がセットされる 4- 15 課題ヒント: 1)glRotatef(theta,0.0,1.0,0.0)を適当なところにいれる. thetaはidle関数の中で+していく 2)全体の回転に対し,1段目+羽+噴射口部分を相対的に余分に(あるい は少なめに)回転させる命令をいれる. 3)polarviewを適当な位置にいれる.
© Copyright 2024 ExpyDoc