Glutマウスイベントの処理

3374 ワード

マウスクリックの検出
OpenGLでマウスイベントを処理するのに非常に便利であるために、GLUTは私たちに関数を登録してくれました.私たちが方法を提供すれば.関数glutMouseFuncを使用すると、マウスイベントが発生すると自動的にメソッドが呼び出されます.
関数のプロトタイプは次のとおりです.
void glutMouseFunc(void(*func)(int button,int state,int x,int y));
  :
func:    click         。

マウスクリックイベントを処理する関数には、必ず4つのパラメータがあります.最初のパラメータは、どのマウスボタンが押されたか、または離されたかを示します.この変数は、GLUT_の3つの値のうちの1つであってもよいです.LEFT_BUTTON GLUT_MIDDLE_BUTTON GLUT_RIGHT_BUTTON
2番目のパラメータは、関数が呼び出されたときにマウスの状態、すなわち押されたり、離されたりしたことを示しています.GLUT_DOWN GLUT_UP
関数が呼び出されるとstateの値はGLUT_DOWNでは、プログラムはGLUT_があると仮定する可能性があります.UPイベントは、マウスがウィンドウの外に移動しても同様です.しかし、プログラムがglutMouseFuncを呼び出してNULLをパラメータとして渡すと、GLUTはマウスの状態を変更しません.
残りの2つのパラメータ(x,y)は、マウスの現在のウィンドウ座標(左上隅を原点とする)を提供します.
検出アクション
GLUTはマウス動作検出能力を提供する.GLUT処理のmotionは、active motionとpassive motionの2種類があります.Active motionとは、マウスが移動し、マウスボタンが押されることを意味します.Passive motionとは、マウスが動くと、マウスボタンが押されていないことを意味します.プログラムがマウスを追跡している場合、マウスの移動中にフレームごとに結果が生成されます.
以前と同様に、マウスイベントを処理する関数(定義関数)を登録する必要があります.GLUTでは、passive motionを追跡し、active motionを追跡する2つの異なる関数を指定できます.
これらの関数のプロトタイプは次のとおりです.
void glutMotionFunc(void(*func)(int x,int y));
void glutPassiveMotionFunc(void (*func)(int x,int y));
  :
Func:      motion    。

motionを扱うパラメータ関数のパラメータ(x,y)は、ウィンドウ上のマウスの座標です.左上隅を原点とします.
マウスがウィンドウに入るか離れるかを検出
GLUTはマウスが離れていることを検出し、ウィンドウ領域に入ることもできます.コールバック関数は、この2つのイベントを処理するように定義できます.GLUTで、この関数を呼び出したのはglutEntryFuncで、関数のプロトタイプは以下の通りです.
void glutEntryFunc(void(*func)(int state));
  :
Func:          。

上の関数のパラメータでは、stateには2つの値がウィンドウから離れるか、ウィンドウに入るかを示しています:GLUT_LEFT GLUT_ENTERED
適用
今実現したい機能は、マウスを使ってドラッグしてシーンの中の物体を回転させ、マウスの左ボタンを押して上下左右にスライドすると、シーンの中の物体が上下左右に回転し、マウスの右ボタンを押して上下にスライドすると、シーンの中の物体が画面に移動したり、画面から移動したりする機能です.
まず、いくつかのグローバル変数を定義します.
bool mouseLeftDown;
bool mouseRightDown;
float mouseX, mouseY;
float cameraDistance;
float cameraAngleX;
float cameraAngleY;

ここで、mouseLeftDownとmouseRightDown変数フラグマウスの左右ボタンが押されているかどうか、mouseXとmouseY変数フラグマウスがスライドしているとき、直前のマウスの位置、cameraDistanceという変数はマウスの右ボタンを押して上下にスライドすることによってシーン内の物体の画面への移動を制御します.CameraAngleXとcameraAngleY変数は、マウスの左ボタンを押してスライドさせることによって、シーン内の物体の回転を制御します.
void mouseCB(int button, int state, int x, int y)
{
    mouseX = x;
    mouseY = y;

    if(button == GLUT_LEFT_BUTTON)
    {
        if(state == GLUT_DOWN)
        {
            mouseLeftDown = true;
        }
        else if(state == GLUT_UP)
            mouseLeftDown = false;
    }

    else if(button == GLUT_RIGHT_BUTTON)
    {
        if(state == GLUT_DOWN)
        {
            mouseRightDown = true;
        }
        else if(state == GLUT_UP)
            mouseRightDown = false;
    }
}

void mouseMotionCB(int x, int y)
{
    if(mouseLeftDown)
    {
        cameraAngleY += (x - mouseX);
        cameraAngleX += (y - mouseY);
        mouseX = x;
        mouseY = y;
    }
    if(mouseRightDown)
    {
        cameraDistance += (y - mouseY) * 0.2f;
        mouseY = y;
    }

    glutPostRedisplay();
}

メイン関数で、対応する関数の登録を呼び出します.
glutMouseFunc(mouseCB);
glutMotionFunc(mouseMotionCB);

シーン内のオブジェクトを描画する前に、次のようにします.
glTranslatef(0, 0, cameraDistance);
glRotatef(cameraAngleX, 1, 0, 0);
glRotatef(cameraAngleY, 0, 1, 0);