OpenGL ES透视投影

时间:2012-09-19 03:35:34

标签: android animation opengl-es android-animation

我很难理解glFrustum& gluPerspective工作。我理解透视投影的概念,但功能并不像我期望的那样。 例如,如果我以这种方式设置截头体

glFrustumf(0, 10, 0, 10, 1, 100)

并在点处有一个矩形

 0,   0,  1,
 0,  10,  1,
10,  10,  1,
10,   0,  1

然后绘制矩形,它的左半部分位于屏幕外。如果左半边在屏幕之外,我希望垂直的一半也在外面。但这也不会发生。

在我看过的任何例子中,投影矩阵的坐标都是

glFrustumf(-10, 10, -10, 10, 1, 100)

但无论如何,显示的任何部分都应该取决于矩形的坐标,对吗?

更新:这是我正在使用的代码

fb1.put(new float [] {
    0,   0, -1,
    0,  10, -1,
    10, 10, -1,
    10,  0, -1
});

fb2.put(new float [] {
    0, 1,
    0, 0,
    1, 0,
    1, 1
});

indices.put(new short[] {
     0, 1, 2, 2, 3, 0
});

public void onDrawFrame(GL10 gl) {
    gl.glViewport(0, 0, this.width, this.height);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glFrustumf(0, 10, 0, 10, 1, 100);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fb1);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, fb2);
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.limit(),
                    GL10.GL_UNSIGNED_SHORT, indices);
}

第一个是我得到的,后者是我想得到的。另外我注意到一些图像也被垂直剪裁。

Actual Result Expected Result

1 个答案:

答案 0 :(得分:0)

使用glFrustumf(0, 10, 0, 10, 1, 100)这样的非对称坐标定义视锥体并不意味着您在世界中对象的定位会有所不同。因此,您应该通过修改glFrustumf(-1.0, 1.0, -1.0, 1.0, 1, 100)矩阵来坚持对称MODELVIEW移动您的矩形。