2014-02-11 180 views
1

45我正試圖理解單點上的OpenGL投影。我使用QGLWidget爲投影矩陣渲染上下文和QMatrix4x4。下面是繪製函數OpenGL正交,透視和截錐投影

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:點繪製在windown如只翻譯點翻譯(0.0F,0.0F,-20.0f)

3)projection.perspective:一點是永遠不會呈現在屏幕上。

有人能幫我理解這種行爲嗎?

回答

2
  1. 正投影以這種方式工作。我建議您搜索一些圖片或一些關於不同投影之間差異的視頻。
  2. 我不知道你如何在Z座標中看到一個點的平移,但是如果你有一個正方形,它會變得更小,通過將它轉換得更遠(與ortho它將保持不變)。當您使用-20.0f作爲zNear時,此處存在問題,而this value should be positive。在大多數情況下,插入此方法的值應該在field of view, aspect ratio之間生成......無論如何,您將無法看到離zNear更近的任何東西,以及zFar。
  3. 這與平截頭體相同,但已將參數視爲視野,縱橫比。你沒有看到任何東西的原因是你的zNear在3.0f處,並且距離遠。通過翻譯這一點,你將能夠看到它,但嘗試從3.0f到7.0f的任何內容翻譯它(3.0f是你的zNear和7.0f是你的zFar)。替代方案是增加zFar或向後翻譯投影矩陣。或者大多數情況下,我建議在投影矩陣中添加一些「查看」系統,因爲它會爲您提供一些易於使用的工具來操作「相機」,在大多數情況下,您可以設置一個點,一個點你正在看和向上。
+0

謝謝馬蒂奇明確的解釋:) –