我一直在 Stack Overflow 中寻找 OpenGL ES 中 2D 选择的介绍。我主要看到有关 3D 的问题。
我正在使用 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);
}