2014-02-11 13 views
1

45 단일 지점에서 OpenGL 투영을 이해하려고합니다. 컨텍스트 렌더링에 QGLWidget을 사용하고 프로젝션 매트릭스에 QMatrix4x4를 사용하고 있습니다. 여기서 연신 기능을OpenGL ortho, 원근 투영 및 절두체 투영

attribute vec4 vPosition;  
     uniform mat4 projection; 
     uniform mat4 modelView; 
     void main() 
     { 
      gl_Position = projection* vPosition; 
     }  

     void OpenGLView::Draw() 
     { 
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glUseProgram(programObject); 
    glViewport(0, 0, width(), height()); 

    qreal aspect = (qreal)800/((qreal)600); 
    const qreal zNear = 3.0f, zFar = 7.0f, fov = 45.0f; 

    QMatrix4x4 projection; 
    projection.setToIdentity(); 
    projection.ortho(-1.0f,1.0f,-1.0f,1.0f,-20.0f,20.0f); 
    // projection.frustum(-1.0f,1.0f,-1.0f,1.0f,-20.0f,20.0f); 
    // projection.perspective(fov,aspect,zNear, zFar); 

    position.setToIdentity(); 
    position.translate(0.0f, 0.0f, -5.0f); 
    position.rotate(0,0,0, 0); 

    QMatrix4x4 mvpMatrix = projection * position; 

    for (int r=0; r<4; r++) 
     for (int c=0; c<4; c++) 
      tempMat[r][c] = mvpMatrix.constData()[ r*4 + c ]; 

    glUniformMatrix4fv(projection, 1, GL_FALSE, (float*)&tempMat[0][0]); 

    //Draw point at 0,0 
    GLfloat f_RefPoint[2]; 
    glUniform4f(color,1, 0,1,1); 
    glPointSize(15); 
    f_RefPoint[0] = 0; 
    f_RefPoint[1] = 0; 
    glEnableVertexAttribArray(vertexLoc); 
    glVertexAttribPointer(vertexLoc, 2, GL_FLOAT, 0, 0, f_RefPoint); 
    glDrawArrays (GL_POINTS, 0, 1);    
     } 

관측이다

1) projection.ortho

: 윈도우 상이한 z- 축 값을 가지는 점을 번역에 렌더링 포인트 효과

2) 돌기가없는 .frustum : 요점은 단지 포인트가 translate (0.0f, 0.0f, -20.0f)로 변환됩니다.

3) projection.perspective : 포인트가 화면에 나타나지 않습니다.

누군가가 나를 이해하는 데 도움이 될 수 있습니까?

답변

2
  1. 오르토 영사법은 이러한 방식으로 작동합니다. 서로 다른 예측의 차이점에 대해 일부 이미지 또는 동영상을 검색하는 것이 좋습니다.
  2. Z 좌표로 포인트 변환을 보는 방법을 모르겠지만 정사각형을 사용하면 더 멀리 번역하면 더 작아집니다 (정사각형으로 동일하게 유지됨). this value should be positive 동안 zNear에 -20.0f를 사용하면 문제가 발생합니다. 이 메서드에 삽입 된 값은 대부분 field of view, aspect ratio으로 생성되어야합니다 ... 어쨌든 zNear에 가까운 값과 zFar 이상의 값을 볼 수 없습니다.
  3. 이것은 frustum과 동일하지만 이미 시야, 종횡비로 매개 변수를 취합니다. 아무 것도 보이지 않는 이유는 zNear가 3.0f이고 요점은 .0f 길이입니다. 포인트를 번역하면 볼 수 있지만 3.0f에서 7.0f (3.0f는 zNear, 7.0f는 zFar)로 변환 해보십시오. 대안은 zFar를 증가 시키거나 투영 행렬을 역방향으로 변환합니다. 또는 대부분의 경우 귀하의 "카메라"를 조작 할 수있는 사용하기 쉬운 도구를 제공하기 때문에 프로젝션 매트릭스에 "보기"시스템을 추가하는 것이 좋습니다. 대부분의 경우 찾고있는 포인트를 설정할 수 있습니다. 당신이 찾고있는 포인트 벡터.
+0

Matic에 감사드립니다. –