GLUT положение мыши не обновляется - PullRequest
1 голос
/ 23 декабря 2010

Я поворачиваю камеру в зависимости от положения мыши.Но я хочу, чтобы это было активным, только когда левая или правая кнопка мыши нажата.Проблема с этим кодом заключается в том, что мне нужно отпустить и снова нажать, чтобы программа заметила, что я переместил мышь.

При использовании клавиш клавиатуры и перемещении мыши это работало.* Попытка 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;  
}

Ответы [ 2 ]

2 голосов
/ 26 октября 2014

Вы можете комбинировать glutMouseFunc, glutMotionFunc и glutPassiveMotionFunc для достижения этого.

(1) glutMotionFunc сообщает вам (x, y) вашего курсора в любой момент, только когда нажата кнопка (и) вашей мыши. С другой стороны, glutPassiveMotionFunc сообщает вам (x, y), когда ни одна кнопка не нажата. (Более подробную информацию см. В спецификации перенасыщение ).

(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) вашего курсора в любой момент только при нажатии и удерживании левой / правой кнопки.

Для получения дополнительной информации о том, как объединить эти функции, вы можете проверить часть 3.030 на этом сайте

0 голосов
/ 24 декабря 2010

Я думаю, вам нужно объединить ваш glutMouseFunc с glutMotionFunc .Установите прежнее состояние кнопки мыши и обновите вращение в glutMotionFunc в зависимости от состояния кнопки.

...