スライド(字が配布資料より大きい)

OpenGL関連について
•
•
•
•
グラフィックライブラリの一つ
シリコングラフィックス社が元々開発した
Windows, Linux などでソースレベルの互換性
ウィンドウ、入出力処理をサポートしていない
(GLUTライブラリを併用することで対処)
• GLUTライブラリは対話処理を前提としている
(実行で無限ループで入力待ちの状態になる)
1
OpenGLの基本(1/4)
#include <GL/glut.h>
// ライブラリ用ヘッダファイル
void display (void) {
// 表示部分をこの関数で記入
glClear (GL_COLOR_BUFFER_BIT ); // 画面消去
glFlush ( );
// 画面出力
}
• 表示関数で表示
• 無限ループで、
終了しない
int main (int argc, char *argv[]) { // メインプログラム
glutInit (&argc, argv);
// ライブラリの初期化
glutCreateWindow (argv[0]); // ウィンドウを作成
glutDisplayFunc (display);
// 表示関数を指定
glClearColor (1.0, 1.0, 1.0, 1.0); // 消去色指定
glutMainLoop ( );
// イベント待ち
return 0;
}
実行画面
2
OpenGLの基本(2/4)
void display (void) {
// 表示関数
glClear (GL_COLOR_BUFFER_BIT ); // 画面消去
glColor3d(0.0, 1.0, 0.0); // 色指定(R,G,B)で0~1まで
glBegin(GL_LINE_LOOP); // 形状(巡回線)定義開始
glVertex2d(-0.9, -0.8);
// 頂点定義
glVertex2d(0.9, -0.8);
glVertex2d(0., 0.8);
glEnd();
// 形状定義終わり
glFlush ( );
// 画面出力
}
実行画面
3
OpenGLの基本(3/4)
void display (void) {
// 表示関数
glClear (GL_COLOR_BUFFER_BIT ); // 画面消去
glColor3d(1.0, 0.0, 0.0); // 色指定(R,G,B)で0~1まで
glBegin(GL_TRIANGLES); // 形状(三角形)定義開始
glVertex2d(-0.9, -0.8);
// 頂点定義
glVertex2d(0.9, -0.8);
glVertex2d(0., 0.8);
glEnd();
// 形状定義終わり
glFlush ( );
// 画面出力
}
マウスで
ウィンドウ
の大きさを
変えると形
も変わる
実行画面
4
OpenGLの基本(4/4)
#include <GL/glut.h>
void display(void) { 前のまま }
void reshape(int w, int h) { // 表示枠の幅(w)、高さ(h)を入力
glViewport(0, 0, w, h); // 枠全体を表示領域に指定
glLoadIdentity(); // 変換行列を単位行列に指定
glOrtho(-w/300.0, w/300.0, -h/300.0, h/300.0, -1.0, 1.0);
}
マウスで
ウィンドウ
の大きさを
変えても、
形は変わら
ない
int main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
glutReshapeFunc(reshape); // 再描画関数指定
glClearColor(1.0, 1.0, 1.0, 1.0);
glutMainLoop();
return 0;
}
5
グラデーション表現
#include <GL/glut.h>
int main(int argc, char *argv[])
{
void display(void)
glutInit(&argc, argv);
{
glutInitDisplayMode(GLUT_RGBA);
glClear(GL_COLOR_BUFFER_BIT);
glutCreateWindow(argv[0]);
glBegin(GL_TRIANGLES);
glutDisplayFunc(display);
① glColor3f( 1.,0.,0. ); glVertex2f( 0., 0.666 ); glClearColor( 1.,1.,1.,1. );
② glColor3f( 0.,1.,0. ); glVertex2f(-0.5,-0.2 ); glutMainLoop();
③ glColor3f( 0.,0.,1. ); glVertex2f( 0.5,-0.2 ); return 0;
glEnd();
}
glFlush();
①
}
•頂点に色を指定する
•頂点間は線形補間された色
•面の内部は2重の線形補間
②
③
ウィンドウとビューポートとの関係(1/3)
glOrtho(xmin,xmax,ymin,ymax,zmin,zmax) ←正射影の投影変換
ワールド座標系のどの範囲を抽出するか
(既定値は-1~1まで)
y
glVeiwport(x0,y0,w,h)
スクリーン座標系のどの領域に描くか
既定値は1
y
ymax
xmin
xmax
0
既定値は(0,0,w,h)
w,hの既定値は300
x
ymin
h
y0
既定値は-1
(x0,y0)
w
0
ワールド座標系(実数値)
x
x0
スクリーン座標系(画素単位、整数値)
7
ウィンドウとビューポートとの関係(2/3)
glOrtho(xmin,xmax,ymin,ymax,zmin,zmax)
マウスを動かしても引数の値は変化しない
glVeiwport(x0,y0,w’,h’)
y
変化しない
y
ymax
xmin
0
xmax
ymin
変化しない
ワールド座標系(実数値)
マウスでウィンドウの大きさを
変えて幅w’、高さh’にする
x
h’
y0
0
(x0,y0)
w’
x
x0
スクリーン座標系(画素単位の整数値)
8
ウィンドウとビューポートとの関係(3/3)
マウスでウィンドウの大きさを
変えて幅w’、高さh’にする
glOrtho(-cw’,cw’,-ch’,ch’,zmin,zmax)
glVeiwport(x0,y0,w’,h’)
マウスの動きに対応して引数の値を変化させる
y
選択する領域 ch’
が変化する
cw’
-cw’ 0
-ch’
マウスの動きで引数が変化
y
x
cは定数
ワールド座標系(実数値)
h’
y0
0
(x0,y0)
w’
x
x0
スクリーン座標系(画素単位の整数値)
9
マウス処理 クリック操作で座標を取り込む
#include <GL/glut.h>
int px = 0, py = 0; // 初期位置
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glBegin( GL_POINTS ); // 点表示
glVertex2i( px,py );
glEnd( );
glFlush( );
}
void reshape(int w, int h) {
glViewport(0, 0, w, h);
glLoadIdentity();
glOrtho(0.,(float)w,(float)h,0.,-10.,10. );
} //
xmin, xmax, ymin, ymax, zmin, zmax
void init(void) {
glClearColor(1., 1., 1., 1.); // 消去色
glColor3f( 0.,0.,1. ); // 描画色
glPointSize( 20. ); // 点の大きさ
}
void mouse(int btn, int st, int x, int y) {
switch ( btn ) {
case GLUT_LEFT_BUTTON: // 左釦
if( st == GLUT_DOWN ){
px = x; py = y; // カーソルの座標値
} break;
default: break;
} glutPostRedisplay( );
}
int main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
init();
glutMainLoop();
return 0;
}
10
マウス処理(ドラッグで座標を連続取得)
#include <GL/glut.h>
int px = 200, py = 150; // 点の初期位置
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glBegin( GL_POINTS );
glVertex2i( px,py ); // 点を表示
glEnd( );
glFlush( );
}
void init() {
glClearColor(1., 1., 1., 1.); // 背景は白
glColor3f( 0.,0.2,1. );
// 青色で描く
glPointSize(15.);
// 点の大きさ
}
int main(int argc, char *argv[]) {
glutInit(&argc, argv);
void motion(int x, int y) {
glutInitWindowSize( 400,300 );
px = x; py = y;
glutCreateWindow(argv[0]);
glutPostRedisplay( );
glutDisplayFunc(display);
}
glutReshapeFunc(reshape);
// マウスの座標系に合わせる
glutMotionFunc(motion);
void reshape(int w, int h) {
init();
glViewport(0, 0, w, h);
glutMainLoop();
glLoadIdentity();
return 0;
glOrtho(0.,(float)w,(float)h,0.,-10.,10. );
}
} //
xmin, xmax, ymin, ymax, zmin, zmax
文字列表示
#include <GL/glut.h>
void strout(float x, float y, char *str) {
void *font = GLUT_BITMAP_TIMES_ROMAN_24;
glRasterPos2f(x,y);
while( *str ) glutBitmapCharacter(font, *str++);
}
void display(void)
{ char *ptr, *ft="Outline font";
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glColor3f( 1.,0.,0. );
strout( -0.4,0.3,"Bitmap font" );
glColor3f( 0.,0.,1. );
glTranslatef( -0.4,-0.4,0. );
glScalef(0.001,0.001,1.);
ptr = ft;
while(*ptr)glutStrokeCharacter(
GLUT_STROKE_ROMAN,*ptr++);
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
glClearColor(1.0, 1.0, 1.0, 1.0);
glLineWidth(2.);
glutMainLoop();
return 0;
}
OpenGLの表現
• 頂点
glVertex2d( x, y)
double(倍精度)、 他にf(float)、i(integer)、b(byte)ほか
引数が2個(x,y)、 他に3(x,y,z)、4(x,y,z,w)など
• 色
– glColor3f( r,g,b )
float(単精度)、他にd(double、倍精度)
他に4( r,g,b,α ) α値は不透明度を表す
0≦ r, g, b, α ≦1, 0は効果ゼロ、1は最大
13
OpenGL GLUTのサイト等
http://www.opengl.org/
http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html
http://wisdom.sakura.ne.jp/system/opengl/ 他
OpenGLプログラミングガイド
ピアソン・エデュケーション
OpenGL リファレンスマニュアル
アジソン・ウェスレイ
14