【问题标题】:Unexpected gluLookAt behavior with a point draw on OpenGL在 OpenGL 上绘制点的意外 gluLookAt 行为
【发布时间】:2017-09-23 00:34:29
【问题描述】:

我目前正在开发读取 3D obj 文件的软件的打印循环。 我已将读取的 obj 文件存储在变量 tie 中。该变量包含一个 OpenGL 列表。我的目标是能够使用键盘在读取对象周围移动。键盘读取正确实现(我可以通过日志看到)。

问题

当我编译以下代码循环时,gluLookAt 正确执行,我可以通过更改参数值来移动我的对象。

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            light();
            gluPerspective (60.0, 250/(float)250, 0.1, 500.0);
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            gluLookAt(eyeX,eyeY,eyeZ,eyeX+directionX,eyeY+directionY,eyeZ+directionZ,upX,upY,upZ);

            glPushMatrix();
            glRotated(45,0,0,1);
            glTranslated(0,0,50);
            glBindTexture(GL_TEXTURE_2D,texture1);
            //glCallList(xwing); //ICI
            glEnd();
            glPopMatrix();
                glColor3d(1,1,1);
                glDisable(GL_LIGHTING);
                glBindTexture(GL_TEXTURE_2D,texture2);
                GLUquadric* params = gluNewQuadric();
                gluQuadricDrawStyle(params,GLU_FILL);
                gluQuadricTexture(params,GL_TRUE);
                gluSphere(params,100,20,20);
                gluDeleteQuadric(params);
                glEnable(GL_LIGHTING);
            glBindTexture(GL_TEXTURE_2D,texture1);
            glCallList(tie); //ICI
            glPointSize(5.0);
            glBegin(GL_POINTS);
                glColor3f(1.0f,0.0f,0.0f);
                glVertex3f(-1.0f,0.0f,0.0f);
            glEnd();


            SwapBuffers(hDC);
        //} //else
        Sleep(1);

但是当我评论这 4 行时:

glBegin(GL_POINTS);
                glColor3f(1.0f,0.0f,0.0f);
                glVertex3f(-1.0f,0.0f,0.0f);
glEnd();

我的对象不再移动。好像gluLookAt 没有成功执行。 你知道为什么会这样吗?我是否忘记了代码中的某些内容?

【问题讨论】:

    标签: c++ windows opengl glu


    【解决方案1】:

    glBeginglEnd 界定定义一个图元或一组相似图元的顶点。您必须确保,每个 glBegin 后跟一个 glEnd
    这意味着,如果您的Display Lists 包含glBegin,那么它也应该包含glEnd。我强烈建议这样做。另一种可能性是在glCallList 之后手动进行:

    glCallList(tie);
    glEnd();
    


    glPushMatrixglPopMatrix 用于将矩阵推入矩阵堆栈并从矩阵堆栈中弹出矩阵。如果要在视图矩阵中添加模型矩阵,则必须执行以下步骤。

    • 推送视图矩阵glPushMatrix。这会将视图矩阵的副本推送到堆栈上。
    • 将模型矩阵添加到当前视图矩阵(glRotatedglTranslated、...)
    • 绘制模型。 (glCallList, gluSphere, ...)
    • 恢复原始视图矩阵 (glPopMatrix)。


    以某种方式调整您的代码:

    // set up view matrix
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(eyeX,eyeY,eyeZ,eyeX+directionX,eyeY+directionY,eyeZ+directionZ,upX,upY,upZ);
    
    // save view matrix
    glPushMatrix();
    
    // add model matrix
    glRotated(45,0,0,1);
    glTranslated(0,0,50);
    
    // do the drawing
    glColor3d(1,1,1);
    glDisable(GL_LIGHTING);
    glBindTexture(GL_TEXTURE_2D,texture2);
    GLUquadric* params = gluNewQuadric();
    gluQuadricDrawStyle(params,GLU_FILL);
    gluQuadricTexture(params,GL_TRUE);
    gluSphere(params,100,20,20);
    gluDeleteQuadric(params);
    glEnable(GL_LIGHTING);
    glBindTexture(GL_TEXTURE_2D,texture1);
    glCallList(tie); 
    glEnd(); // <-- maybe this could be done in "tie"
    
    // restore the view matrix
    glPopMatrix();
    

    【讨论】:

    • 非常感谢。事实上,在我的列表创建功能中,我首先使用了glEndList,然后使用了glEnd。因此glEnd 没有在我的循环中调用。谢谢
    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多