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

LibGDX detecting the mouse click on mesh triangles

我一直在尝试在网格的三角形上添加鼠标点击检测,但似乎我做错了什么,我不知道如何解决这个问题。

所以在解释问题之前我先定义一下环境(完整代码可以在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;
}

非常感谢您的帮助!

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

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