OpenGL绘制轴在角落

OpenGL Drawing Axis in Corner

本文关键字:角落 绘制 OpenGL      更新时间:2023-10-16

我一直在寻找如何在我的OpenGL场景中绘制指示器轴。该项目嵌套在Qt OpenGL小部件,但我认为问题是独立于Qt。

我在这里和论坛上发现,从几年前建议存储视口和数据,加载新的底角,应用我的旋转和绘制,然后恢复矩阵。这似乎对我最有好处,但我猜我在OpenGL知识中仍然遗漏了一些关键信息。

现在我只是让它在-x到x之间画一条红线,所以我希望在屏幕左下角有一个红色方块:

void GLWidget::drawAxis()
{
    float tempPro[16];
    float tempMod[16];
    glGetFloatv(GL_PROJECTION_MATRIX, &tempPro[0]);
    glGetFloatv(GL_MODELVIEW_MATRIX, &tempMod[0]);
    glViewport(0, 0, 50, 50);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, 1.0f, 0.1f, 20.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glPushMatrix();
    glBegin(GL_LINES);
        glColor3f(1.0f, 0.0f, 0.0f);
        glEnable( GL_LINE_SMOOTH );
        glLineWidth( 1.5 );
        glVertex3f(-1000, 0, 0);
        glVertex3f(1000, 0, 0);
    glEnd();
    glPopMatrix();
    glViewport(0, 0, 960, 600);
    glMatrixMode(GL_PROJECTION);
    glLoadMatrixf(tempPro);
    gluPerspective(45.0f, (960.0/600.0), 0.1f, 400.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadMatrixf(tempMod);
}

相反,我什么也没有得到,只是一个大的空白场景,我不确定如何继续。我的paintGL就是:

void GLWidget::paintGL()
{    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    Camera.Render();
    glTranslatef(0.0, 0.0, 0.0);
    glBegin(GL_QUADS);
        glColor3f(1.0f, 1.0f, 1.0f);
        glVertex3f(50.0f, 0.0f, 50.0f);
        glVertex3f(50.0f, 0.0f, -50.0f);
        glVertex3f(-50.0f, 0.0f, -50.0f);
        glVertex3f(-50.0f, 0.0f, 50.0f);
    glEnd();
    drawAxis();

}

不调用绘制轴函数仍然会给我一个平面,有了它,我得到一个大的空白场景。我在实现绘图轴的过程中是否遗漏了什么?我应该为这个功能再设置一个摄像头吗?

  • 你可以使用glPushMatrix()和glPopMatrix()来保存和恢复你的投影和模型视图矩阵的状态。
  • 你没有把你的ModelView矩阵设置成任何有用的东西。

试试这样写:

void GLWidget::drawAxis()
{
    glViewport(0, 0, 50, 50);
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    gluPerspective(45.0f, 1.0f, 0.1f, 20.0f);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    //This really has to come from your camera....
    gluLookAt(10.0f,10.0f,10.0f, 0.0f,0.0f,0.0f, 0.0f,0.1f,0.0f);
    glColor3f(1.0f, 0.0f, 0.0f);
    glEnable( GL_LINE_SMOOTH );
    glLineWidth( 1.5 );
    glBegin(GL_LINES);
        glVertex3f(-1000, 0, 0);
        glVertex3f(1000, 0, 0);
    glEnd();
    //Restore View
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glViewport(0, 0, 960, 600);
}