OpenGL GLUT プログラムでマウスのスクロールホイールを使用して、シーンをズームインおよびズームアウトしたいですか? それ、どうやったら出来るの?
3 に答える
Freeglut の glutMouseWheelFunc コールバックはバージョンに依存しており、X では信頼性がありません。標準のマウス機能を使用して、ボタン 3 と 4 をテストしてください。
glutMouseWheelFunc 状態に関する OpenGlut ノート:
マウスに関する情報が不足しているため、現時点でこれを 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が述べたように、それは「非常に単純」です。彼はただ間違っていた。
由緒あるNate Robin の GLUTライブラリはスクロールホイールをサポートしていないことに注意してください。しかし、FreeGLUTのような GLUT の後の実装ではそうです。
FreeGLUT でスクロール ホイールを使用するのは非常に簡単です。方法は次のとおりです。
スクロール ホイールがスクロールされるたびに呼び出されるコールバック関数を宣言します。これはプロトタイプです:
void mouseWheel(int, int, int, int);
(Free)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;
}
それでおしまい!