У меня есть 2 вопроса. У вас есть конкретный вопрос о том, почему мой код не работает по назначению, а другой - вопрос дизайна.Java OpenGL экран для преобразования мира с использованием gluUnProject + обсуждение дизайна
1 (конкретный вопрос): Я пытаюсь сопоставить координаты экрана с координатами мира в двумерном графическом движке (использует ось x/y, z = 0). Я использовал учебный порт Nehe о том, как достичь этого, но результаты, которые я получаю, не так ожидаемы.
У меня есть класс под названием MouseController. Всякий раз, когда событие мыши запускается (через MouseListener Swing), я передаю MouseEvent в свой MouseController.
В моей функции рисования GLCanvas я вызываю функцию MouseController.processClick (GL), чтобы передать текущий контекст gl в функцию processClick и захватить модельное представление, проекционные матрицы и видовое окно.
Когда я нажимаю на блок, отображаемый на экране, координаты мира, которые даны мне, не имеют никакого смысла. Во-первых, я ожидал бы, что значение z будет равно 0, но его 9 (насколько высоко настроено моя камера), а мои значения x и y всегда очень близки к 0 (иногда подпрыгивая до 1-9 с очень небольшие движения, затем обратно к числу, очень близкому к 0).
У кого-нибудь есть идеи, почему это может быть так? Функция processClick ниже:
public void processClick(GL gl) {
int x = e.getX();
int y = e.getY();
if(e.getButton() == MouseEvent.BUTTON1) {
gl.glGetIntegerv(GL.GL_VIEWPORT, viewPort, 0);
gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, mvMatrix, 0);
gl.glGetDoublev(GL.GL_PROJECTION_MATRIX, prMatrix, 0);
int realy = viewPort[3] - y;
glu.gluUnProject((double)x, (double)realy, 0, mvMatrix, 0, prMatrix, 0, viewPort, 0, wCoord, 0);
System.out.println(x + " " + y);
System.out.println(x + " " + realy);
System.out.println(wCoord[0] + " " + wCoord[1] + " " + wCoord[2]);
}
e = null;
}
Пример выходных данных я получаю от вышеупомянутой функции, когда я нажимаю на экране, где я оказанной квадрат на мировых координат (4,5,0):
878 56
878 636
0.0445182388817236 0.055475957454737095 8.900000001489369
Благодаря!
EDIT: Чтение в буфер глубины с помощью glReadPixels и использования, что в качестве г (возвращает 1) получает меня результаты, которые являются своего рода право, но слишком большим фактором 20.
EDIT2: Если я установил плоскость отсечения на ту же величину, что и высота камеры, она работает (но это не очень подходит).
2 (Design Question): Я чувствую, что не имеет смысла обрабатывать клики в функции рисования OpenGL canvas. Кажется, мне требуется GL из этой функции, чтобы иметь возможность извлекать матрицы, необходимые для запуска gluUnProject. Как вы, ребята, это разработали? В идеале я чувствую себя так, как будто я должен иметь возможность выполнять этот прогон полностью отдельно от функции рисования. Храните ссылку на объект gl в мой MouseController и обрабатывайте клик, когда MouseListener берет на себя.
Ввод о том, как вы, ребята, будете обрабатывать его, тоже будет очень признателен!