我有一个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
时使用“重画”。
我也尝试使用glPush / Pop Matrix,但2D和3D之间存在冲突。
你能给我一些建议吗?
答案 0 :(得分:3)
您正在尝试实现HUD功能,原则上您需要正常绘制3D场景,然后备份要重复使用的所有OpenGL状态,并使用gluOrtho2D
设置新的投影矩阵或glOrtho
。此外,您想要关闭深度检查。
调用ortho
功能后,您很可能会以屏幕比例绘制,因此您必须相应地计算线条的大小。完成hud后,您可以从堆栈中弹出更改,以便再次绘制。
有关stackoverflow的一些问题涉及绘制OpenGl HUD
在gamedev论坛上进行了相当不错的讨论