2013-04-16 7 views
0

저는 OpenGL 씬에서 인디케이터 - 축을 그리는 방법을 연구했습니다. 이 프로젝트는 Qt OpenGL 위젯에 중첩되어 있지만 문제는 Qt와 별개라고 생각합니다.모서리에있는 OpenGL 드로잉 축

저는 몇 년 전부터 뷰포트와 데이터를 저장하고, botttom 코너에 새로운 것을로드하고, 회전을 적용하고, 그 다음 매트릭스를 복원 할 것을 제안했습니다. 이것은 나에게는 가장 유익한 것 같지만, OpenGL 지식에 대한 중요한 정보가 아직 누락되었다고 생각합니다. 단지를

void GLWidget::drawAxis() 
{ 
    float tempPro[16]; 
    float tempMod[16]; 
    glGetFloatv(GL_PROJECTION_MATRIX, &tempPro[0]); 
    glGetFloatv(GL_MODELVIEW_MATRIX, &tempMod[0]); 

    glViewport(0, 0, 50, 50); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45.0f, 1.0f, 0.1f, 20.0f); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glPushMatrix(); 
    glBegin(GL_LINES); 
     glColor3f(1.0f, 0.0f, 0.0f); 
     glEnable(GL_LINE_SMOOTH); 
     glLineWidth(1.5); 
     glVertex3f(-1000, 0, 0); 
     glVertex3f(1000, 0, 0); 
    glEnd(); 
    glPopMatrix(); 

    glViewport(0, 0, 960, 600); 
    glMatrixMode(GL_PROJECTION); 
    glLoadMatrixf(tempPro); 
    gluPerspective(45.0f, (960.0/600.0), 0.1f, 400.0f); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadMatrixf(tempMod); 
} 

가 대신 내가 할 아무것도 : 지금은

나는 그냥 X에 -x에서 빨간 선 그리기, 그래서 바닥에 빨간색 사각형이 예상은 화면 왼쪽 큰 빈 장면, 그리고 어떻게 진행해야할지 확신이 서지 않습니다. 내 paintGL는 본질적으로 :

void GLWidget::paintGL() 
{  
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 

    Camera.Render(); 

    glTranslatef(0.0, 0.0, 0.0); 

    glBegin(GL_QUADS); 
     glColor3f(1.0f, 1.0f, 1.0f); 
     glVertex3f(50.0f, 0.0f, 50.0f); 
     glVertex3f(50.0f, 0.0f, -50.0f); 
     glVertex3f(-50.0f, 0.0f, -50.0f); 
     glVertex3f(-50.0f, 0.0f, 50.0f); 
    glEnd(); 

    drawAxis(); 

}

그것으로, 나는 큰 빈 장면을 얻을 추첨 축 기능은 여전히 ​​나에게 내 비행기를 제공 호출하지 않습니다. drawAxis를 구현하는 방법에 뭔가 빠졌는가? 그 기능을 위해 다른 카메라를 설치해야합니까?

+0

시도가 라인을 그리기 전에 GL_DEPTH_TEST''와 glDisable''에 대한 호출을 추가. – didierc

+0

함수에서 뷰포트 섹션을 제거하면 일반 장면에서 빨간색 선이 표시되므로 도움이 될지 확실하지 않습니다. 아직 사용하지 않으려 고 시도했습니다. – Poken1151

+0

섹션을 말할 때'glViewport'에서'glBegin'까지를 의미합니까? – didierc

답변

0
  • glPushMatrix() 및 glPopMatrix()를 사용하여 Projection 및 ModelView 행렬의 상태를 저장하고 복원 할 수 있습니다.
  • ModelView 매트릭스를 유용하게 설정할 필요가 없습니다.

이 같은 것을보십시오 :

void GLWidget::drawAxis() 
{ 
    glViewport(0, 0, 50, 50); 

    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    gluPerspective(45.0f, 1.0f, 0.1f, 20.0f); 

    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
    //This really has to come from your camera.... 
    gluLookAt(10.0f,10.0f,10.0f, 0.0f,0.0f,0.0f, 0.0f,0.1f,0.0f); 

    glColor3f(1.0f, 0.0f, 0.0f); 
    glEnable(GL_LINE_SMOOTH); 
    glLineWidth(1.5); 
    glBegin(GL_LINES); 
     glVertex3f(-1000, 0, 0); 
     glVertex3f(1000, 0, 0); 
    glEnd(); 

    //Restore View 
    glMatrixMode(GL_MODELVIEW); 
    glPopMatrix(); 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glViewport(0, 0, 960, 600); 
} 
+0

나는 푸시/팝이 오늘 사용하기에 양심의 가책을 느꼈다고 생각했다. (그래서 여기에 다른 포스트가있다.) 그러나 나는 당신의 제안을 시도했다, 그것은 동일한 빈 화면을 낳았다. Qt에 있었기 때문에 어쩌면 그렇게 생각했기 때문에 원래의 C++/freeglut을 glutMianLoop에서 실행했지만 원래 코드와 제안에 대해서는 여전히 동일한 문제가 발생했습니다. 나는 내가 무엇을 놓치고 있는지 확신 할 수 없다. – Poken1151

+0

은 OpenGL 3.1에서 감가 상각되었지만 glMatrixMode(), glColor3f(), glTranslatef(), glBegin() 및 glEnd()도 마찬가지입니다. 따라서 여전히 고정 기능 파이프 라인을 사용하는 경우 밀어 넣기/팝 :-)을 사용할 수도 있습니다. drawAxis 메서드를 선 그리기의 시작/끝으로 줄입니다. 비행기와 선이 보일 것입니다. 작동하는 경우 뷰포트 만 다시 추가하십시오. 왼쪽 하단에 비행기와 선이 보일 것입니다. 그럼 당신은 다시 프로젝션 및 modelView 매트릭스 작업해야합니다 ... –

+0

와우, 난 정말 현대 OpenGL을 배울 필요합니다. 나는 당신이 제시 한 지침과 스택상의 또 다른 질문들로부터의 2-D 오버레이 (나는 계속 3D를 찾고 있었다)로 작업하게했다. 그래서 저는 모퉁이 축을 보여주고 있습니다 만, 이제는 행렬을 터뜨리면서 광선 선택을 엉망으로 만들고 있습니다. 도와 주셔서 감사합니다. – Poken1151

관련 문제