Qt/OpenGL - 在3D场景上绘制2D“刻度线”

3

我有一个QGLWidget的子类"GLWidget",在其中渲染了一个3D场景。我可以对它进行旋转和缩放。

我使用一个QTimer调用以下函数:

void GLWidget::processCurrent()
{
    draw();
    printStats();
    glFlush();
    swapBuffers();
}

主要的OpenGL渲染函数"draw()"是:

void GLWidget::draw()
    {
      if (isDisplayFirst)
      {
        isDisplayFirst = false;
        glViewport(0, 0, w_width, w_height);

        glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
        glLoadIdentity(); // Reset The Projection Matrix

        glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
        glLoadIdentity(); // Reset The Modelview Matrixi

        gluPerspective(45.0f, (float)w_width / w_height, g_nearPlane, g_farPlane);
        gluLookAt (0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
        glScalef(0.03f, 0.03f, 0.03f);
      }

      rotateScene();

      glClearColor(0.0 ,0.0, 0.0, 0.0);
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

      glEnable(GL_POINT_SPRITE);
      glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
      glEnable(GL_VERTEX_PROGRAM_POINT_SIZE_NV);

      glEnable(GL_BLEND);
      glBlendFunc (GL_SRC_ALPHA, GL_ONE);

      GLuint vbo_disk = 0;

        glBindBuffer(GL_ARRAY_BUFFER, vbo_disk);
        glVertexPointer(4, GL_DOUBLE, 4*sizeof(double), Galaxy->pos);
        glEnableClientState(GL_VERTEX_ARRAY);

        glColor4f(1.0f, 1.0f, 1.0f, 0.2f);
        glDrawArrays(GL_POINTS, 0, Galaxy->getNumParticles_disk());

        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glDisableClientState(GL_VERTEX_ARRAY);

        glDisable(GL_BLEND);
        glDisable(GL_POINT_SPRITE);
    }

我已经使用“printStats()”函数在GLWidget上呈现了二维文字(统计数据)。现在,我想在这个三维场景中绘制一个“二维刻度线”。

通过在printStats()中进行以下操作,我成功地绘制了这条线:

 glDisable(GL_TEXTURE_2D);
  glColor3f(1.0f, 1.0f, 1.0f);
  glLineWidth(3.0f);
  glBegin(GL_LINES);
  glVertex2d(5, 40);
  glVertex2d(20, 40);
  glEnd();
  glEnable(GL_TEXTURE_2D);

但我的问题是,当我进行旋转或缩放时,这条线会随着3D场景移动。有什么方法可以锁定这条2D线,并能在3D对象上进行操作吗?
我想避免使用覆盖paintEvent的“overpainting”。
我也尝试使用glPush/Pop矩阵,但2D和3D之间存在冲突。
你能给我一些建议吗?
1个回答

3

您正在尝试实现HUD功能,原则上需要正常绘制3D场景,然后备份您想要重用的所有OpenGL状态,并使用gluOrtho2DglOrtho设置新的投影矩阵。此外,您还需关闭深度检查。

在调用ortho函数后,您很可能会以屏幕比例进行绘制,因此您需要相应地计算线条的大小。完成hud后,您可以从堆栈中弹出更改,以便再次绘制。

stackoverflow上有一些关于绘制OpenGl HUD的问题:

以及gamedev论坛上的相当不错的讨论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接