JOGL - glu.gluUnProject всегда возвращает 0.0 - PullRequest
4 голосов
/ 14 ноября 2009

В настоящее время я пытаюсь выяснить, как получить мировые координаты из JOGL - на данный момент он возвращает только x = 0.0, y = 0.0 и z = 0.0 независимо от того, где я нажимаю. Что я делаю не так?

 public double[] getMousePosition(int x, int y){

    int viewport[] = new int[4];
    double modelview[] = new double[16];
    double projection[] = new double[16];
    float winX, winY, winZ;
    float posX, posY, posZ;
    double wcoord[] = new double[4];

    gl.glGetDoublev( GL2.GL_MODELVIEW_MATRIX, modelview, 0 );
    gl.glGetDoublev( GL2.GL_PROJECTION_MATRIX, projection, 0 );
    gl.glGetIntegerv( GL2.GL_VIEWPORT, viewport, 0 );

    winX = (float)x;
    winY = (float)viewport[3] - (float)y;

    float[] depth = new float[1];
    // gl.glReadPixels(winX, winY, 1, 1, gl.GL_DEPTH_COMPONENT, GL2.GL_FLOAT, depth);

    boolean test =  glu.gluUnProject( winX, winY, 0.0, modelview, 0, projection, 0, viewport, 0, wcoord, 0);

    System.out.println("x: " + wcoord[0] +"y: "+wcoord[1]+" worked? "+test);
    System.out.println(modelview[0]);
    return wcoord;
}

EDIT :: Забыл упомянуть, что заметил, что glu.gluUnproject возвращает логическое значение, поэтому я назначил его логическому имени с именем test, которое возвращает false.

EDIT2 :: Я добавил еще один оператор отладки - System.out.println (modelview [0]); и также возвращает 0.0

Спасибо за вашу помощь

Джеймс

Ответы [ 3 ]

0 голосов
/ 18 ноября 2009

gluUnproject () всегда будет возвращать TRUE и (0,0,0) для координат окна, если 3D-точка, которую вы пытаетесь найти, находится далеко за ближней плоскостью отсечения (обычно также за положением камары). Возможно, вам придется выполнять вычисления вручную после запроса матриц и информации о видовом экране.

0 голосов
/ 18 ноября 2009

Я наконец-то нашел причину, по которой это произошло, оказалось, что я тянул gl.glGetIntegerv (GL2.GL_VIEWPORT, viewport, 0); в методе до этого. Кажется, что если вы сделаете это, следующий метод для вызова будет возвращен только набор нулей!

Спасибо за ваши предложения

0 голосов
/ 16 ноября 2009

Одна из возможных причин: вы одновременно захватываете матрицу вида модели и матрицу проекции? ..

gluUnProject () работает так, как задумано на моей стороне, и вот что я делаю:

1) Только при обновлении размера порта обзора и / или «камеры»: захватить область просмотра и проекционную матрицу.
И.Е. Вы должны быть после gl.glMatrixMode(GL.GL_PROJECTION)

2) Каждый «кадр»: захватить матрицу вида модели.
И.Е. Вы должны быть после gl.glMatrixMode(GL.GL_MODELVIEW)

3) Только тогда: передайте массив 3 в gluUnProject () ...

...