27
ココココココココココココココ S 第 10 第 OpenGL 第第1 第第第第第第第第第第第 第第 第第

コンピューターグラフィックス S

Embed Size (px)

DESCRIPTION

コンピューターグラフィックス S. 第 10 回  OpenGL 演習( 1 ) システム創成情報工学科 尾下 真樹. 今回の内容. 前回の残り サンプルプログラムの解説 OpenGL 演習( 1 ) 簡単なアニメーションの追加. OpenGL 演習. OpenGL の使い方を講義で説明 資料に従って、各自、プログラムを拡張 講義で学習した内容を、実際に作成して確認 一部のプログラムは、穴埋めになっている. 演習資料(3種類). 演習資料( OpenGL 演習) この資料に従って、プログラムを拡張していく 次回以降の分の説明は、逐次追加する - PowerPoint PPT Presentation

Citation preview

Page 1: コンピューターグラフィックス S

コンピューターグラフィックス S

第 10 回  OpenGL 演習( 1 )

システム創成情報工学科 尾下 真樹

Page 2: コンピューターグラフィックス S

今回の内容• 前回の残り

– サンプルプログラムの解説

• OpenGL 演習( 1 )– 簡単なアニメーションの追加

Page 3: コンピューターグラフィックス S

OpenGL演習• OpenGL の使い方を講義で説明• 資料に従って、各自、プログラムを拡張

– 講義で学習した内容を、実際に作成して確認– 一部のプログラムは、穴埋めになっている

Page 4: コンピューターグラフィックス S

演習資料(3種類)• 演習資料( OpenGL 演習)

– この資料に従って、プログラムを拡張していく

– 次回以降の分の説明は、逐次追加する

• コンパイル方法の説明資料– コンパイル方法の詳しい説明– CL 端末や自宅での方法も一応説明

• OpenGL 関数 簡易リファレンス– OpenGL の関数を簡単に説明した資料

Page 5: コンピューターグラフィックス S

コンパイル方法• ターミナルから、 gcc ( GNU C コンパイ

ラ)を、以下のようなコマンドで実行し、コンパイル

– opengl_sample.c ・・・ 入力のソースファイル名– opengl_sample ・・・ 出力の実行形式ファイル名

• 実行方法(出力ファイル名をターミナルから入力)

gcc opengl_sample.c -L/usr/X11R6/lib -lglut -lGLU -lGL –lXmu -lm -o opengl_sample

opengl_sample

Page 6: コンピューターグラフィックス S

コンパイルエラーが出たとき• ソースファイルにエラーがあるときには、

エラーの原因や、エラーのある行が表示されるので、それらの情報をもとに、プログラムを修正する– Java のプログラムでコンパイルエラーが出た

ときと同じ要領– エラーメッセージをよく読むことが重要

• サンプルプログラムは、何も修正しなければ、コンパイルエラーは出ない

Page 7: コンピューターグラフィックス S

簡単なアニメーションの追加

Page 8: コンピューターグラフィックス S

修正箇所

1. 回転角度を表す変数を追加(先頭)2. 変数を変化させる処理を追加( idle

()関数)3. 描画処理(変換行列の設定)を追加

( display ()関数)4. 描画処理(裏向きのポリゴンの描画)

を追加( display ()関数)

Page 9: コンピューターグラフィックス S

サンプルプログラムの構成(復習)

ユーザ・プログラム

GLUT

main ()関数 initEnvironment ()関数 初期化処理

入力待ち処理

終了処理

描画

マウス処理

アニメーション処理

display ()関数

idle ()関数

mouse ()関数motion ()関数

glutMainLoop()

main ()関数

Page 10: コンピューターグラフィックス S

ポリゴンの回転の変換行列• 1 枚のポリゴンを y 軸を中心として回転

させる

– 変換行列に y軸周りの回転を追加することで実現

1 0 0 0 1 0 0 0 1 0 0 0 cos 0 sin 0

0 1 0 0 0 cos sin 0 0 1 0 1 0 1 1 0

0 0 1 15 0 sin cos 0 0 0 1 0 sin

