gluUnProject всегда возвращает ноль - PullRequest
2 голосов
/ 31 августа 2011

Мне нужен gluUnProject, чтобы преобразовать экранные координаты в мировые координаты, и сейчас у меня почти все работает.Когда мое приложение запускается, оно точно сообщает мне координаты на экране, которые, как я знаю, хранятся в моем потоке рендерера, а затем выкачивает экранные координаты.К сожалению, координаты экрана, похоже, не влияют на мировые координаты, а мировые координаты остаются на нуле.

Вот мой метод gluUnProject

public void vector3 (GL11 gl){

        int[] viewport = new int[4];
        float[] modelview = new float[16];
        float[] projection = new float[16];
        float winx, winy, winz;
        float[] newcoords = new float[4];

        gl.glGetIntegerv(GL11.GL_VIEWPORT, viewport, 0);
        ((GL11) gl).glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelview, 0);
        ((GL11) gl).glGetFloatv(GL11.GL_PROJECTION_MATRIX, projection, 0);

        winx = (float)setx;
        winy = (float)viewport[3] - sety;
        winz = 0;

        GLU.gluUnProject(setx, (float)viewport[3] - sety, 0, modelview, 0, projection, 0, viewport, 0, newcoords, 0);
        posx = (int)newcoords[0];
        posy = (int)newcoords[1];
        posz = (int)newcoords[2];



        Log.d(TAG, "x= " + String.valueOf(posx));
        Log.d(TAG, "y= " + String.valueOf(posy));
        Log.d(TAG, "z= " + String.valueOf(posz));
        }

Теперь я искал и нашел это сообщение на форуме , и они пришли к выводу, что это связано с использованием getFloatvвместо getDoublev, но, похоже, getDoublev не поддерживается GL11

The method glGetDoublev(int, float[], int) is undefined for the type GL11

, а также

The method glGetDoublev(int, double[], int) is undefined for the type GL11

, если значение double и float имеет значение, и если да, то как мне использоватьудваивается

Спасибо

РЕДАКТИРОВАТЬ:

Мне сказали, что gluUnproject терпит неудачу, когда слишком близко к ближней дальней плоскости отсечения, поэтому я установил winz в -5, когда рядом 0 и далеко -10.Это не повлияло на вывод.

Я также зарегистрировал каждую часть массива newcoords [], и все они возвращают что-то, что является NaN (не числом), может ли это быть проблемой или чем-то более высоким в алгоритме

1 Ответ

1 голос
/ 04 сентября 2011

Полагаю, вы работаете над эмулятором?Его реализация OpenGL довольно глючная, и после тестирования я обнаружил, что он возвращает все нули для следующих вызовов:

gl11.glGetIntegerv(GL11.GL_VIEWPORT, viewport, 0);
gl11.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelview, 0);
gl11.glGetFloatv(GL11.GL_PROJECTION_MATRIX, projection, 0);

Функция gluUnProject () должна вычислять обратное для объединенной матрицы модель-проекция-представлениеи поскольку это все нули, обратное не существует и будет состоять из NaN.Результирующий вектор newcoords подходит для всех Nans.

Попробуйте на устройстве с правильной реализацией OpenGL, оно должно работать.Имейте в виду, чтобы все еще разделить на newcoords[3] хотя; -)

...