Вы можете комбинировать 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 на этом сайте