Image

OpenGLとC言語で簡単な図形の描画 - 短形と円

OpenGLとC言語で図形の描画を解説します。短形と円の描画方法についてサンプルコードを用いながら解説します。

OpenGLとC言語で簡単な図形の描画

今回は前回のXcodeの設定の続きということで早速OpenGLとC言語を使用して図形を描画してみようと思います。

OpenGLとC言語を使用することができる方であれば当記事の内容は行うことが可能ですのでぜひ参考までに。



目次   

01. OpenGLの初期化関数について

02. OpenGLの短形のコード

03. OpenGLの円のコード

04. Display関数について

05. Main関数について

06. まとめ


01. OpenGLの初期化関数について


とりあえずまずは必要なヘッダーファイルをインポートしましょう。ヘッダーファイルというのはC言語で記述されたC言語のためのOpenGLを使用するためのコードを集めたファイルのことです。



#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <OpenGL/OpenGL.h>

#include <GLUT/GLUT.h>



今回は必要なヘッダーファイルは上記の三つを書いておけば問題ありません。使わないファイルもあるかもしれませんが問題はないので書いておきましょう。

ちなみにWindowsユーザーの場合は下から2行分のOpenGLに関するヘッダーファイルは記述方法が異なるので注意して下さい。

後ほどWindows版のヘッダーファイルの記述は書いておきます。


 

// 初期化関数

void init(void) {

           //背景色を指定

           glClearColor(0.0, 0.0, 0.0, 1.0);

}

 


初期化関数はコード全体で初めに行う関数です。

今回は初期化関数で背景色を指定しています。


02. OpenGLの短形のコード


まずは短形のコードを書いておきます。



//短形描画

void Shortform(double position[2], double size[2], double color[3]) {


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

           glBegin(GL_LINE_LOOP);

           glVertex2d(pos[0], position[1]); //点Aの座標

           glVertex2d(pos[0] + size[0], position[1]); //点Bの座標

           glVertex2d(pos[0] + size[0], position[1] - size[1]); //点Cの座標

           glVertex2d(pos[0], position[1] - size[1]); //点Dの座標

           glEnd();


}



glColor3d()によって図形の色を指定します。

glBegin()で図形の形式を選択します。

GL_LINE_LOOPの他にも図形を描くための種類を選択しています。今回の場合はプロットした点と点を線で繋ぐようにしています。

glVertex2d()は2Dの図形を描画するために点をプロットしています。

glEnd()は描画を終了させます。


03. OpenGLの円のコード



//円描画関数

void Circle(double position_x, double position_y, double radius, int startAngle, int endAngle) {

           int i;

           glBegin(GL_LINE_STRIP); //折れ線の描画開始

           for (i = startAngle; i <= endAngle; i += 360.0 / 36) {

                      glColor3d(i / 360.0, i / 360.0, i / 360.0); //描画色を指定

                      glVertex2d (

                                  position_x + radius * cos (3.14 * i / 180), //線分のx座標

                                  position_y + radius * sin (3.14 * i / 180//線分のy座標

                      );

           }

           glEnd(); //描画終了

}



Circle関数は先ほどと同様にまずglColor3dで色を指定します。

glVertex2dでx座標とy座標を指定して点の描画を行います。

今回は360度を36で分割した分の点をfor文を使用して描画することで円を再現しています。

最後にglEnd()で描画を終了します。


04. Display関数について


display関数では作成した関数を呼び出して実際にウィンドウを生成し図形を描画します。



//描画関数

void display(void) {

           double pos[2], size[2], color[3];

           //バッファをクリア

           glClear(GL_COLOR_BUFFER_BIT);

 

           pos[0] = -0.2; //点Aのx座標

           pos[1] = 0.2; //点Aのy座標

           size[0] = 0.4; //点B~Dのx座標(点Aのx座標からの変化量)

           size[1] = 0.4; //点B~Dのy座標(点Aのy座標からの変化量)

           color[0] = 1.0; //線の色(赤)

           color[1] = 0.5; //線の色(緑)

           color[2] = 0.0; //線の色(青)

           Shortform(pos, size, color); //短形描画関数の呼び出し

           // Step 3: 円の描画

           Circle (0.0, 0.0, 0.5, 0, 360); //円描画関数の呼び出し

           glFlush(); //命令実行


}



一行目で変数を定義し関数へ渡す値を作成しています。

次にバッファのクリアは必ず行いましょう。

そして実際に関数の引数に対応する値を渡して関数を呼び出します。

最後にglFlush()を忘れずに記述しましょう。


05. Main関数について



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

           //GLUTライブラリを初期化

           glutInit(&argc, argv);

           //表示モードを設定

           glutInitDisplayMode(GLUT_RGBA);

           //ウィンドウを生成

           glutCreateWindow(argv[0]);

           //描画を行う関数を指定

           glutDisplayFunc(display);

           //初期化

           init();

           //メイングループ

           glutMainLoop();

           return EXIT_SUCCESS;

}




main関数で上記のコードを実行させます。

なおそれぞれのコードにはコメントアウトで書いてある通りの意味があります。


06. まとめ


お疲れ様でした。

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

今回は関数で定義した短形の描画を行いました。