2013-01-02 86 views
3

我有一个QGLWidget的子类“GLWidget”,用于呈现3D场景。我可以做旋转和放大它。Qt/OpenGL - 在3D场景的顶部绘制2D“比例线”

我打电话了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); 
    } 

我已经在这个GLWidget渲染2D文本(统计)用“printStats()”功能。我现在想要在这个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场景移动。

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

我想避免使用“overpainting”与重写paintEvent

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

你能给我一些建议来得到它吗?

回答

3

您试图实现HUD功能,原则上您需要以常规方式绘制3D场景,然后备份要重用的所有OpenGL状态,并设置一个新的投影矩阵,其中包括gluOrtho2DglOrtho。另外你想关闭深度检查。

打电话给ortho函数后,你很可能会画屏幕比例,所以你必须相应地计算你的线的大小。一旦你完成了hud,你可以将更改从堆栈中弹出,以便再次绘制。

有与绘制一个OpenGL HUD

,并在gamedev论坛一个相当不错的讨论对付一对夫妇对计算器的问题