Qt/OpenGL - 在 3D 场景上绘制 2D "scale line"

标签 qt opengl drawing

<分区>

我有一个 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 上呈现 2D 文本(统计数据)。我现在想在这个 3D 场景上画一条“2D 比例线”。

我通过执行 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 场景移动。

在能够对 3D 对象进行操作的同时锁定此 2D 线的方法是什么?

我想避免使用覆盖 paintEvent 的“overpainting”。

我也尝试使用 glPush/Pop Matrix,但 2D 和 3D 之间存在冲突。

你能给我一些建议吗?

最佳答案

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

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

stackoverflow 上有几个关于绘制 OpenGl HUD 的问题

以及在 Gamedev 论坛上的相当不错的讨论

关于Qt/OpenGL - 在 3D 场景上绘制 2D "scale line",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14116262/

相关文章:

c++ - Qdialog.exec() 是如何返回的

winapi - Win32 - 什么可能导致不正确的绘图?

c++ - QT连接没有匹配的函数可以调用

java - 来自 Java 的 Qt Android : How to call Toast. makeText?

c# - OpenTK/OpenGL : Unable to Get Shaders to Run on VAO

c++ - imageAtomicExchange 无法编译

linux - 如何在 Linux 中没有窗口管理器的情况下使用 OpenGL?

unity3d - 在Unity中画流畅的线条真的有那么难吗?

c++ - 当小部件尺寸发生变化时如何获取信号