我一直在尝试在网格的三角形上添加鼠标点击检测,但似乎我做错了,我无法弄清楚如何解决问题。
因此,在解释问题之前,我将定义环境(完整代码可在http://pastebin.com/TxfNuYXZ获得):
相机位置
cam = new OrthographicCamera(10, 9);
cam.position.set(0, 5.35f, 2f);
cam.lookAt(0, 0, 0);
cam.near = 0.5f;
cam.far = 12f;
网格渲染4个顶点。
mesh = new Mesh(true, NUM_COLUMNS * NUM_LINES, (NUM_COLUMNS * 6 - 6) * (NUM_LINES - 1), VertexAttribute.Position(), VertexAttribute.ColorUnpacked());
mesh.setVertices(new float[] {
0, 0, 0, 0, 1, 0, 1,
1, 0, 0, 0, 1, 0, 1,
0, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1 });
mesh.setIndices(new short[] { 2, 0, 1, 2, 3, 1 });
因此,当我运行应用程序时,我会尝试检查是否在网格的某些三角形内完成了单击。现在结果取决于相机的位置。当相机具有几乎俯视图(如下图所示)时,对应于Y轴上的大约6个,点击点正确地转换为坐标并对应于实际看到的内容。
当我将Y轴上的相机移动到较低位置(约2或3)时,图像看起来如下 在完全错误的位置检测到咔嗒声(红线显示检测到咔嗒声的地方)..根据坐标,这似乎是正确的,但不是根据看到的内容..
我想了解一下,我错过了能够检测到实际看到的内容的点击次数?我用来检测点击的代码如下:
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
Ray ray = cam.getPickRay(screenX, screenY);
Vector3 intersection = new Vector3();
float[] v = new float[NUM_COLUMNS * NUM_LINES * VERTEX_SIZE];
short[] i = new short[(NUM_COLUMNS * 6 - 6) * (NUM_LINES - 1)];
mesh.getIndices(i);
if (Intersector.intersectRayTriangles(ray, mesh.getVertices(v), i, VERTEX_SIZE, intersection)) {
System.out.println(intersection);
}
return false;
}
非常感谢你的帮助!
答案 0 :(得分:0)
基本上,经过几天的绘画和一些数学运算后,我找到了问题的根源。顶点着色器,为了确定顶点的位置,正在执行a_position * u_projectionViewMatrix
乘法,这是在屏幕上看起来很好的结果,但实际上当你与网格的实际坐标进行比较时,这是错误的。现在,如果您查看enter link description here处的示例,则可以看到gl_Position
是通过乘以u_projectionViewMatrix * a_position
来计算的。做出正确的计算就成了伎俩。
我还必须将相机更改为透视,因为网格没有按照我想要的方式呈现。