#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
, теперь это работает отлично, большое спасибо 🙂