Выбор координат с помощью OpenGL ES 2.0

Я пытаюсь реализовать функцию выбора координат с помощью OpenGL ES 2.0. Я не могу реализовать две версии, которые я реализовал в своей настольной версии.

Версия 1 заключается в отображении каждого треугольника в уникальном цвете, который представляет собой индекс треугольника, а затем в вычислении координаты с помощью raycast. Эта версия не работает, т.к. в OpenGL ES GLSL версии 1.0 отсутствует переменная GL_PrimitiveID и побитовый сдвиг тоже невозможен.

Версия 2 предназначена для отображения координат как значения текстуры с плавающей запятой, но текстура с плавающей запятой недоступна в OpenGL ES 2.0.

Есть ли у кого-нибудь другая идея, что я могу реализовать? Я не хочу рейкастировать каждый треугольник, потому что это не так эффективно.

Спасибо за помощь и любые идеи.


person user1844213    schedule 22.11.2012    source источник


Ответы (2)


Другой способ реализации пикинга координат — пикинг объектов лучами. Считается лучшим методом выбора 3D-объектов по координатам 2D-экрана. Вам не придется рендерить сцену с уникальными цветами объектов и подбирать цвета для определения пересечения.

Я реализовал выбор 3D-объектов с помощью этого замечательного руководства: http://android-raypick.blogspot.com/2012/04/first-i-want-to-state-this-is-my-first.html

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

person keaukraine    schedule 22.11.2012
comment
Я знаю этот урок и думаю, что выбор лучей недостаточно быстр. У меня есть модели с 300.000-1.000.000 треугольников и мне нужна координата на треугольнике. простой выбор объектов не является проблемой, но у меня есть одна огромная модель, и с выбором лучей я должен проверять каждый треугольник, а это очень медленно. Моя цель - переместить объект по поверхности. - person user1844213; 22.11.2012
comment
Но, как я уже сказал, для выбора объектов вы можете использовать модель с упрощенной геометрией. Конечно, если вам действительно нужен пиксельный и точный выбор, вы выбираете объекты, используя не упрощенную сетку, а полные 1000000 треугольников. - person keaukraine; 22.11.2012

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

возвращаясь к вашему исходному методу рендеринга отдельного цвета для каждого треугольника, кажется, что вам нужно выделить еще один атрибут вершины (цвет/индекс) и вы должны повторять общие вершины для каждого треугольника. количество вершин будет равно 3*количеству треугольников, но это решит вашу проблему.

person denizdiktas    schedule 23.12.2012