问题 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);
}

8980
2017-11-22 00:09


起源

哼。 gluLookAt和glFrustum设置了非常不同的矩阵(gluLookAt确实如此) 不 通常应用于投影矩阵)。你确定你的导师不是在谈论gluPerspective而不是gluLookAt吗? - Bahbar
主要区别在于glFrustum是核心OpenGL库的一部分,而gluLookAt是一个辅助库的一部分,它接受一组不同的参数,然后调用glFrustum。它对你使用的OpenGL没有任何影响;选择是编码偏好之一。 - AndrewS


答案:


glFrustum 和 gluLookAt 执行简单的矩阵乘法。查看手册页以获取这些矩阵的方程式:

gluLookAt

glFrustum

这两个都可以用a代替 glMultMatrix* 呼叫。

最重要的区别在于 glFrustum 大部分时间用于建立透视投影矩阵(由内部使用) gluPerspective),和 gluLookAt 是一种指定模型 - 视图矩阵的便捷方法(通常:实现相机)。


12
2017-11-22 00:30





gluLookAt影响ModelView矩阵,而glFrustum / gluPerspective影响Projection矩阵。这些完全是管道中的两个不同矩阵。 gluLookAt是一种实用方法,它是glRotate和glTranslate调用的组合,用于将“摄像机”移动到空间中的适当点并将其指向所需位置。然而,glFrustum / gluPerspective是定义透视观察体积的方法。查看OpenGL红皮书中的更多详细信息。


2
2018-06-27 05:09



Hurm?这些函数会影响glMatrixMode设置的矩阵。 - AndrewS