トップコンテンツプログラムノベルゲーム>図形の表示



図形の表示

1 章ではウィンドウを生成するプログラムを作りました。
今度は、ウィンドウに図形を描画するプログラムを作ってみます。


プログラム その1

手始めに三角形を書いてみましょうか。


gl2_1.c (青色の三角形を表示) [表示・非表示]
 1.
 2.
 3.
 4.
 5.
 6.
 7.
 8.
 9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
#include <GL/glut.h>

/* ディスプレイへの描画処理について記述 */
void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
  glClearColor (1.0, 1.0, 1.0, 1.0);  // ウィンドウの背景色(画面消去色)の設定

  /* 図形の描画(三角形) */
  glColor3f(0.1, 0.1, 0.8);  // 図形を書く際の色を設定
    glBegin(GL_TRIANGLES);     // 図形の描画開始
    glVertex2f(-0.9, -0.9);
    glVertex2f(0.9, -0.9);
    glVertex2f(0.9, 0.9);
    glEnd();                   // 図形の描画終了

  glutSwapBuffers();
}

/* 個々のプログラム独自に行なうべき初期化 */
void myInit(void)
{
  /* ウィンドウ生成前に行なうべき設定 */
  glutInitWindowSize(800, 600);                  // ウィンドウサイズの設定
  glutInitWindowPosition(200, 200);              // 表示位置の設定
  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);  // ディスプレイモードの設定
  glutCreateWindow("OpenGL");                    // ウィンドウを生成

  /* イベント発生時に呼び出される関数の登録 */
  glutDisplayFunc(display);
}


int main(int argc, char* argv[])
{
  /* 初期化 */
  glutInit(&argc, argv);  // GLUT 関数を使用するための初期化
  myInit();               // プログラマ定義の初期化

  /* イベント待機状態に入る */
  glutMainLoop();         // イベント待ち状態に入る

  return 0;
}

実行結果はこちら。
図形を表示1(三角形)


それでは太字で示した関数の解説をしていきましょう。


まとめると、図形の描画の手順は以下のようになります。

  1. glBeginで図形描画モードを開始
  2. glVertexで、頂点を順々に指定(glBeginに渡した引数によって、描画される図形が変化)
  3. glEndで図形描画モードを終了

実際には、1.の前にglColorで図形の色を設定したり, 線の太さを変える事などもあるでしょう。


プログラム その2

さて、次はもう少し発展させて、ハンマーっぽいものでも作ってみますか。
図形を組み合わせたり, 回転させたりと、前回のプログラムよりは高度なものになります。


gl2_2.c (ハンマーを表示, display関数内のみ変更) [表示・非表示]
 1.
 2.
 3.
 4.
 5.
 6.
 7.
 8.
 9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
~インクルードファイル 変更なし~

* ディスプレイへの描画処理について記述 */
void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
  glClearColor (1.0, 1.0, 1.0, 1.0);  // ウィンドウの背景色(画面消去色)の設定

  /* 図形の描画(ハンマー) */
  glPushMatrix();
    glColor3f(0.0, 0.0, 1.0);
    glRotatef(45.0, 0.0, 0.0, 1.0);  // ハンマー全体を回転
  
    /* 先端の少し突き出た部分(おまけ) */
    glPushMatrix();
      glTranslatef(0.0, -0.75, 0.0); // 先端の突き出た部分のみを下に平行移動
      glBegin(GL_TRIANGLES);
        glVertex2f(0.0, 1.0);
        glVertex2f(-0.1, 0.9);
        glVertex2f(0.1, 0.9);
      glEnd();
    glPopMatrix();

    /* 柄の部分 */
    glRectf(-0.05, -1.0, 0.05, 0.2);

    /* 打撃部分 */
    glRectf(-0.3, -0.15, 0.3, 0.15);
  glPopMatrix();

  glutSwapBuffers();
}

~myInit 関数 変更なし~

~main 関数 変更なし~

実行結果はこちら。
図形を表示2(ハンマー)

ようやく、少しはまともなものが出来た気がします。
それでは、太字で紹介した関数の説明をしていきます。

これで、回転角を10ミリ秒ごとに変化させるプログラムなんてものを書いてしまえば、もうそれだけでアニメーションが作れてしまいます。
このサイトでは、時間に関する関数は wxWidgets のものを使うため、アニメーションが行えるようになるのはまだまだ先の話です。
ですが、一足先に試してみたい方はこのページの「アニメーション」の項を参考にしてみるとよいでしょう。

ということで、このページで紹介した OpenGL 関数一覧でも。



3. 画像の表示へ