Я понимаю, что этот вопрос был задан раньше в stackoverflow, но мне еще предстоит найти ответ, который я полностью понимаю, поэтому я подумал, что получаю некоторую помощь, специфичную для моей ситуации.Как перемещаться по камере с помощью мыши в OpenGL?
В основном я хочу, чтобы мы могли использовать мышь для поворота вокруг оси y. Ниже приведена функция, которую я использую для фактического вращения (углы находятся в градусах).
void CCamera::RotateY (GLfloat Angle)
{
RotatedY += Angle;
//Rotate viewdir around the up vector:
ViewDir = Normalize3dVector(ViewDir*cos(Angle*PIdiv180)
- RightVector*sin(Angle*PIdiv180));
//now compute the new RightVector (by cross product)
RightVector = CrossProduct(&ViewDir, &UpVector);
}
Поскольку я использую GLUT, я использую пассивную функцию для получения координат x, y курсора. И тогда в моем дисплее я имею следующее:
void display(void) {
...
mouseDisplacement = mouseX - oldMouseX;
if (mouseDisplacement > 0) Camera.RotateY(-1.0*abs(mouseDisplacement));
else if (mouseDisplacement < 0) Camera.RotateY(1.0*abs(mouseDisplacement));
oldMouseX = mouseX;
glutWarpPointer(centerWindowX, centerWindowY); // move the cursor to center of window
...
}
Теперь проблема довольно очевидна, так как функция дисплей работает в 60 раз в секунду, курсор мыши просто застревает в середине, когда я пытаюсь переместить его. Если у меня нет цикла функции отображения, вращение действительно лаги и прочее. Итак, каков правильный способ сделать это?
Обратите внимание, что я только ищу, чтобы камера двигалась вправо/влево с помощью мыши. Хотя было бы здорово, если бы я мог заставить его работать как правильный fps, это не очень важно.
Любая помощь очень ценится.
Мой плохо за не ясно. Я уже использую glutPassiveMotionFunc (...) для обновления глобальной переменной, которая является 'mouseX'. Проблема возникает, когда я хочу перемещаться по камере, удерживая мышь в центре. – Bazinga
Ok gotcha. Я считаю, что проблема исходит из вашего расчета дельты. Вы должны рассчитать разницу между текущей позицией курсора и центром окна (где курсор будет установлен после каждого кадра). –
Спасибо, что нашли время, чтобы помочь мне. Я также пробовал то, что вы сказали выше, принимая смещение относительно центральной координаты. Однако, поскольку я обновляю курсор, чтобы оставаться посередине, смещение становится всегда 0 или очень близко к 0. Таким образом, не перемещайте камеру так, как должно быть. – Bazinga