/* Draw lines on a window test4.c */ /* compile: cc -o test4 test4.c -g -O2 -Wall -lglfw -lGLU -lGL -lX11 -lXrandr -lm */ /* OpenGL を使って線で色々な図形を描く。 * 描画そのものには OpenGL、 * ウィンドウシステムとのインターフェイスには GLFW、 * を使用している。参考資料は google で。 * * OpenGL に関しては OpenGL 2.0以降大きな変更があったが、この演習のサン * プルでは古い機能しか使っていないし、演習サーバでは新しい機能は使えな * いので、資料も OpenGL 1.0〜1.5時代の古いものの方が参考になる。 */ #include #include #include #include /* 線分を描画する関数を定義 */ void line(double x0, double y0, double x1, double y1) { glBegin(GL_LINES); glVertex2d(x0, y0); glVertex2d(x1, y1); glEnd(); } /* 円を描画する関数を定義 */ void circle(double x, double y, double r) { int const N = 24; /* 円周を 24分割して線分で描画することにする */ int i; glBegin(GL_LINE_LOOP); for (i = 0; i < N; i++) glVertex2d(x + cos(2 * M_PI * i / N) * r, y + sin(2 * M_PI * i / N) * r); glEnd(); } /* 矩形を描画する関数を定義 */ void rectangle(double x0, double y0, double x1, double y1) { glBegin(GL_LINE_LOOP); glVertex2d(x0, y0); glVertex2d(x0, y1); glVertex2d(x1, y1); glVertex2d(x1, y0); glEnd(); } /* ここから先に定義した関数を使って図形を描いてみる */ int main(void) { /* グラフィック環境を初期化して、ウィンドウを開く */ glfwInit(); glfwOpenWindow(640, 400, 0, 0, 0, 0, 0, 0, GLFW_WINDOW); /* モデルビュー変換行列の設定 */ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /* glScaled(0.4, 0.4, 0.4);縮小してみたり */ /*glTranslated(-100.0, -100.0, 0.0);平行移動してみたり */ /* glRotated(15.0, 0.0, 0.0, 1.0);回転してみたりもできる */ /* 投影変換行列の設定 */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, 640, 0, 400, -1.0, 1.0); /* glOrthoを使って,この引数で示された範囲の空間を ビューポートに投影する設定をした*/ for (;;) { int width, height; /* 何らかのイベントが発生するまで待つ。 * イベントの例: * - ウィンドウの再描画が必要 (ウィンドウが作られた、隠されていた部 * 分が見えるようになった、サイズが変更された、等) * - キーが押された、離された*/ glfwWaitEvents(); /* Esc が押されるかウィンドウが閉じられたらおしまい */ if (glfwGetKey(GLFW_KEY_ESC) || !glfwGetWindowParam(GLFW_OPENED)) break; /* 現在のウィンドウサイズを取得して */ glfwGetWindowSize(&width, &height); /* ウィンドウ全面をビューポートにした */ glViewport(0, 0, width, height); /* バックバッファを黒で塗り潰す */ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); /* バックバッファに色々描画していく */ glColor3d(0.5, 1.0, 0.5); line(0, 0, 639, 399); glColor3d(0.5, 1.0, 1.0); circle(320, 200, 100); glColor3d(0.5, 0.5, 1.0); glLineStipple(5, 0xaaaa); glEnable(GL_LINE_STIPPLE); rectangle(160, 50, 479, 349); glDisable(GL_LINE_STIPPLE); /* フロントバッファとバックバッファを入れ替える */ glfwSwapBuffers(); /* これで、これまで描いてきたものが見えるようになった */ } /* 一応、終了前にウィンドウを閉じておく (まだ開いていたら) */ glfwTerminate(); /* (でも実は明示的に呼ばなくても大丈夫) */ return 0; }