Image

OpenGLとC言語で点を動かす - 図形の動き

OpenGLとC言語で点(図形)を動かす方法について解説します。点の描画と点を動かす処理のサンプルコードを提示しながら解説します。

OpenGLとC言語で点を動かす

今回はdisplay関数で点を描画してその点を動かしてみましょう。

OpenGLの基本的な関数などは前回までの記事で解説していますのでぜひそちらを参考にして下さい。

目次   

01. OpenGLで点を描画する関数

02. 点を動かすための関数

03. 点を動かすための処理

04. Main関数について

05. まとめ


01. OpenGLで点を描画する関数



//初期設定

double posD[2] = { 0.9, 0 }; //ポジションを表す変数

GLfloat colD[3] = { 1.0, 1.0, 1.0 }; //色を表す変数

double velD[2] = { -0.05, 0.05 }; //移動量のための変数



グローバル変数の定義を行います。

これらのグローバル変数はコード内で作成するどの関数からでもアクセスが可能な変数となります。



//点の描画

void drawDot(double position[2]) {

    glPointSize(8); //点の大きさ指定

    //点座標指定

    glBegin(GL_POINTS);

    glVertex2d(position[0], position[1]);

    glEnd();

}



点の描画にはglPointSize()で単純に点を描画します。

()内の数値によって点の大きさを指定します。

glBegin(GL_POINTS)で点を描画するモードに指定します。

glVertex2d()に位置座標を指定して実際に点を描画します。


02. 点を動かすための関数



// 画面の描画

void update(int value) {

    //点の位置の更新

    posD[0] += velD[0];

    posD[1] += velD[1];

    //画面端まで移動した時の方向転換

    if (posD[0] >= 1.0 || posD[0] <= -1.0)

        velD[0] *= -1;

    if (posD[1] >= 1.0 || posD[1] <= -1.0)

        velD[1] *= -1;

    glutPostRedisplay(); //画面の描画

    glutTimerFunc(100, updatePos, 0); //一定時間ごにこの関数を実行

}




update関数は-1.0と1.0となっている画面の端に到達すると逆方向に反射するような仕組みになっています。


03. 点を動かすための処理



//画面を描画

void display(void) {

    glClear(GL_COLOR_BUFFER_BIT); //バッファをクリア

    glColor3d(colDot[0], colDot[1], colDot[2]); //描画色の指定

    drawDot(posDot); //点描画

    glFlush();

    glutSwapBuffers(); //ダブルバッファを交換

}




diaplay関数は以前までのものとは異なりglutSwapBuffers()によってバッファの交換を行います。


04. Main関数について



//メイン関数

int main(int argc, char* argv[]) {

    glutInit(&argc, argv); //GLUTライブラリの初期化

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); //

    glutCreateWindow(argv[0]); //ウィンドウを生成

    glutDisplayFunc(display); //画面描画を行う関数を指定

    init(); //初期化

    //一定時間後に実行する関数を指定

    glutTimerFunc(1000, updatePos, 0);

    glutMainLoop(); //メインープ

    return EXIT_SUCCESS;

}



main関数では前回までと異なる点としてglutTimeFunc(1000, update, 0)で定期的にupdate関数を実行させます。


05. まとめ


お疲れ様でした。

ここまで読んでいただきありがとうございました。

今回はupdate関数とdisplay関数を利用することで実際に点を動かしてみました。