为什么在这个OpenGL ES示例中,尽管不在视锥体之外,三角形仍然是可见的?

时间:2014-04-02 06:46:04

标签: opengl-es opengl-es-2.0

我一直试图通过修补绘制三个三角形的最基本的例子来学习OpenGL -
http://www.learnopengles.com/android-lesson-one-getting-started/#comment-2164

完整的源代码在这里 -
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等于近平面,因此它应该包含在视锥体中。这是怎么回事?我忽略了一些重要的细节吗?原谅这个简单化的问题,我对这个基本问题如此坚持,然后我发现自己无法在没有解释的情况下前进。

1 个答案:

答案 0 :(得分:1)

您忘记了自己的观看矩阵:mViewMatrix

视图矩阵将相机定位在(0,0,1.5)处,朝负Z方向(0,0,-1)。 视锥体在观察方向。所以近平面位于(0,0,0.5),远平面位于(0,0,-8.5)

这就是为什么z = 0处的三角形可见而z = 1处的三角形不是。