[Work/Class/OpenGL/1_OpenGL1x]

GLUTを使いWindowを作り,イベントをアサインする

GLUT

GLUTとは,GL Utility Toolkitの略で,Processingの様に用意されている関数の内部を書くだけで,Windowを作ったり,マウスイベント,キーボードイベントをアサインできるライブラリである.

/* MakeWindowUsingGlut_1.c */
/* 
  OSXとWindows,LinuxでOpenGL関係のヘッダファイルの名前が違うため
  以下の様に記述する.
*/
#ifdef __APPLE__
#include <OpenGL/opengl.h>
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glut.h>
#endif

void display(void)
{
  //この関数の中身がMainLoop.関数の名前は自由につけられる.
  //(Processingでいう所のdraw関数にあたる)
}

int main(int argc, char *argv[])
{
  //C言語の場合の一番最初に実行される関数
  //(Processingでいう所のsetup関数にあたる)

  // OpenGL/GLUT 環境の初期化
  glutInit(&argc, argv);
  // ウィンドウを開く.引数はWindowの名前.
  glutCreateWindow("MakeWindowsUsingGlut_1");

  // ウィンドウへの描画MainLoop関数の登録
  glutDisplayFunc(display);
  // メインループ開始
  glutMainLoop();
  return 0;
}
/* MakeWindowUsingGlut_2.c */
#ifdef __APPLE__
#include <OpenGL/opengl.h>
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glut.h>
#endif

// プロトタイプ宣言
void display();
void reshape(int width, int height);
void mouse(int button, int state, int x, int y);
void motion(int x, int y);
void keyboard(unsigned char key, int x, int y);

// 標準で呼ばれるように設定する関数displayとreshape
void display(void)
{
  //実際に塗りつぶす.
  //GL_COLOR_BUFFER_BITという定数タグで,glClearColorで指定した色を呼び出す
  glClear(GL_COLOR_BUFFER_BIT);

  //最後に「これまで書いてきた命令を使って描画!」という命令を下す
  //なぜ「Swap Buffers」なのかは後で述べる
  glutSwapBuffers();
}

void reshape(int width, int height){
  //Windowの大きさや形を変更した時に呼ばれる関数とする
  //引数として1番目に変更された後の幅,2番目に変更された後の高さが入ってくる

  //最後に自動的にdisplay関数を呼ぶという設定
  glutPostRedisplay();
}

void mouse(int button, int state, int x, int y){
  //マウスがクリックされた時に呼ばれる関数とする
  //正確には,ボタンを離した時も呼ばれるため,クリックすると2度この関数が呼ばれる
  //xとyには座標,
  //buttonには左ボタンを表す定数タグGLUT_LEFT_BUTTONか
  //右ボタンGLUT_RIGHT_BUTTONが入ってくる
  //stateには,GLUT_DOWN(押した時), GLUT_UP(離した時)が入ってくる
  //組み合わせを if(button == )で指定する
  if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
    //左クリックされた時
    float redColor = 0.0;
    float greenColor = 1.0;
    float blueColor = 1.0;
    //塗りつぶす色を再指定する
    glClearColor(redColor, greenColor, blueColor, 0.0);
  }
  else if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN){
    //右クリックされた時
    float redColor = 1.0;
    float greenColor = 0.0;
    float blueColor = 1.0;
    glClearColor(redColor, greenColor, blueColor, 0.0);
  }

  glutPostRedisplay();
}

void motion(int x, int y){
  //マウスがウィンドウ上でドラッグされた時に呼ばれる関数とする
  //xとyにはマウスが動いた時のxとy
  float redColor = (float)x / 640.0;
  float greenColor = (float)y / 480.0;
  float blueColor = 1.0;
  glClearColor(redColor, greenColor, blueColor, 0.0);

  glutPostRedisplay();
}

void keyboard(unsigned char key, int x, int y){
  //キーボードが押された時に呼ばれる関数とする
  //xとyは,キーボードが押された時のマウス座標が入ってくる
  float redColor = 0.0;
  float greenColor = 0.0;
  float blueColor = 0.0;
  if(key == 'r'){
    redColor = 1.0;
    greenColor = 0.0;
    blueColor = 0.0;
  }
  else if(key == 'g'){
    redColor = 0.0;
    greenColor = 1.0;
    blueColor = 0.0;
  }
  else if(key == 'b'){
    redColor = 0.0;
    greenColor = 0.0;
    blueColor = 1.0;
  }

  glClearColor(redColor, greenColor, blueColor, 0.0);
  glutPostRedisplay();
}


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

  glutInit(&argc, argv);
  // 描画モードの設定,色モードはRGBA, ダブルバッファを設定する
  // ダブルバッファについては後の項で述べる
  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
  
  // ウィンドウの初期サイズを決める
  glutInitWindowSize(640, 480);

  // ウィンドウの生成
  glutCreateWindow("MakeWindowUsingGlut_2");

  // ウィンドウへのdisplay, reshape, mouse, motion, keyboard関数の登録
  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  glutMouseFunc(mouse);
  glutMotionFunc(motion);
  glutKeyboardFunc(keyboard);

  //塗りつぶす色を指定: RGBAでそれぞれ0.0~1.0まで
  //透明度は0.0の時不透明〜1.0で完全に透明
  glClearColor(1.0, 1.0, 1.0, 0.0);

  // メインループ開始
  glutMainLoop();
  return 0;
}