我正在使用OpenGL ES设计一个运行在Android 4.0.3上的2D基于瓦片的关卡编辑器。在编辑器中,有一个2D的黄色正方形对象位于屏幕中心。我想要实现的是检测用户是否触摸了该对象。
在编辑器中,没有任何瓦片重叠。相反,它们是并排放置的,就像MS Paint中位图图像中的两个相邻像素一样。我的目的是为了能够单独检测到关卡编辑器中每个正方形对象的触摸事件。
该对象是由简单的顶点数组创建的,并使用GL_TRIANGLES绘制2个平面的右三角形。没有任何操作和从文件加载等内容。我唯一知道的是,如果用户触摸了黄色三角形中的任何一个,则两个黄色三角形都将被选中。
有人可以提供一些提示,告诉我应该如何做吗?谢谢。
编辑:以下是draw()函数:
public void draw(GL10 gl) {
gl.glPushMatrix();
gl.glTranslatef(-(deltaX - translateX), (deltaY - translateY), 1f);
gl.glColor4f(1f, 1f, 0f, 1f);
//TODO: Move ClientState and MatrixStack outside of draw().
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertices);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 6);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glPopMatrix();
}
编辑2:
我还缺少一些信息。您是否在使用相机?或在模型渲染之前推送其他矩阵?例如,如果您正在使用正交相机,则可以轻松地取消投影屏幕坐标[x_screen,y_screen](y类似于以下内容):
我没有使用相机,但可能正在使用正交投影。再次说明,我不知道,因为我只是使用了一个常见的OpenGL函数。我进行了矩阵推送和弹出,因为我计划将许多具有不同平移矩阵的平铺(方形2D对象)集成在一起。没有两个平铺会具有相同的平移矩阵M。
当涉及到2D时,透视投影与正交投影是否相同?我没有看到这两者之间的区别。
下面是创建表面时的初始设置(扩展GLSurfaceView
类,并实现GLSurfaceView.Renderer
):
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
}
public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
reset();
}
public void onDrawFrame(GL10 gl) {
clearScreen(gl);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0f, super.getWidth(), 0f, super.getHeight(), 1, -1);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
canvas.draw(gl);
}
private void clearScreen(GL10 gl) {
gl.glClearColor(0.5f, 1f, 1f, 1f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
}