2015-10-27 2 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; 

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

ответ

0

В принципе, после нескольких дней рисования и некоторой математики я нашел источник проблемы. Vertex Shader, чтобы определить положение вершин, выполнял умножение a_position * u_projectionViewMatrix, что приводило к тому, что на экране выглядело хорошо, но на самом деле, когда вы сравниваете с фактическими координатами сетки, это было неправильно. Теперь, если вы проверите примеры на enter link description here, вы увидите, что gl_Position рассчитывается умножением u_projectionViewMatrix * a_position. Правильный расчет сделал трюк.

Мне также пришлось сменить камеру на перспективу, так как сетка не была сделана так, как я этого хотел.

Смежные вопросы