Image

OpenGLとC言語で顔を描画してみる - 図形の描画

今回はOpenGLとC言語で顔を描画します。顔の描画に必要なサンプルコードを用いながらOpenGLの基本的な使用方法について解説しています。顔の描画には前回までの内容が必要です。

OpenGLとC言語で顔を描画する


C言語とOpenGLの基本的な使用方法について触れながら扇型の描画について解説します。

目次   

01. OpenGLの基本関数

02. 顔を描画する関数

03. Display関数

04. まとめ


01. OpenGLの基本関数



OpenGLには大きく分けて三つの必須な関数があります。



// 初期化関数

void init(void) {

           //背景色を指定

           glClearColor(0.00.00.01.0);

}



まずは初期化関数です。

主に全体的な初期設定を行います。

ここでは背景色を指定しています。



//描画関数

void display(void) {


}



次にdisplay関数です。

ここでは主にウィンドウ上に表示させるものを記述します。

今回も扇型はdisplay関数で定義します。



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

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

           glutInit(&argc, argv);

           //表示モードを設定

           glutInitDisplayMode(GLUT_RGBA);

           //ウィンドウを生成

           glutCreateWindow(argv[0]);

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

           glutDisplayFunc(display);

           //初期化

           init();

           //メイングループ

           glutMainLoop();

           return EXIT_SUCCESS;

}



最後にmain関数です。

main関数は実際にコードの実行を行うための関数です。


02. 顔を描画する関数



void drawCircle(double pos_x, double pos_y, double color[3], double radius, int startAngle, int endAngle) {

           int i;

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

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

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

                      glColor3d(color[0], color[1], color[2]);

                      glVertex2d (

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

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

                      );

           }

           glEnd(); //描画終了

}




void Face(double posGiven[2], double color_f[3]){

    double size = 0.3;

    double color_f1[3] = {0.996, 0.863, 0.741};

    double color_f2[3] = {0.85, 0.85, 0};

    double color_f3[3] = {0, 0, 0};

    double color_f4[3] = {1.0, 0, 0};

    //顔の輪郭

    drawCircle(posGiven[0], posGiven[1], color_f1, size * 1.0, 0, 360);

    //左目

    drawCircle(posGiven[0] - size * 0.4, posGiven[1] + size * 0.2, color_f3, size * 0.1, 0, 360);

    //右目

    drawCircle(posGiven[0] + size * 0.4, posGiven[1] + size * 0.2, color_f3, size * 0.1, 0, 360);

    //口

    drawCircle(posGiven[0], posGiven[1] + size * 0.2, color_f4, size * 0.8, 225, 315);

    //アフロ

    drawCircle(posGiven[0] + size * 0.05, posGiven[1] + size * 0.8, color_f2, size * 0.3, 0, 360);

    //アフロ

    drawCircle(posGiven[0] + size * -0.3, posGiven[1] + size * 0.8, color_f2, size * 0.3, 0, 360);

    //アフロ

    drawCircle(posGiven[0] + size * 0.4, posGiven[1] + size * 0.8, color_f2, size * 0.3, 0, 360);

}



円を描画する関数は前回までの記事である程度解説しているので省略します。

Face関数ではまずサイズと色の値を格納した変数を定義します。

そして円を描画する関数を部分ごとに呼び出して顔を描画しています。

円を描画する関数を作成しておけばサイズや色などを変更して値を渡すことで円を部品として上記のように顔を描画する関数をつくることができます。


03. Display関数



//描画関数

void disply(void){

    double pos_f3[2] = {0.2, 0.2};

    double color_f3[3] = {0.2, 0.2, 0.9};

    //バッファをクリア

    glClear(GL_COLOR_BUFFER_BIT);

    Face(pos_f3, color_f3);

    glFlush();

}



display関数では先ほど作成したFace関数を呼び出しましょう。


03. まとめ


お疲れ様でした。

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

今回はちょっとした顔を描画しました。

Display関数とブログでは記述しているのにコード上ではdisply()となっていてわかりにくくて申し訳ないと思っています。

ちなみに顔はお気づきの方もいらっしゃるかもしれませんがジョジョのあのキャラをイメージして作成しております。