我一直在試圖通過與這裏的最基本的例子,吸引了三個三角形擺弄學習的OpenGL -
http://www.learnopengles.com/android-lesson-one-getting-started/#comment-2164爲什麼在這個OpenGL ES示例中,儘管看不見視錐體,但三角形仍然可見?
三個三角形已經被定義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等於近平面,所以它應該包含在視錐體中。這是怎麼發生的?我忽略了一些重要的細節嗎?原諒簡單的問題,我很困擾這個基本問題,然後我發現自己無法前進,沒有解釋。
在你鏈接的例子中,還有一個視圖矩陣,它是用眼睛Z = 1.5設置的(所以當三角形有z = 0時,它們距離眼睛位置1.5,當它們有z = 1他們距離眼睛0.5的位置)。這仍然在你的代碼? – GuyRT
是的,它仍然存在。我沒有改變任何東西。我將嘗試用圖解方式解釋我的疑問,並利用我在http://www.lighthouse3d.com/tutorials/view-frustum-culling/上找到的便捷圖片。 https://www.dropbox.com/s/5vp0tetowqcpb0p/Sketch23144111.png 從我所瞭解的情況來看,三角形落在觀看空間內,但在視錐外。 –
在這種情況下,我暗示的和德克給出的答案是正確的。我不認爲「觀看量」和「觀看視錐」之間有任何區別 – GuyRT