2015-10-27 62 views
3

我一直試圖在網格的三角形上添加鼠標點擊檢測,但似乎我做錯了什麼,我無法弄清楚如何解決問題。LibGDX檢測鼠標點擊網格三角形

所以說明這個問題,我會定義環境之前(完整代碼可在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)的位置,所以圖像看起來如下一個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; 
} 

非常感謝您的幫助!

+0

從您的pastebin中的代碼,它看起來像你沒有移動相機。你只是在翻譯網格。所以選擇射線會留在相機所在的位置。 – Tenfour04

+0

@ Tenfour04在最後一種方法中,「滾動」我通過更新其y位置來移動凸輪(這就是我如何生成上面顯示的圖片中顯示的視圖)。另一方面,不管我移動相機還是世界,都不會有什麼不同,對吧?從移動相機或世界中獲得的轉換應該具有相同的結果,至少從我通過閱讀opengl.org網站時所瞭解的內容來決定應該如何移動。 – Serhiy

回答

0

基本上,經過幾天的繪畫和一些數學,我發現問題的根源。頂點着色器,爲了確定頂點的位置,正在執行a_position * u_projectionViewMatrix乘法,這是由於屏幕上看起來很好,但實際上當你與網格的實際座標比較時,它是錯誤的。現在,如果您查看enter link description here的示例,您可以看到,gl_Position正在通過乘以u_projectionViewMatrix * a_position來計算。做出正確的計算髮揮了重要作用。

我也不得不改變相機的角度來看,因爲網格不是我想要的。