Подтвердить что ты не робот

Есть ли разница между gluLookAt() и glFrustum()?

Мой инструктор говорит, что они могут использоваться взаимозаменяемо, чтобы повлиять на матрицу проекции. Он утверждает, что gluLookAt() предпочтительно используется из-за его "относительной простоты из-за его способности определять угол обзора". Это правда? Я видел примеры кода, используя как gluLookAt(), так и glFrustum(), и мне интересно, почему программист их смешивает.

Как в примере cube.c появляется красная книга:

void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3f(1.0, 1.0, 1.0);
  glLoadIdentity(); 

  gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  **//why isn't this a call to glFrustum?** 
  glScalef(1.0, 2.0, 1.0); 
  glutWireCube(1.0);
  glFlush();
}

void reshape(int w, int h)
{

  glViewport(0, 0, (GLsizei) w, (GLsizei) h);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); 
  //why isn't this a call a call to gluLookAt()? 
  glMatrixMode(GL_MODELVIEW);
}
4b9b3361

Ответ 1

Оба glFrustum и gluLookAt выполняют простое матричное умножение. Проверьте справочные страницы для уравнений для этих матриц:

gluLookAt

glFrustum

Оба из них могут быть заменены вызовом glMultMatrix*.

Самое важное отличие состоит в том, что glFrustum используется большую часть времени для создания матрицы перспективных прогнозов (используется внутри gluPerspective), а gluLookAt - удобный метод для определения матриц модельного вида (обычно: реализация камеры).

Ответ 2

gluLookAt влияет на матрицу ModelView, тогда как glFrustum/gluPerspective влияет на матрицу Projection. Это полностью две разные матрицы в конвейере. gluLookAt - это метод утилиты, который представляет собой комбинацию вызовов glRotate и glTranslate для перемещения "камеры" в соответствующую точку в пространстве и указания на нужное место. В то время как glFrustum/gluPerspective - это методы, которые определяют перспективный объем просмотра. Ознакомьтесь с более подробной информацией в Красной книге OpenGL.