문제

OpenGL GLUT 프로그램에서 마우스 스크롤휠을 사용하여 장면을 확대 및 축소하고 싶습니다.어떻게 해야 하나요?

도움이 되었습니까?

해결책 2

존경하는 분 참고하세요 네이트 로빈의 GLUT 라이브러리는 스크롤휠을 지원하지 않습니다.그러나 나중에 GLUT를 구현하면 다음과 같습니다. 프리글루트 하다.

FreeGLUT에서 스크롤 휠을 사용하는 것은 매우 간단합니다.방법은 다음과 같습니다.

스크롤 휠을 스크롤할 때마다 호출되는 콜백 함수를 선언합니다.프로토타입은 다음과 같습니다.

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

(무료)GLUT 함수를 사용하여 콜백을 등록합니다. lutMouseWheelFunc().

glutMouseWheelFunc(mouseWheel);

콜백 함수를 정의합니다.두 번째 매개변수는 스크롤 방향을 지정합니다.+1 값은 앞으로, -1은 뒤로갑니다.

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

    return;
}

그게 다야!

다른 팁

Freeglut의 gluMouseWheelFunc 콜백은 버전에 따라 다르며 X에서는 신뢰할 수 없습니다.표준 마우스 기능을 사용하고 버튼 3과 4를 테스트합니다.

gluMouseWheelFunc 상태에 대한 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에서 언급했듯이 "매우 간단합니다".그는 단지 틀렸어요.

mouseClick 콜백의 아래 스위치 문에서 사례 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