2012-03-07 6 views
1

У меня есть 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 берет на себя.

Ввод о том, как вы, ребята, будете обрабатывать его, тоже будет очень признателен!

ответ

0

Я решил использовать gluOrtho2D для настройки моей проекции, чтобы упростить решение этой проблемы.

только «хитрый», что проходил в реальном разрешении экрана к gluOrtho2D, которые могут быть извлечены (и сохранены) с:

getContentPane().getSize() 

От JFrame я использовал.

Установка предпочтительного размера на панели, после чего упаковка рамы достигла близких результатов, но сама панель все еще была слегка выключена.