1

我一直在寻找如何在我的 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();

}

不调用 draw-axis 函数仍然给了我我的飞机,有了它,我得到了一个大的空白场景。我在实现 drawAxis 的过程中是否遗漏了一些东西?我应该为该功能设置另一个相机或类似的东西吗?

4

1 回答 1

1
  • 您可以使用 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);
}
于 2013-04-16T15:08:38.077 回答