Document

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を適当な位置にいれる.