Я пытаюсь добавить обнаружение щелчка мыши на треугольниках сетки, но кажется, что я делаю что-то неправильно, и я не могу понять, как решить проблему.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;
Mesh делает 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 });
Поэтому, когда я запускаю приложение, я пытаюсь проверить, был ли щелчок сделан в некоторых треугольниках сетки. Теперь результат зависит от положения камеры. Когда камера имеет почти верхний вид (например, на следующем рисунке), соответствующий около 6 по осям Y, точка щелчка правильно переводится в координаты и соответствует тому, что на самом деле видно.
Когда я перемещать камеру на 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 В самом последнем методе 'scrolled' Я перемещаю кулачок, обновляя его позицию y (и именно так я создаю представления, отображаемые в вышеприведенных картинах). С другой стороны, не должно быть никакой разницы, могу ли я переместить камеру или мир, верно? Преобразование, которое можно было бы получить от перемещения камеры или мира, должно иметь тот же результат, по крайней мере, из того, что я понял, читая веб-сайт opengl.org при принятии решения о том, что нужно переместить. – Serhiy