2013-01-02 2 views
3

3D 장면을 렌더링하는 QGLWidget의 "GLWidget"하위 클래스가 있습니다. 나는 회전을하고 그것을 확대 할 수 있습니다. 이미이 GLWidget에 2D 텍스트 (통계)를 렌더링 한Qt/OpenGL - 3D 장면 위에 2D "눈금 선"그리기

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); 
    } 

:이다 "draw()을"기능을 렌더링

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

메인의 OpenGL :

은 내가 QTimer 다음과 같은 함수를 호출 "printStats()"기능이 있습니다. 이 3D 장면에 "2D scale line"을 그려 보겠습니다.

나는 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 라인을 잠그는 방법은 무엇입니까?

"overpainting"을 사용하여 paintEvent을 덮어 쓰지 않으려합니다.

또한 glPush/Pop Matrix를 사용하려고하지만 2D와 3D간에 충돌이 있습니다.

나에게 조언을 해 주시겠습니까?

답변

3

원칙적으로 3D 장면을 그릴 때 필요한 HUD 기능을 구현하고 재사용 할 모든 OpenGL 상태를 백업하고 gluOrtho2D 또는 glOrtho으로 새 프로젝션 매트릭스를 설정하려고합니다. 또한 깊이 검사를 해제하고 싶습니다.

ortho 함수를 호출 한 후 화면 크기로 그릴 가능성이 높으므로 그에 따라 줄 크기를 계산해야합니다. hud가 끝나면 스택에서 변경 사항을 팝업하여 다시 그릴 수 있습니다.

는 OpenGL HUD

  • 과 gamedev 포럼에서 꽤 괜찮은 토론을 그리기 처리 유래에 대한 몇 가지 질문이 있습니다