在glPushMatrix内外实现glulookat

implemenatation of glulookat inside and outside the glPushMatrix?

本文关键字:实现 glulookat glPushMatrix      更新时间:2023-10-16

我知道在opengl中使用gluLookAt(...),glPushMatrix和其他基本的转换东西的目的是什么。我被困在这些代码中。当我在为 opengl 设置适当的要求后,在 glPushMatrix() 中实现 glulookat(.....) 时。代码工作正常,在按键时,立方体通过适当的旋转呈现,但是当我在glPushMatrix()和glPopMatrix()之外实现gluLookAt(....)时,事情变得疯狂了。立方体显示异常行为,最后得到从屏幕上消失了。

gluLookAt(0.0f, 0.0f, 400.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);          
glPushMatrix();
//gluLookAt(0.0f, 0.0f, 400.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);       
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);

glBegin(GL_QUADS);
    // Front Face
    // White
    glColor3ub((GLubyte) 255, (GLubyte)255, (GLubyte)255);
    glVertex3f(50.0f,50.0f,50.0f);
    // Yellow
    glColor3ub((GLubyte) 255, (GLubyte)255, (GLubyte)0);
    glVertex3f(50.0f,-50.0f,50.0f);
    // Red
    glColor3ub((GLubyte) 255, (GLubyte)0, (GLubyte)0);
    glVertex3f(-50.0f,-50.0f,50.0f);
    // Magenta
    glColor3ub((GLubyte) 255, (GLubyte)0, (GLubyte)255);
    glVertex3f(-50.0f,50.0f,50.0f);

// Back Face
    // Cyan
    glColor3f(0.0f, 1.0f, 1.0f);
    glVertex3f(50.0f,50.0f,-50.0f);
    // Green
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f(50.0f,-50.0f,-50.0f);
    // Black
    glColor3f(0.0f, 0.0f, 0.0f);
    glVertex3f(-50.0f,-50.0f,-50.0f);
    // Blue
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(-50.0f,50.0f,-50.0f);
// Top Face
    // Cyan
    glColor3f(0.0f, 1.0f, 1.0f);
    glVertex3f(50.0f,50.0f,-50.0f);
    // White
    glColor3f(1.0f, 1.0f, 1.0f);
    glVertex3f(50.0f,50.0f,50.0f);
    // Magenta
    glColor3f(1.0f, 0.0f, 1.0f);
    glVertex3f(-50.0f,50.0f,50.0f);
    // Blue
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(-50.0f,50.0f,-50.0f);
// Bottom Face
    // Green
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f(50.0f,-50.0f,-50.0f);
    // Yellow
    glColor3f(1.0f, 1.0f, 0.0f);
    glVertex3f(50.0f,-50.0f,50.0f);
    // Red
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex3f(-50.0f,-50.0f,50.0f);
    // Black
    glColor3f(0.0f, 0.0f, 0.0f);
    glVertex3f(-50.0f,-50.0f,-50.0f);
// Left face
    // White
    glColor3f(1.0f, 1.0f, 1.0f);
    glVertex3f(50.0f,50.0f,50.0f);
    // Cyan
    glColor3f(0.0f, 1.0f, 1.0f);
    glVertex3f(50.0f,50.0f,-50.0f);
    // Green
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f(50.0f,-50.0f,-50.0f);
    // Yellow
    glColor3f(1.0f, 1.0f, 0.0f);
    glVertex3f(50.0f,-50.0f,50.0f);
// Right face
    // Magenta
    glColor3f(1.0f, 0.0f, 1.0f);
    glVertex3f(-50.0f,50.0f,50.0f);
    // Blue
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(-50.0f,50.0f,-50.0f);
    // Black
    glColor3f(0.0f, 0.0f, 0.0f);
    glVertex3f(-50.0f,-50.0f,-50.0f);
    // Red
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex3f(-50.0f,-50.0f,50.0f);
glEnd();
glPopMatrix();
gluLookAt

活动矩阵堆栈的当前最顶层元素与查看矩阵一起替换,并用此矩阵替换最顶层元素。

推送和弹出是标准的堆栈操作。Push 创建最顶层元素的副本并将其推送到堆栈顶部,pop 将其删除。

因此,您在 push-pop 块中所做的任何更改都会通过 pop 操作恢复。但是在堆栈帧(推-弹出)之外,更改将累积。如果在 push-pop 之外的gluLookAt之前放置一个glLoadIdentity,它也可以工作,但那是因为您将矩阵重置为合理的值,而不是在上一个渲染中存在的内容之上工作。