0 0 0 1 0 0 0 1 0 0 0 1

theta_cycle theta_cycle

camera_pitch camera_pitch

camera_pitch camera_pitch theta_

1 cos 0

1 10 0 0 1

x x

y y

z zcycle theta_cycle

モデル座標系→ワールド座標系ワールド座標系→カメラ座標系

x

y

z

( 0,1,0 )theta_cycle

Page 11: コンピューターグラフィックス S

ポリゴンの回転のための変数• 変数定義(先頭)、変数の変化( idle

()関数)// アニメーションのための変数float theta_cycle = 0.0;

void idle( void ){ // theta_cycle を 0 ~ 360 まで繰り返し変化させる // ( 360 まで来たら 0 に戻る) theta_cycle += 1.0; if ( theta_cycle > 360 ) theta_cycle -= 360;

// 再描画の指示を出す(描画関数が呼ばれる) glutPostRedisplay();}

Page 12: コンピューターグラフィックス S

ポリゴンの回転の追加• 変換行列の設定( display ()関数)

// 変換行列を設定(ワールド座標系→カメラ座標系)glMatrixMode( GL_MODELVIEW );glLoadIdentity();glTranslatef( 0.0, 0.0, - 15.0 );glRotatef( - camera_pitch, 1.0, 0.0, 0.0 );

// 地面を描画(ワールド座標系で頂点位置を指定)・・・・・・

// 変換行列を設定(モデル座標系→カメラ座標系)glTranslatef( 0.0, 1.0, 0.0 );glRotatef( theta_cycle, 0.0, 1.0, 0.0 );

// ポリゴンを描画(モデル座標系で頂点位置を指定)

Page 13: コンピューターグラフィックス S

裏面のポリゴンの描画• 裏面が描画されない(背面消去のため)

ので、裏向きのポリゴンの描画を追加glBegin( GL_TRIANGLES );

glColor3f( 0.0, 0.0, 1.0 );glNormal3f( 0.0, 0.0, 1.0 );glVertex3f(-1.0, 1.0, 0.0 );glVertex3f( 0.0,-1.0, 0.0 );glVertex3f( 1.0, 0.5, 0.0 );

glColor3f( 1.0, 0.0, 0.0 );glNormal3f( ???, ???, ??? );glVertex3f(-1.0, 1.0, 0.0 );glVertex3f( ???, ???, ??? );glVertex3f( ???, ???, ??? );

glEnd();

伏せ字になっている部分には、適切な値を記述する

Page 14: コンピューターグラフィックス S

裏面のポリゴンの描画• 法線、頂点の順序を反対にする必要があ

る– 法線の向き(頂点の色計算に使用)– 頂点の順序(面の向き判定 → 背面除去に使

用)• デフォルトでは、反時計回りになる方を表と判定

1

3

2

1

3

2

表 裏

Page 15: コンピューターグラフィックス S

修正箇所のまとめ

1. 回転角度を表す変数を追加(先頭)2. 変数を変化させる処理を追加( idle

()関数)3. 描画処理(変換行列の設定)を追加

( display ()関数)4. 描画処理(裏向きのポリゴンの描画)

を追加( display ()関数)

Page 16: コンピューターグラフィックス S

演習• 演習1

– 資料の 2 章の内容– ここまでのプログラム(簡単なアニメーショ

ン)をサンプルプログラムに追加

• 演習2– 演習問題– 描画設定の変更による描画結果の違いを確認

Page 17: コンピューターグラフィックス S

演習問題• 演習問題 1

– Z バッファと背面除去の有無の変更

• 演習問題 2– 射影変換行列の変更

Page 18: コンピューターグラフィックス S

以降の演習は次回

次回説明演習資料は用意されているので、先をやりたい人は、自分で進めておいて構わな

Page 19: コンピューターグラフィックス S

前回の演習問題の解説

Page 20: コンピューターグラフィックス S

問題• 下記のようなシーンがある時、モデル座標系からカメラ

座標系への変換行列を求めよ– 物体は原点にあり、モデル座標系とワールド座標系は一致してい

る。– カメラは、ワールド座標系から見て水平方向に- 90 度回転(ワ

ールド座標系の Y 軸を中心として 90 度回転)、上下方向に- 45 度回転(カメラ座標系の X 軸を中心として- 45 度回転)した状態にある。また、カメラは原点を向いており、両者の間の距離は 10 である。

y

z

x

x

z

y

z

10

Page 21: コンピューターグラフィックス S

解答

y

z

x

x

z

y

z

10

1 0 0 0 1 0 0 0 cos 90 0 sin 90 0

0 1 0 0 0 cos 45 sin 45 0 0 1 0 0

0 0 1 10 0 sin 45 cos 45 0 sin 90 0 cos 90 0

0 0 0 1 0 0 0 1 0 0 0 1

一番最後に平行移動をかければ良いことに注目

カメラを原点から 10 離すというのは、カメラ座標系で見て、カメラを後ろに 10動かすということなので、カメラ座標系(回転後)に平行移動を適用

Page 22: コンピューターグラフィックス S

解説( 1/2)• 回転変換をかけた段階でカメラの向きが決

z

xy

x

zy

z

1 0 0 0 cos 90 0 sin 90 0

0 cos 45 sin 45 0 0 1 0 0

0 sin 45 cos 45 0 sin 90 0 cos 90 0

0 0 0 1 0 0 0 1

Page 23: コンピューターグラフィックス S

解説( 2/2)• Z 方向に- 10 平行移動することで、カメ

ラを原点から距離 10 離すことになる

y

z

x

x

z

y

z

10

1 0 0 0 1 0 0 0 cos 90 0 sin 90 0

0 1 0 0 0 cos 45 sin 45 0 0 1 0 0

0 0 1 10 0 sin 45 cos 45 0 sin 90 0 cos 90 0

0 0 0 1 0 0 0 1 0 0 0 1

カメラの正面方向は、- Z 方向であるため

Page 24: コンピューターグラフィックス S

誤答例 1

• 符号が反対

z

x

y

x

z

y

z10

1 0 0 0 1 0 0 0 cos 90 0 sin 90 0

0 1 0 0 0 cos 45 sin 45 0 0 1 0 0

0 0 1 10 0 sin 45 cos 45 0 sin 90 0 cos 90 0

0 0 0 1 0 0 0 1 0 0 0 1

( 0,0,0 )に変換行列を適用すると( 0,0,10 )になるので、明らかにおかしいと分かるはず

Page 25: コンピューターグラフィックス S

誤答例 2

• 平行移動の順番が違う

z

x

y

x

z

y

z

1 0 0 0 1 0 0 0cos 90 0 sin 90 0

0 cos 45 sin 45 0 0 1 0 00 1 0 0

0 sin 45 cos 45 0 0 0 1 10sin 90 0 cos 90 0

0 0 0 1 0 0 0 10 0 0 1

カメラが、ワールド座標系で( 0,0,10 )の位置に来てしまう

( 0,0,10 )

Page 26: コンピューターグラフィックス S

平行移動の適用位置(復習)• 平行移動を適用する順番により、結果は

変るモデル→ワールドの回転

1 1

x x

y y

z z

ワールド→カメラの回転

ワールド座標での平行移動

カメラ座標での平行移動

モデル座標での平行移動

0

0

10

x

y

zz

(12,0,2)

x

y(-8,4,1)

x

y

z

Page 27: コンピューターグラフィックス S

別解• ワールド座標系でのカメラの位置を計算

して右からかけても同じ変換行列になる

y

z

x

x

z

y

z

10

1 0 0 0 cos 90 0 sin 90 0 1 0 0 10sin 90 cos 45

0 cos 45 sin 45 0 0 1 0 0 0 1 0 10sin 45

0 sin 45 cos 45 0 sin 90 0 cos 90 0 0 0 1 10cos 90 cos 45

0 0 0 1 0 0 0 1 0 0 0 1

この場合、カメラ位置の計算は面倒なので、正解のやり方で解けるようになっていた方が良い