Поворот камеры (OpenGL) - PullRequest
       4

Поворот камеры (OpenGL)

2 голосов
/ 16 августа 2010

У меня проблемы с классом камеры, который я пытаюсь использовать в своей программе. Когда я изменяю camera_target вызова gluLookAt, вся моя местность вращается, а не только камера, вращающаяся, как и должна.

Вот код из моего метода рендеринга:

camera->Place();

    ofSetColor(255, 255, 255, 255);

 //draw axis lines
 //x-axis
 glBegin(GL_LINES);
 glColor3f(1.0f,0.0f,0.0f);
 glVertex3f(0.0f,0.0f,0.0f);
 glVertex3f(100.0f, 0.0f,0.0f);
 glEnd();

 //y-axis
 glBegin(GL_LINES);
 glColor3f(0.0f,1.0f,0.0f);
 glVertex3f(0.0f,0.0f,0.0f);
 glVertex3f(0.0f, 100.0f,0.0f);
 glEnd();

 //z-axis
 glBegin(GL_LINES);
 glColor3f(0.0f,0.0f,1.0f);
 glVertex3f(0.0f,0.0f,0.0f);
 glVertex3f(0.0f, 0.0f,100.0f);
 glEnd();

 glColor3f(1,1,1);

 terrain->Draw();

И методы rotate и place из моего класса камеры:

void Camera::RotateCamera(float h, float v){
hRadians += h;
vRadians += v;

cam_target.y = cam_position.y+(float)(radius*sin(vRadians));
cam_target.x = cam_position.x+(float)(radius*cos(vRadians)*cos(hRadians));
cam_target.z = cam_position.z+(float)(radius*cos(vRadians)*sin(hRadians));

cam_up.x = cam_position.x-cam_target.x;
cam_up.y = ABS(cam_position.y+(float)(radius*sin(vRadians+PI/2))) ;
cam_up.z = cam_position.z-cam_target.z;
}

void Camera::Place() {
//position, camera target, up vector
gluLookAt(cam_position.x, cam_position.y, cam_position.z, cam_target.x, cam_target.y, cam_target.z, cam_up.x, cam_up.y, cam_up.z);
}

Проблема в том, что вся камера движется вокруг камеры, а камера должна просто вращаться.

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ - Нашел несколько отличных уроков и, учитывая ответы здесь, я сделал лучший класс для камеры. Спасибо, ребята

Ответы [ 3 ]

1 голос
/ 16 августа 2010

С точки зрения местности, да, камера вращается. Но, так как ваш взгляд с POV камеры, когда вы поворачиваете камеру, кажется, что местность вращается. Это поведение, которое gluLookAt () предназначено для создания. Если есть что-то еще, что вы ожидали, вам нужно будет вращать только геометрию, которую вы хотите повернуть, и не пытаться вращать, используя gluLookAt ().

Обновление 1: на основе приведенного ниже обсуждения попробуйте следующее:

void Camera::RotateCamera(float h, float v)
{ 
  hRadians += h; 
  vRadians += v; 

  cam_norm.x = cos(vRadians) * sin(hRadians); 
  cam_norm.y = -sin(vRadians);
  cam_norm.z = cos(vRadians) * sin(hRadians); 

  cam_up.x = sin(vRadians) * sin(hRadians);
  cam_up.y = cos(vRadians);
  cam_up.z = sin(vRadians) * cos(hRadians);
} 

void Camera::Place()
{ 
  //position, camera target, up vector 
  gluLookAt(cam_pos.x, cam_pos.y, cam_pos.z,
            cam_pos.x+cam_norm.x, cam+pos.y+cam_norm.y, camp_pos.z+cam_norm.z,
            cam_up.x, cam_up.y, cam_up.z); 
} 

Отделение камеры в норме (направление камеры смотрит) от положения позволяет вам независимо изменять положение, панорамирование и наклон ... то есть вы можете изменить положение, не пересчитывая векторы нормали и вверх.

Отказ от ответственности: это не проверено, то, что я мог сделать на обратной стороне листа бумаги. Предполагается правосторонняя система координат и вращение панорамирования применяется перед наклоном.

Обновление 2: Получено с использованием линейной алгебры, а не геометрии ... опять же, не проверено, но я уверен в этом.

0 голосов
/ 16 августа 2010

Разве это не должно быть?:

cam_up.x = cam_target.x - cam_position.x;

cam_up.y = ABS(cam_position.y+(float)(radius*sin(vRadians+PI/2))) ;

cam_up.z = cam_target.z - cam_position.z;

Возможно, вам следует также нормализовать cam_up. НТН

0 голосов
/ 16 августа 2010

Что ж, вращение камеры или вращение вокруг нее вокруг местности выглядит практически одинаково.Если вы хотите вращать камеру вокруг фиксированной точки местности, вам нужно изменить положение камеры, а не цель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...