단일 개체를 시각화하기위한 OpenGL 장면을 올바르게 설정하는 방법


2

내 메시 도구 키트에 대한 간단한 시각화 프로그램을 작성해야합니다. 내가 작업하고있는 객체는 항상 [-1,1]^3 상자 안에 있으므로 객체가 사용자에게 완전히 보이도록해야합니다. 나는 또한 사용자가 물체를 "날아 다니는"것처럼 물체 주위의 카메라를 회전시킬 수있는 가능성을 원합니다. 모양 변경 기능은 초기 설정시와 비주얼 컨트롤의 각 크기를 조정 한 후 호출 할

static void Reshape(int w, int h) 
{ 
    glViewport(0,0,(GLsizei) w, (GLsizei) h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    float maxDistance = sqrt(2); 
    if (w <= h) 
    { 
     glOrtho(-maxDistance, maxDistance, -maxDistance * (GLfloat)h/(GLfloat)w, 
      maxDistance * (GLfloat)h/(GLfloat)w, -6.0, 6.0); 
    } 
    else 
    { 
     glOrtho(-maxDistance * (GLfloat)w/(GLfloat)h, maxDistance * (GLfloat)w/(GLfloat)h, 
      -maxDistance, maxDistance, -6.0, 6.0); 
    } 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

static void PolarView(GLdouble distance, GLdouble twist, GLdouble elevation) 
{ 
    double centerx, centery, centerz; 
    double eyex, eyey, eyez; 

    eyex = distance * cos(-twist) * cos(elevation); 
    eyey = distance * sin(-twist) * cos(elevation); 
    eyez = distance * sin(elevation); 
    centerx = centery = centerz = 0; 

    gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, 0, 0, 1); 
} 

에서, PolarView 기능을 각각라고

어떤 각도와 거리 이상으로 다시 그리기 :

그건 내가이 일을 해요 방법 3의 제곱근보다 (정말로 중요합니까?). 이 코드는 큐브 또는 구와 같은 볼록한 오브젝트와 잘 작동하지만 토러스 오브젝트에 문제가 있습니다 (일부는 다른 오브젝트를 통해 볼 수 있습니다). 그래서 깊이 테스트에 관한 것입니다. 셋업에 어떤 문제가 있습니까? 스크린 샷 :
Bad torus http://s5.tinypic.com/1039b1y.jpg
Bad torus filled http://s5.tinypic.com/2h54paf.jpg
나는 인터넷에서 몇 가지 검색을 만들어 내 근거리 및 원거리 평면 매개 변수에 문제가있을 때 이러한 문제가 경우에 일어날 수있는 것으로 나타났습니다. 내 경우에 이들에 대한 올바른 값은 무엇입니까? 내 그리기 절차 보이는 같은 :

glEnable(GL_DEPTH_TEST); 
glClearDepth(1); 
glPolygonMode(GL_FRONT, GL_LINE); //Changing of GL_LINE to GL_FILL doesn't fixing my problem, it just changing the appearance of the model. 
glClearColor(BackColor.R/255.0f, BackColor.G/255.0f, BackColor.B/255.0f, 1); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
PolarView(sqrt(3), _phi, _theta); 
//.. only draws 

내 PIXELFORMATDESCRIPTOR : 지금까지 내 근처에 대한

  • 스왑 값 :이 해결하는 몇 가지 방법을 발견했습니다

     PIXELFORMATDESCRIPTOR pfd = 
        { 
         sizeof(PIXELFORMATDESCRIPTOR), 
         1, 
         PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, 
         PFD_TYPE_RGBA, 
         24, 
         0, 
         0, 
         0, 
         0, 
         0, 
         0, 
         0, 
         0, 
         0, 
         0, 
         0, 
         0, 
         0, 
         32, //Depth buffer size 
         0, 
         0, 
         PFD_MAIN_PLANE, 
         0, 
         0, 
         0, 
         0 
        }; 
    

    비행기

  • glDepthFunc를 GL_GREATER로 설정하고 g lClearDepth to 0
    오류가 짝수이면 확인을 마친 후 코드가 올바르게 작동합니다. 그러나 첫 번째 오류는 어디에 있습니까?
  0

문제가 무엇인지 정확히 알아야합니다. 이해하기 어렵습니다. 어쩌면 스크린 샷일까요? 22 feb. 092009-02-22 14:54:03

0

"나는 자동으로 내 전체 모델을 표시하는보기를 계산할 수있는 방법 8.070은? (내가 경계 영역 및 벡터까지 알고있다.)"OpenGL FAQ 8에서 항목은 내 질문에 대답을 제공합니다. 그러나, 제 설정은 약간 다릅니다. 다시 작성된 PolarView 및 Reshape 기능은 다음과 같습니다.

static void Reshape(int w, int h) 
{ 
    float diameter = sqrt(3); 
    glViewport(0, 0, (GLsizei)w, (GLsizei)h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    GLdouble zNear = 1; 
    GLdouble zFar = zNear + diameter * 2; 
    GLdouble left = -diameter; 
    GLdouble right = diameter; 
    GLdouble top = -diameter; 
    GLdouble bottom = diameter; 
    double aspect = (double)w/(double)h; 
    if (aspect < 1) 
    { 
     bottom /= aspect; 
     top /= aspect; 
    } 
    else 
    { 
     left *= aspect; 
     right *= aspect; 
    } 
    glOrtho(left, right, bottom, top, zNear, zFar); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

static void PolarView(GLdouble twist, GLdouble elevation) 
{ 
    float diameter = sqrt(3); 
    double distance = diameter * 2; 
    double centerx, centery, centerz; 
    double eyex, eyey, eyez; 

    eyex = distance * cos(twist) * cos(elevation); 
    eyey = distance * sin(twist) * cos(elevation); 
    eyez = distance * sin(elevation); 
    centerx = centery = centerz = 0; 
    gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, 0, 0, 1); 
} 

2

OpenGL FAQ 12을 읽으셨습니까?

코드에 대해 의심스러운 한 가지는 부정적인면 근처입니다. 음수 Z 값은 카메라 뒤에 있으며, 일반적으로 3D 장면을 렌더링 할 때 실수입니다. 그러나, 그 자체가 당신이보고있는 문제를 야기해서는 안되며, Z에 대한 범위 [-6,6]는 이러한 종류의 장면에 대해 많은 정밀도를 제공해야합니다.

glEnable(GL_DEPTH_TEST)으로 전화 하시겠습니까? 각 프레임에 GL_DEPTH_BUFFER_BITglClear 개로 전달 하시겠습니까?

업데이트 : glPolygonMode(GL_FRONT, GL_LINE)로 전화하십시오. 이것은 앞쪽을 향한 삼각형이 외곽선으로 만 그려진다는 것을 의미합니다. 즉, 앞쪽 삼각형 A가 다른 앞쪽 삼각형 B와 겹치면 A를 통해 B의 가장자리까지 볼 수 있습니다. 볼록한 몸체에서는 이것이 일어날 수 없습니다 , 그래서 당신은 그 문제를 알아 채지 못합니다.

트라이앵글을 삼각형 뒤에 숨기려면 모드 GL_FILL을 사용하여 삼각형을 채워야합니다.와이어 프레임의 그림을 얻으려면, 당신은 흰색 채우기와 모델을 그릴 필요, 다음과 같이 검은 윤곽 다시 모델을 그릴 :

 
glDepthFunc(GL_LEQUAL); 
glPolygonMode(GL_FRONT, GL_FILL); 
/* draw the model in white */
glDepthFunc(GL_EQUAL); 
glPolygonMode(GL_FRONT, GL_LINE); 
/* draw the model again in black */

아이디어는 모델을 통해 두 번째 패스에, 우리는 할 것입니다 첫 번째 패스에서 그려지는 삼각형에 의해 가려지지 않는 윤곽선을 그 카메라에 더 가깝게 (즉, 낮은 Z로) 그립니다.

다른 생각 : 나는 카메라가 잘못된 방향을 가리킬 수도 있다고 생각합니다. 이것은 왜 glOrtho 관점에서 장면이 잘못 그리는 지, 그리고 glFrustum 관점에서는 전혀 왜곡되지 않는지를 설명합니다. glOrtho 경우 전체 장면은 카메라 뒤에 으로 그려져 있습니다.; 그것이 왜 Z 순서로 잘못된 방향으로 그려지고있는 것입니다. 니어 플레인을 양수로 설정하면 전체 장면이 선택됩니다.

  0

링크가 도움이되지 않았습니다. 내 질문에 더 많은 코드를 추가했습니다. 22 feb. 092009-02-22 17:24:34

  0

문제가 아직 내 polygon (GL_LINE 또는 GL_FILL)을 그리는 방법은 중요하지 않습니다. GL_LINE으로 렌더링 할 때 깊이 버퍼를 사용해서는 안된다는 증거가 있습니까? 22 feb. 092009-02-22 18:03:36

  0

위에서 추천 한대로 그려진 모델의 스크린 샷을 찍을 수 있습니까? 22 feb. 092009-02-22 18:12:56

  0

평면으로 채워진면이있는 새롭게 렌더링 된 모델을 업로드했습니다. 22 feb. 092009-02-22 18:26:03

  0

glOrtho를 사용하면 어떤 삼각형이 가깝거나 먼지 알 수 없습니다. 메쉬 생성에 문제가있는 경우 특정 순서로 삼각형을 생성해야합니다. http://home.comcast.net/~fbui/glCullFace.html 22 feb. 092009-02-22 18:31:07

  0

참조 http://home.comcast.net/~fbui/glFrontFace.html 22 feb. 092009-02-22 18:32:06

  0

컬링이 올바르게 작동하고 있다는 것이 확실합니다. 정면 삼각형 만 보아라. 작동하지 않는 깊이 버퍼입니다. glDepthFunc (GL_LEQUAL)를 호출 하시겠습니까? 22 feb. 092009-02-22 18:39:00

  0

glDepthFunc의 기본값은 GL_LESS입니다. 그러면 문제가되지 않을 것입니다. 22 feb. 092009-02-22 18:47:55

  0

glOrtho 대신 glFrustum을 시도하면 장면이 어떻게 생깁니 까? (플러스 플레인을 사용하는지 확인하십시오) 22 feb. 092009-02-22 18:48:45

  0

glFrustum (-maxDistance, maxDistance, -maxDistance, maxDistance, 0.1, 10)을 사용하면 렌더링 영역이 비게됩니다. 23 feb. 092009-02-23 01:33:50

  0

해결 방법을 찾았습니다. 하지만 카메라를 제대로 설정하려면 어떻게해야합니까? 나는 일정한 거리에서 내 모델의 중심을 바라 볼 수 있도록해야한다. PolarView 기능의 문제점은 무엇입니까? 23 feb. 092009-02-23 03:26:04