查找/重新映射OpenGL ES坐标平面

时间:2015-10-07 02:42:49

标签: android c++ opengl-es

我试图为我的Android应用程序制作2D图形,该应用程序由六个细长矩形组成,每个矩形占据屏幕宽度的大约1/6,等于屏幕的高度。我不确定在屏幕上确定x和y OpenGL坐标平面边界的正确方法。最终我需要编写逻辑来测试触摸事件发生在6个矩形中的哪一个,所以我一直试图通过将OpenGL的坐标平面重新映射到设备的屏幕坐标平面来解决这个问题。原点(0,0)位于屏幕的左上角而不是中间位置。

我声明了我的六个矩形中的一个:

private float vertices1[] = {
            2.0f,  10.0f, 0.0f,  // 0, Top Left
            2.0f, -1.0f, 0.0f,  // 1, Bottom Left
            4.0f, -1.0f, 0.0f,  // 2, Bottom Right
            4.0f,  10.0f, 0.0f,  // 3, Top Right
    };

但是因为我不确定x和y平面上的可见限制是什么(在OpenGL坐标系中)我没有具体的方法知道我的矩形需要实例化哪些顶点占用1 /显示屏的第6位。什么是理想的做法?

我已尝试使用using glOrthoof()之类的方法将OpenGL的坐标重新映射为易于使用的设备屏幕坐标:

gl.glViewport(0, 0, width, height);
// Select the projection matrix
gl.glMatrixMode(GL10.GL_PROJECTION);
// Reset the projection matrix
gl.glLoadIdentity();
// Calculate the aspect ratio of the window
GLU.gluPerspective(gl, 45.0f,(float) width / (float) height,0.1f, 100.0f);
gl.glOrthof(0.0f,width,height, 0.0f, -1.0f, 5.0f);
// Select the modelview matrix
gl.glMatrixMode(GL10.GL_MODELVIEW);
// Reset the modelview matrix
gl.glLoadIdentity();

但是当我完全消除矩形消失时。

1 个答案:

答案 0 :(得分:2)

您当然不希望对2D图形使用透视投影。这没有多大意义。透视投影用于...好,创建透视投影,仅在您的对象实际放置在3D空间中时才有用。

更糟糕的是,您有两次调用来设置透视矩阵:

GLU.gluPerspective(gl, 45.0f,(float) width / (float) height,0.1f, 100.0f);
gl.glOrthof(0.0f,width,height, 0.0f, -1.0f, 5.0f);

虽然这是合法的,但它很少有意义。如果你这样做,本质上会发生两个投影连续应用。所以要做的第一件事是摆脱gluPerspective()电话。

要放置6个矩形,您有几个选项。几乎最简单的是根本不应用任何变换。这意味着您将在标准化设备坐标(也称为NDC)中指定输入坐标,该坐标在x方向和y方向上均为[-1.0,1.0]的范围。因此,对于并排渲染的6个矩形,对于所有矩形使用y范围[-1.0,1.0],对于第一个矩形使用[-1.0,-2.0 / 3.0]的x范围,[ - 2.0 /3.0,-1.0 / 3.0]为第二个,等等。

另一种选择是使用正交投影,这使得指定矩形更加方便。例如,x的[0.0,6.0]范围和y的[0.0,1.0]范围会使它变得特别容易:

gl.glOrthof(0.0f, 6.0f, 0.0f, 1.0f, -1.0f, 1.0f);

然后所有矩形的y范围为[0.0,1.0],第一个矩形的x范围为[0.0,1.0],第二个矩形为[1.0,2.0]等。

顺便说一句,如果你刚开始使用OpenGL,我会传递ES 1.x,直接学习ES 2.0。 ES 1.x是此时的遗留API,我不会将其用于任何新开发。