LoginSignup
20
18

More than 5 years have passed since last update.

OpenGL (GLUT) で正方形が動くだけのアニメーション

Posted at

GLUTによる「手抜き」OpenGL入門
OpenGL についてはこのサイトが大変詳しい。あまりに詳しくて読むのが面倒な人のために、アニメーションで正方形が動くだけの最小限のコードをメモ。

筆者環境は Linux (Ubuntu 14.04).

GLUT のインストール

$ sudo apt-get install freeglut3 freeglut3-dev

とりあえずウィンドウを開くだけ

minimum.c
#include <GL/glut.h>

/* 再描写時に実行される関数*/
void display(void) {
    /* 画面全体を指定した色で塗りつぶす */
    glClear(GL_COLOR_BUFFER_BIT);
    /* まだ実行されていない命令をすべて実行 */
    glFlush();
}

int main(int argc, char **argv){
    glutInit(&argc, argv);

    /* ウィンドウの位置とサイズを指定 */
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);

    /* ウィンドウを生成 */
    glutCreateWindow("test");

    /* 背景色を指定: 白 */
    glutInitDisplayMode(GLUT_RGBA);
    glClearColor(1.0, 1.0, 1.0, 1.0);

    /* 画面を再描写するときに実行される関数を指定 
       (初期化、ウィンドウサイズ変更時など) */ 
    glutDisplayFunc(display);

    /* ウィンドウが閉じられるまでループ */
    glutMainLoop();
    return 0;
}

コンパイルはいくつかオプションが要る

$ gcc minimum.c -lglut -lGLU -lGL -lm

正方形を書くだけ

square.c
#include <GL/glut.h>

/* 正方形のサイズを指定 */
GLdouble s = 0.5;

/* 再描写時に実行される関数*/
void display(void) {
    /* 画面全体を指定した色で塗りつぶす */
    glClear(GL_COLOR_BUFFER_BIT);

    /* 線の色を指定: 赤 */
    glColor3d(1.0, 0.0, 0.0);

    /* 描写 */
    glBegin(GL_LINE_LOOP);

    /* 図形の頂点を指定 */
    glVertex2d(-s,-s);
    glVertex2d(-s, s);
    glVertex2d( s, s);
    glVertex2d( s,-s);

    glEnd();

    /* まだ実行されていない命令をすべて実行 */
    glFlush();
}

int main(int argc, char **argv){
    glutInit(&argc, argv);

    /* ウィンドウの位置とサイズを指定 */
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);

    /* ウィンドウを生成 */
    glutCreateWindow("test");

    /* 背景色を指定: 白 */
    glutInitDisplayMode(GLUT_RGBA);
    glClearColor(1.0, 1.0, 1.0, 1.0);

    /* 画面を再描写するときに実行される関数を指定 
       (初期化、ウィンドウサイズ変更時など) */ 
    glutDisplayFunc(display);

    /* ウィンドウが閉じられるまでループ */
    glutMainLoop();
    return 0;
}

正方形が膨らむアニメーション

先の正方形描写はサイズをグローバル変数 s で指定したので、この s の値を一定時間ごとに変更して画面を再描写すればアニメになる。

animation.c
#include <GL/glut.h>

/* 正方形のサイズを指定 */
GLdouble s = 0.2;

/* 再描写時に実行される関数*/
void display(void) {
    /* 画面全体を指定した色で塗りつぶす */
    glClear(GL_COLOR_BUFFER_BIT);

    /* 線の色を指定: 赤 */
    glColor3d(1.0, 0.0, 0.0);

    /* 描写 */
    glBegin(GL_LINE_LOOP);

    /* 図形の頂点を指定 */
    glVertex2d(-s,-s);
    glVertex2d(-s, s);
    glVertex2d( s, s);
    glVertex2d( s,-s);

    glEnd();

    /* まだ実行されていない命令をすべて実行 */
    glFlush();
}

/* 100ミリ秒ごとに実行される関数 */
void timer(int value) {
    /* 正方形のサイズを増加 */
    s += 0.01;
    /* 画面を再描写 */
    glutPostRedisplay();
    /* 100ミリ秒後に再実行 */
    glutTimerFunc(100, timer, 0);
}

int main(int argc, char **argv){
    glutInit(&argc, argv);

    /* ウィンドウの位置とサイズを指定 */
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);

    /* ウィンドウを生成 */
    glutCreateWindow("test");

    /* 背景色を指定: 白 */
    glutInitDisplayMode(GLUT_RGBA);
    glClearColor(1.0, 1.0, 1.0, 1.0);

    /* 画面を再描写するときに実行される関数を指定 
       (初期化、ウィンドウサイズ変更時など) */ 
    glutDisplayFunc(display);

    /* 100ミリ秒後に timer() を実行 */
    glutTimerFunc(100, timer, 0);

    /* ウィンドウが閉じられるまでループ */
    glutMainLoop();
    return 0;
}
20
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
18