我一直試圖在網格的三角形上添加鼠標點擊檢測,但似乎我做錯了什麼,我無法弄清楚如何解決問題。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)的位置,所以圖像看起來如下一個 在完全錯誤的位置被檢測到點擊(紅色線表示點擊被檢測到的地方)..這似乎是正確的根據座標,但不是根據什麼正在看到..
我想了解什麼,我錯過了能夠檢測點擊什麼實際上正在被看到?我用來檢測點擊的代碼如下:
@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;
}
非常感謝您的幫助!
從您的pastebin中的代碼,它看起來像你沒有移動相機。你只是在翻譯網格。所以選擇射線會留在相機所在的位置。 – Tenfour04
@ Tenfour04在最後一種方法中,「滾動」我通過更新其y位置來移動凸輪(這就是我如何生成上面顯示的圖片中顯示的視圖)。另一方面,不管我移動相機還是世界,都不會有什麼不同,對吧?從移動相機或世界中獲得的轉換應該具有相同的結果,至少從我通過閱讀opengl.org網站時所瞭解的內容來決定應該如何移動。 – Serhiy