2

我很难理解如何工作glFrustumgluPerspective我了解透视投影的概念,但这些功能的表现并不符合我的预期。例如,如果我这样设置截锥体

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);
}

第一个是我得到的,后者是我想要得到的。我还注意到,图像的一点点也被垂直剪裁了。

实际结果 预期结果

4

1 回答 1

0

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

于 2012-09-19T11:36:03.413 回答