角落中的OpenGL绘图轴

时间:2013-04-16 04:44:55

标签: c++ qt opengl

我一直在寻找如何在我的OpenGL场景中绘制指标轴。该项目嵌套在Qt OpenGL小部件中,但我认为该问题与Qt无关。

我在这里和多年前的论坛上发现了建议存储视口和数据,为Botttom角加载新的,应用我的旋转和绘制,然后恢复矩阵。这似乎对我最有利,但我猜我仍然缺少一些关于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();

}

没有调用绘图轴功能仍然给我我的飞机,有了它,我得到一个大的空白场景。我是否遗漏了一些关于如何实现drawAxis的内容?我应该为这个功能设置另一个相机吗?

1 个答案:

答案 0 :(得分:0)

  • 您可以使用glPushMatrix()和glPopMatrix()来保存和恢复Projection和ModelView矩阵的状态。
  • 您没有将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);
}