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

标签 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 });

因此,当我运行该应用程序时,我尝试检查点击是否在网格的某些三角形内完成。现在结果取决于相机的位置。当相机几乎是顶 View 时(如下图所示),对应于 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;
}

非常感谢您的帮助!

最佳答案

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

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

关于java - LibGDX 检测鼠标点击网格三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33362529/

相关文章:

java - 递归调用的 IndexOutOfBoundsException

java - 在 Java (Pre-6) TreeMap 和 Iterator 索引和下一个元素之间挣扎

java - 首选项不起作用

java - LibGDX:处理时出现 AssetsManager GdxRuntimeException

c# - 通过保留点位置进行 3D 表面重建

c++ - 我正在尝试将 3D 模型查看器集成到我的 GUI 中,但还没有找到一个可以让我轻松完成此操作的库。有什么建议么?

java - 如何在 spring boot 中拥有线程安全 Controller

java - 空指针异常?不知道为什么。 LIBGDX

java - eclipse导入gradle项目下载永远

javascript - 如何隐藏从其他(复杂)3D 对象背面伸出的 3D 对象部分?