Итак, я пытаюсь создать камеру стиля FPS, чтобы исследовать мою сцену, и, похоже, она работает нормально. На данный момент невозможно изменить шаг камеры. Я пытаюсь создать функцию, которая позволяет мне установить камеру на некоторые предопределенные точки обзора, однако, когда вы пытаетесь повернуть камеру после установки ее в новую точку обзора с помощью функции setPosition(), я испытываю скачок не в положении, а в ориентации при первом нажатии кнопки поворота.OpenGL FPS Camera с помощью gluLookAt()
Это моя реализация класса камеры.
Camera::Camera(void)
{
angleX = 0.0;
angleY = 0.0;
directionX = 0.0;
directionZ = -5.0;
directionY = 0.0;
xPos = 0.0;
zPos = 1.0;
yPos = 2.0;
}
void Camera::setPosition(float xDir, float yDir, float zDir, float posX, float posZ, float posY)
{
directionX = xDir;
directionZ = zDir;
directionY = yDir;
xPos = posX;
zPos = posZ;
yPos = posY;
}
Camera::~Camera(void)
{
}
Следующее - это функция обратного вызова специальных клавиш, с отсутствующими функциями, отличными от перемещения камеры.
void specialKeys(int key, int xx, int yy)
{
float fraction = 0.3f;
switch(key)
{
// Camera Controls
case GLUT_KEY_LEFT:
camera.angleY -= 0.05f;
camera.directionX = sin(camera.angleY);
camera.directionZ = -cos(camera.angleY);
break;
case GLUT_KEY_RIGHT:
camera.angleY += 0.05f;
camera.directionX = sin(camera.angleY);
camera.directionZ = -cos(camera.angleY);
break;
case GLUT_KEY_UP:
camera.xPos += camera.directionX * fraction;
camera.zPos += camera.directionZ * fraction;
camera.yPos += camera.directionY * fraction;
break;
case GLUT_KEY_DOWN:
camera.xPos -= camera.directionX * fraction;
camera.zPos -= camera.directionZ * fraction;
camera.yPos -= camera.directionY * fraction;
break;
}
}
Функция обратного вызова дисплей затем имеет следующий код с помощью gluLookAt:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(camera.xPos, camera.yPos, camera.zPos, camera.xPos+camera.directionX, camera.yPos+camera.directionY, camera.zPos+camera.directionZ, 0, 1, 0);
Я не могу понять, почему я получаю эту проблему. Я считаю, что это связано с взаимодействием между установкой камеры и математикой, используемой для ее поворота. Может ли кто-нибудь увидеть, как предотвратить этот переход в ориентации?
Я настраиваю положение камеры в функции клавиатуры обратного вызова, код выглядит следующим образом:
if(key == '1') // Default View
camera = Camera();
if(key == '2') // Ferris Wheel View
camera.setPosition(-0.8, 0.0, -0.6, 3.6, 3.6, 6.5);
if(key == '3') // Fountain Water View
camera.setPosition(0.9, 0.0, -0.4, -0.59, -6.4, 0.6);
Извините, поскольку я, вероятно, не был чист в своем первоначальном вопросе, но камера сразу после инициализации. Например, нажав, например, клавишу «1», я вызываю setPosition(), чтобы установить камеру в определенную позицию. После установки этой позиции камера прыгает на первое вращение. Я изменю свой первоначальный вопрос. – fanatic
Я понял. Проблема заключается в переходе между установленными вами значениями и значениями, которые вы вычисляете. С чем вы вызываете setPosition()? –
В обратном вызове клавиатуры я добавлю код в свой исходный вопрос. – fanatic