LibGDX检测鼠标点击网格三角形

时间:2015-10-27 07:57:09

标签: java libgdx mesh

我一直在尝试在网格的三角形上添加鼠标点击检测,但似乎我做错了,我无法弄清楚如何解决问题。

因此,在解释问题之前,我将定义环境(完整代码可在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个,点击点正确地转换为坐标并对应于实际看到的内容。 Correct click location

当我将Y轴上的相机移动到较低位置(约2或3)时,图像看起来如下Wrong click location 在完全错误的位置检测到咔嗒声(红线显示检测到咔嗒声的地方)..根据坐标,这似乎是正确的,但不是根据看到的内容..

我想了解一下,我错过了能够检测到实际看到的内容的点击次数?我用来检测点击的代码如下:

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

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

基本上,经过几天的绘画和一些数学运算后,我找到了问题的根源。顶点着色器,为了确定顶点的位置,正在执行a_position * u_projectionViewMatrix乘法,这是在屏幕上看起来很好的结果,但实际上当你与网格的实际坐标进行比较时,这是错误的。现在,如果您查看enter link description here处的示例,则可以看到gl_Position是通过乘以u_projectionViewMatrix * a_position来计算的。做出正确的计算就成了伎俩。

我还必须将相机更改为透视,因为网格没有按照我想要的方式呈现。