2010-12-23 18 views
1

マウスの位置に応じてカメラを回転させています。しかし、これは、マウスの左ボタンまたは右ボタンが押されている場合にのみ有効です。このコードの問題は、私がマウスを動かしたことに気づくためにプログラムをリリースしてもう一度押す必要があることです。GLUTマウスの位置が更新されない

キーボードのキーを使用してマウスを動かすと効果がありました。

glutPostRedisplayを試していますが、私が必要としているか、それを使用する方法がわかりません。

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


if (state == GLUT_DOWN) { 

    if (button == GLUT_LEFT_BUTTON) {mouseM=true;} if (button == GLUT_RIGHT_BUTTON) {mouseN=true;} 
    } if (state == GLUT_UP){ if (button == GLUT_LEFT_BUTTON){mouseM=false;} if (button == GLUT_RIGHT_BUTTON) {mouseN=false;} } 

} 


void mouseMove(int x, int y){ 
    if (x < 0) angleX = 0.0; else if (x > w) angleX = 180.0; else //angleX = 5.0 * ((float) x)/w; angleX = (x-320)/50; angleZ = angleX; angleY= (y-240)/50; 
} 

答えて

0

私はあなたがglutMotionFuncとあなたのglutMouseFuncを結合する必要があると思います。前者にマウスボタンの状態を設定し、ボタンの状態に応じてglutMotionFuncで回転を更新します。

+0

これらの機能を組み合わせる方法の詳細については、このサイトでは3.030部分をチェックしてそれ? – snackbar

+0

Ploughの意味は、マウスの2つのコールバック関数(マウスの位置とボタンのクリック)を別々に扱う必要があることです。 – dm76

1

glutMouseFunc、glutMotionFunc、glutPassiveMotionFuncを組み合わせて使用​​できます。

(1)glutMotionFuncは、マウスのボタンが押されたときにのみ、いつでもカーソルの(x、y)を知らせます。一方、glutPassiveMotionFuncは、ボタンが押されていないとき(x、y)を指示します。 (詳細については、glutの仕様を確認してください)。

(2)は、それぞれ、左ボタンを押し、右ボタン押下イベントを処理するonLeftButton(int型のx、int型のy)とonRightButton(int型のx、int型のy)を調製し、これらの機能を

まず結合します、このような:

void onLeftButton(int x, int y){ 
    //change variables for your glRotatef function for example 
    //(x, y) is the current coordinate and 
    //(preMouseX, preMouseY) is the previous coordinate of your cursor. 
    //and axisX is the degree for rotation along x axis. Similar as axisY. 
    axisX += (y - preMouseY); 
    axisY += (x - preMouseX); 
    ... 
} 

void onRightButton(int x, int y){ 
    //do something you want... 
} 

第二に、glutMouseFuncする機能を用意し、言うonMouse、例えば:

glutMouseFunc(onMouse); 

そしてonMouse関数内で、それは次のようになります:

void onMouse(int button, int state, int x, int y) 
{ 
    if(state == GLUT_DOWN){ 
     if(button == GLUT_RIGHT_BUTTON) 
     glutMotionFunc(onRightButton); 
     else if(button == GLUT_LEFT_BUTTON) 
     glutMotionFunc(onLeftButton); 
    } 
} 

これらの操作を行った後、左右のボタンを押したままにすると、いつでもカーソルの(x、y)を取得できます。私はあなたが描いた私にいくつかの簡単な擬似コードを示すことができる任意のチャンスを意味するもので、完全にはよく分からない https://www.opengl.org/archives/resources/faq/technical/glut.htm

関連する問題