2014-04-02 79 views
0

我一直在試圖通過與這裏的最基本的例子,吸引了三個三角形擺弄學習的OpenGL -
http://www.learnopengles.com/android-lesson-one-getting-started/#comment-2164爲什麼在這個OpenGL ES示例中,儘管看不見視錐體,但三角形仍然可見?

完整的源代碼是在這裏 -
https://github.com/learnopengles/Learn-OpenGLES-Tutorials/tree/master/android/AndroidOpenGLESLessons/src/com/learnopengles/android/lesson1

三個三角形已經被定義xy平面與Z = 0.0

final float[] triangle1VerticesData = { 
      // X, Y, Z, 
      // R, G, B, A 
      -0.5f, -0.25f, 0.0f, 
      1.0f, 0.0f, 0.0f, 1.0f, 

      0.5f, -0.25f, 0.0f, 
      0.0f, 0.0f, 1.0f, 1.0f, 

      0.0f, 0.559016994f, 0.0f, 
      0.0f, 1.0f, 0.0f, 1.0f}; 

而視錐已在z = 1.0和z = 10.0

被削波
public void onSurfaceChanged(GL10 glUnused, int width, int height) 
{ 
    // Set the OpenGL viewport to the same size as the surface. 
    GLES20.glViewport(0, 0, width, height); 

    // Create a new perspective projection matrix. The height will stay the same 
    // while the width will vary as per aspect ratio. 
    final float ratio = (float) width/height; 
    final float left = -ratio; 
    final float right = ratio; 
    final float bottom = -1.0f; 
    final float top = 1.0f; 
    final float near = 1.0f; 
    final float far = 10.0f; 

    Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far); 
} 

所以三角形存在外面,視錐體,對不對?它們還沒有在視域內翻譯過。

public void onDrawFrame(GL10 glUnused) 
{ 
    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);      

    // Do a complete rotation every 10 seconds. 
    long time = SystemClock.uptimeMillis() % 10000L; 
    float angleInDegrees = (360.0f/10000.0f) * ((int) time); 

    // Draw the triangle facing straight on. 
    Matrix.setIdentityM(mModelMatrix, 0); 
    Matrix.rotateM(mModelMatrix, 0, angleInDegrees, 0.0f, 0.0f, 1.0f);   
    drawTriangle(mTriangle1Vertices); 

... 

} 

更重要的是,當我將三角形頂點的z座標更改爲1.0時,它們不再可見。 1.0等於近平面,所以它應該包含在視錐體中。這是怎麼發生的?我忽略了一些重要的細節嗎?原諒簡單的問題,我很困擾這個基本問題,然後我發現自己無法前進,沒有解釋。

+0

在你鏈接的例子中,還有一個視圖矩陣,它是用眼睛Z = 1.5設置的(所以當三角形有z = 0時,它們距離眼睛位置1.5,當它們有z = 1他們距離眼睛0.5的位置)。這仍然在你的代碼? – GuyRT

+0

是的,它仍然存在。我沒有改變任何東西。我將嘗試用圖解方式解釋我的疑問,並利用我在http://www.lighthouse3d.com/tutorials/view-frustum-culling/上找到的便捷圖片。 https://www.dropbox.com/s/5vp0tetowqcpb0p/Sketch23144111.png 從我所瞭解的情況來看,三角形落在觀看空間內,但在視錐外。 –

+1

在這種情況下,我暗示的和德克給出的答案是正確的。我不認爲「觀看量」和「觀看視錐」之間有任何區別 – GuyRT

回答

1

你忘記了你的觀察矩陣:mViewMatrix

視矩陣在(0,0,1.5)定位相機在尋找負z方向(0,0,-1)。 截錐體在觀看方向。所以近平面在(0,0,0.5)和遠平面在(0,0,-8.5)

這就是爲什麼z = 0處的三角形是可見的而z = 1處的三角形不是。

+0

這是有道理的,但令人驚訝。到目前爲止,我讀過的每一個教程都讓我相信,相機位置是獨立於剪輯平面而指定的。我搜索了很多圖片,並閱讀了相應的文章,每次都加強了相同的信念。我永遠無法猜測他們是相互指定的。這是我相信它的工作原理 - db.tt/OVQ6H1OX –

+0

我仍然對這個想法感到不安。爲什麼會有這樣的自動翻譯,當它不是更直觀?你能否再詳細解釋一下,或者向我推薦關於它們的文章?我無法找到正確的搜索關鍵字。另外,是否有一個GL_宏來配置它? –

+0

@farar:這些是_view frustum_的近和遠剪切平面。讓他們獨立於您使用的視圖是沒有意義的。你也不能禁用它。你應該尋找這些變換矩陣和OpenGL的剪輯空間的基礎知識。 – derhass

相關問題