2013-01-02 100 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論壇一個相當不錯的討論對付一對夫婦對計算器的問題