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
© Copyright 2024 ExpyDoc