2010-11-22 59 views
11

我的导师说他们可以互换使用来影响投影矩阵。他认为最好使用gluLookAt(),因为它“由于其定义视角的能力而相对简单”。这是真的?我见过使用gluLookAt()glFrustum()的代码示例,我想知道为什么程序员将它们混合使用。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); 
} 
+1

哼。 gluLookAt和glFrustum设置了非常不同的矩阵(gluLookAt通常不适用于投影矩阵)。你确定你的老师不是在说gluPerspective而不是gluLookAt吗? – Bahbar 2010-11-22 09:51:34

+0

主要区别在于glFrustum是核心OpenGL库的一部分,gluLookAt是一个帮助程序库的一部分,它使用一组不同的参数并调用glFrustum。 OpenGL使用哪一个并没有什么不同,选择是编码偏好之一。 – AndrewS 2013-09-20 18:13:48

回答

12

两个glFrustumgluLookAt执行简单的矩阵乘法。检查方程的手册页的矩阵:

gluLookAt

glFrustum

这些都可以通过一个电话glMultMatrix*被替换。

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

2

gluLookAt影响ModelView矩阵,而glFrustum/gluPerspective会影响投影矩阵。这些完全是两个不同的矩阵。 gluLookAt是一种实用方法,它是glRotate和glTranslate调用的组合,用于将“相机”移动到空间中的适当点并将其指向所需的位置。而glFrustum/gluPerspective是定义透视观看音量的方法。在OpenGL红皮书中查看更多细节。

+0

Hurm?这些函数会影响glMatrixMode设置的矩阵。 – AndrewS 2013-09-20 18:12:27