質問

OpenGL GLUT プログラムでマウスのスクロールホイールを使用してシーンをズームインまたはズームアウトしたいのですが?それ、どうやったら出来るの?

役に立ちましたか?

解決 2

由緒正しいことに注意してください ネイト・ロビンのGLUT ライブラリはスクロールホイールをサポートしていません。ただし、後の GLUT の実装では、 無料GLUT する。

FreeGLUT でスクロール ホイールを使用するのは非常に簡単です。その方法は次のとおりです。

スクロール ホイールがスクロールされるたびに呼び出されるコールバック関数を宣言します。これがプロトタイプです:

void mouseWheel(int, int, int, int);

(無料)GLUT関数を使用してコールバックを登録します。 glutMouseWheelFunc().

glutMouseWheelFunc(mouseWheel);

コールバック関数を定義します。2 番目のパラメータはスクロールの方向を指定します。値 +1 は前方、-1 は後方です。

void mouseWheel(int button, int dir, int x, int y)
{
    if (dir > 0)
    {
        // Zoom in
    }
    else
    {
        // Zoom out
    }

    return;
}

それでおしまい!

他のヒント

Freeglut の glutMouseWheelFunc コールバックはバージョンに依存しており、X では信頼できません。標準のマウス機能を使用して、ボタン 3 と 4 をテストします。

OpenGlut は、glutMouseWheelFunc について次のように述べています。

マウスに関する情報が不足しているため、現時点でこれをXに正しく実装することは不可能です。この関数を使用すると、アプリケーションの携帯性が制限されます。(この機能はXで動作しますが、確実にはありません。)ホイールイベントではなく、標準の信頼できるマウスボタンレポートを使用することをお勧めします。

標準の GLUT マウス レポートを使用する:

#include <GL/glut.h>

<snip...>

void mouse(int button, int state, int x, int y)
{
   // Wheel reports as button 3(scroll up) and button 4(scroll down)
   if ((button == 3) || (button == 4)) // It's a wheel event
   {
       // Each wheel event reports like a button click, GLUT_DOWN then GLUT_UP
       if (state == GLUT_UP) return; // Disregard redundant GLUT_UP events
       printf("Scroll %s At %d %d\n", (button == 3) ? "Up" : "Down", x, y);
   }else{  // normal button event
       printf("Button %s At %d %d\n", (state == GLUT_DOWN) ? "Down" : "Up", x, y);
   }
}

<snip...>

glutMouseFunc(mouse);

OPが述べたように、それは「非常にシンプル」です。彼はただ間違っていたのです。

以下の MouseClick コールバックの switch ステートメントのケース 3 と 4 を確認してください。

glutMouseFunc(mouseClick);

...

void mouseClick(int btn, int state, int x, int y) {
  if (state == GLUT_DOWN) {
    switch(btn) {
    case GLUT_LEFT_BUTTON:
      std::cout << "left click at: (" << x << ", " << y << ")\n";
      break;
    case GLUT_RIGHT_BUTTON:
      std::cout << "right click at: (" << x << ", " << y << ")\n";
      break;
    case GLUT_MIDDLE_BUTTON:
      std::cout << "middle click at: (" << x << ", " << y << ")\n";
      break;
    case 3:  //mouse wheel scrolls
      std::cout << "mouse wheel scroll up\n";
      break;
    case 4:
      std::cout << "mouse wheel scroll down\n";
      break;
    default:
      break;
    }
  }
  glutPostRedisplay();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top