簡體   English   中英

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乘法,這是在屏幕上看起來很好的結果,但實際上當你與網格的實際坐標進行比較時,這是錯誤的。 現在,如果你檢查的例子在這里輸入鏈接的描述 ,你可以看到, gl_Position正在被乘以u_projectionViewMatrix * a_position 正確的計算成功了。

我還必須將相機更改為透視,因為網格沒有按照我想要的方式呈現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM