Image

OpenGLとC言語でマウス入力を受け付ける - 入出力

OpenGLとC言語でマウス入力を受け付けつける方法を解説します。ウィンドウ上をクリックした場所を取得したり、クリックしたかどうかを判定します。

OpenGLとC言語でマウス入力を受け付ける

今回はOpenGLとC言語を使用したプログラムコードでマウス入力を受け付ける方法について解説します。

目次   

01. マウス入力を受け付ける関数

02. マウスイベントを作る関数

03. ポインタを使う

04. Display関数

05. Main関数

06. まとめ


01. マウス入力を受け付ける関数



void mouse1(int button, int state){

    int i;

    //左ボタンの操作以外を無視する

    if (button != GLUT_LEFT_BUTTON){

        return;

    }

    if(state == GLUT_DOWN){

        printf("Left button pressed\n");//左ボタンが押された。

    }

    else if (state == GLUT_UP){

        printf("Left button released\n");//左ボタンが離された。

    }

}



引数にはbuttonとstateを定義しています。

buttonは左ボタンが押されたかどうかの判定に使用します。

GLUT_LEFT_BUTTONで左ボタンの入力のみを受け付けます。

state == GLUT_DOWNはボタンが押された状態でstate == GLUT_UPでボタンが離された状態を判定します。



02. マウスイベントを作る関数



double posBegin[2];

double posEnd[2];

double *position = NULL;//座標

double *size = NULL;//サイズ

double *color = NULL;//色



ヘッダーファイルをインポートしたのちにグローバル変数として定義しておきましょう。



void mouse_2(int button, int state, int x, int y){

    int i;

    //左ボタンの操作以外を無視する

    if (button != GLUT_LEFT_BUTTON){

        return;

    }

    if(state == GLUT_DOWN){

        posBegin[0] = (double)x / glutGet(GLUT_WINDOW_WIDTH) * 5 - 1;//x座標の格納

        posBegin[1] = -(double)y / glutGet(GLUT_WINDOW_WIDTH) * 5 + 1;

        printf("Left button pressed (%d, %d) -> (%f, %f)\n", x, y, posBegin[0], posBegin[1]);//左ボタンが押された。

    }

    else if (state == GLUT_UP){

        posBegin[0] = (double)x / glutGet(GLUT_WINDOW_WIDTH) * 5 - 1;//x座標の格納

        posBegin[1] = -(double)y / glutGet(GLUT_WINDOW_WIDTH) * 5 + 1;

        printf("Left button released (%d, %d) -> (%f, &f)\n", x, y, posBegin[0], posBegin[1]);//左ボタンが放された。

    }

    position = (double*)malloc(sizeof(double) * 2);

    size = (double*)malloc(sizeof(double) * 2);

    color = (double*)malloc(sizeof(double) * 3);

    for (i = 0; i < 2; i++){

        position[i] = posBegin[i];

        size[i] = posEnd[i] - posBegin[i];

        if (i == 1){

            size[i] *= -1;

        }

    }

    for (i = 0; i < 3; i++){

        color[i] = (double)rand() / RAND_MAX;//色を配色

    }

}



上にあるマウス入力を受け付ける関数に新たな処理を追加してグローバル変数にマウスを離したときの位置を格納します。


03. ポインタを使う



p_pos = (double*)malloc(sizeof(double) * 2);

p_size = (double*)malloc(sizeof(double) * 2);

p_color = (double*)malloc(sizeof(double) * 3);



グローバル変数として定義したポインタを利用するためにmalloc関数を使用してメモリの確保を行い安全に値を格納します。


04. Display関数について



//短形描画関数

void drawSquare (double pos[2], double size[2], double color[3]){

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

    glBegin(GL_POLYGON);

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

    glVertex2d(pos[0] + size[0], pos[1]);

    glVertex2d(pos[0] + size[0], pos[1] - size[1]);

    glVertex2d(pos[0], pos[1] - size[1]);

    glEnd();

}




//画面を描画

void disply(void){

    glClear(GL_COLOR_BUFFER_BIT);

    if (position != NULL){

        drawSquare(position, size, color);

    }

    glFlush();

    glutPostRedisplay();//指定された関数の呼び出し

}



四角形を描画する関数にグローバル変数であるポインタを引数として与えて四角形の描画を行なっています。

if (position != NULL){}はマウスイベントがあったかどうかを判定します。

マウスイベントがあった場合はposition変数に何らかの値が格納されているのでif文がTrueとなって四角形を描画する関数が呼び出され四角形が描画されます。


05. Main関数について



//main関数

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

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGBA);//表示モード

    glutCreateWindow(argv[0]);

    glutDisplayFunc(disply);

    glutMouseFunc(mouse2);//マウスイベントを扱う

    init();//初期化

    glutMainLoop();//メインループ

    return EXIT_SUCCESS;

}



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

glutMouseFunc(mouse2)を記述することでマウス関数を使用することができます。


04. まとめ


お疲れ様でした。

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

今回はOpenGLとC言語で実装するマウスイベントについての記事でした。

他にもOpenGLやC言語の記事はあるのでぜひ参考にまでに。