2012-12-13 5 views
2

Итак, я пытаюсь создать камеру стиля 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); 

ответ

2

Скачок происходит потому, что, как вы инициализация переменной directionZ, обратите внимание на:

angleX = 0.0; 
    angleY = 0.0; 
    directionX = 0.0; 
    directionZ = -5.0; 
    directionY = 0.0; 

Но позже вы определяете directionX и directionZ быть:

camera.directionX = sin(camera.angleY); 
camera.directionZ = -cos(camera.angleY); 

сов ограничена о n intervel [-1, 1], а так как угол Y равен 0.0f, directionZ будет установлен в -1. Если вы измените код инициализации, чтобы установить directionZ = -1.0;, вы должны избавиться от прыжка.

Не задавайте направление явно. Вот пример установки угла и вычислительного направления из этого угла:

void Camera::setPosition(float angle, float posX, float posZ, float posY) 
{ 
    xPos = posX; 
    zPos = posZ; 
    yPos = posY; 

    //compute instead of set based on angle 
    angleY = angle; 
    camera.directionX = sin(angleY); 
    camera.directionZ = -cos(angleY); 
} 
+0

Извините, поскольку я, вероятно, не был чист в своем первоначальном вопросе, но камера сразу после инициализации. Например, нажав, например, клавишу «1», я вызываю setPosition(), чтобы установить камеру в определенную позицию. После установки этой позиции камера прыгает на первое вращение. Я изменю свой первоначальный вопрос. – fanatic

+0

Я понял. Проблема заключается в переходе между установленными вами значениями и значениями, которые вы вычисляете. С чем вы вызываете setPosition()? –

+0

В обратном вызове клавиатуры я добавлю код в свой исходный вопрос. – fanatic

 Смежные вопросы

  • Нет связанных вопросов^_^