Попытка заставить камеру, похожую на мышь, работать в OpenGL на Mac OSX

#c #macos #opengl #macos-carbon

#c #macos #opengl #macos-carbon

Вопрос:

Я работал над демонстрацией в OpenGL и пытался реализовать камеру, похожую на мышь, с частотой кадров в секунду. Я использовал Max OSX Leopard, поэтому мне пришлось использовать Carbon, чтобы получить координаты экрана и вернуть мышь в центр экрана после перемещения, что большую часть времени работает нормально. Ниже приведен соответствующий код из моего метода мыши:

 CGPoint pnt;
pnt.x = glutGet(GLUT_WINDOW_WIDTH)/2   glutGet(GLUT_WINDOW_X);
pnt.y = glutGet(GLUT_WINDOW_HEIGHT)/2   glutGet(GLUT_WINDOW_Y);

int diffX;
int diffY;
CGGetLastMouseDelta(amp;diffX, amp;diffY);

if (diffX == 0 amp;amp; diffY == 0) return;

if ((diffX) > 0)
    angle  = (diffX)/5;
else if ((diffX) < 0)
    angle  = (diffX)/5;

if ((diffY) > 0 amp;amp; pitch < 90)
    pitch  = (diffY)/5;
else if ((diffY) < 0 amp;amp; pitch > -70)
    pitch  = (diffY)/5;

CGDisplayMoveCursorToPoint(0, pnt);
  

Проблема раздражающе проста: при первом вызове CGGetLastMouseDelta она возвращает разницу между положением мыши до запуска программы и центром окна. Это означает, что при запуске программы камера направлена в правильном направлении, как и должно быть, но как только я касаюсь мыши, она переходит в другое положение.

У меня есть еще один вызов для центрирования курсора внутри функции для инициализации всего, показанного ниже:

 CGPoint pnt;
pnt.x = glutGet(GLUT_WINDOW_WIDTH)/2   glutGet(GLUT_WINDOW_X);
pnt.y = glutGet(GLUT_WINDOW_HEIGHT)/2   glutGet(GLUT_WINDOW_Y);
CGDisplayMoveCursorToPoint(0, pnt);
  

Я очень мало знаю о Carbon и искал как сумасшедший, чтобы найти ответ, но безрезультатно. Есть ли что-нибудь еще, что я должен сделать, чтобы избежать этого скачка?

Ответ №1:

CoreGraphics не является Carbon API, поэтому есть большая вероятность, что вы ищете не в том месте. Попробуйте использовать CGAssociateMouseAndMouseCursorPosition .

Комментарии:

1. Я попытался поместить CGAssociateMouseAndMouseCursorPosition(false) в начало моего метода инициализации, похоже, это ничего не меняет. Я тоже не очень много знаю о CoreGraphics, и, похоже, не так много документации, относящейся к тому, что я ищу.

2. Неважно, я не избавлялся от CGDisplayMoveCursorToPoint , теперь это работает отлично, большое спасибо 🙂