Причина отсутствия простого способа определения трехмерной координаты экранной координаты в Open GL ES 2.0 Android - PullRequest
0 голосов
/ 01 марта 2012

У меня вопрос от , почему OpenGL и / или Android не могут просто захватить текущую матрицу и сохранить ее как float [].Все исследования, которые я обнаружил, предполагают использование этих классов, которые, как мне кажется, я должен загрузить и поместить в свой проект под названием MatrixGrabber , чтобы иметь возможность получить текущее состояние матрицы Open GL.* Моя общая цель - легко определить, какое место в мире Open GL имеет событие, вызванное касанием экрана, где я могу получить координаты X и Y по событию.

Наилучшее Обходной путь Я нашел Android OpenGL 3D комплектации .но мне интересно, почему нет способа просто получить нужные матрицы, а затем просто позвонить

GLU.gluUnProject(...);

Ответы [ 3 ]

4 голосов
/ 01 марта 2012

Мой вопрос возникает из-за того, что в OpenGL и / или Android нет способа просто захватить текущую матрицу и сохранить ее как float [].

Поскольку OpenGL ES 2.0 (и базовый рабочий стол GL 3.1 и выше) не обязательно имеют «текущую матрицу». Все преобразования выполняются с помощью шейдерной логики, поэтому матрицы даже не нужно задействовать. Там может быть все, что угодно.

Текущей матрицы нет, поэтому получить нечего. И ничего не проектировать.

0 голосов
/ 01 марта 2012

Я только что посмотрел на http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixGrabber.html, который выглядит как MatrixGrabber, на который вы ссылаетесь, и не выглядит особенно сложным - на самом деле, он перестроен.Вы можете просто использовать gl2.getMatrix напрямую и вставить его в gluUnProject.

Вероятная причина разработки кода MatrixGrabber заключается в том, что он кэширует значения для многократного использования - поскольку графический процессор работает асинхронно с процессоромкод может ждать ответа getMatrix, поэтому более эффективно получить его как можно меньше раз и повторно использовать данные.

Еще один источник сложности в общей проблеме состоит в том, что касание указывает только два размеры.Одно касание не указывает на какую-либо глубину, поэтому вы должны сделать это некоторым специфическим для приложения способом.Очевидным подходом является чтение буфера глубины (хотя некоторые реализации OpenGL этого не поддерживают), но это не работает, если у вас есть, например, вещи, которые должны быть «прозрачными» для касаний.Альтернативой является создание луча (например, путем двойного проецирования с двумя разными глубинами), а затем передача лучей в вашу сцену.

0 голосов
/ 01 марта 2012

В ES 1 вы можете получить текущую матрицу и сохранить ее как число с плавающей точкой, используя glGetFloatv, с pname GL_MODELVIEW_MATRIX, GL_PROJECTION_MATRIX или GL_TEXTURE_MATRIX, в зависимости от ситуации.

GLU не является неотъемлемой частью OpenGL ES, поскольку ES предназначена для минимальной спецификации, а GLU является своего рода дополнительным дополнением.Но вы можете взять эталонную реализацию SGI для GLU и использовать ее gluUnProject довольно просто.

EDIT: и завершить мысль, как указывает Николь, нет такой вещи, как текущаяматрица в ES 2. Вы предоставляете своим шейдерам произвольно много матриц для произвольно множества целей, и, поскольку вы поставили их в первую очередь, вам не нужно просить GL вернуть их снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...