Что я хочу сделать, так это выбрать точку на экране, пролить луч через эту точку прямо по оси z и вернуть координаты x y z и нормали вершин первого треугольника, которые пересекает луч. Проблема в том, что я недостаточно разбираюсь в OpenGL, чтобы понять это. Я делал выбор на окнах OpenGL, используя разные цвета на заднем буфере, но ничего, что касалось отдельных треугольников.Как выбрать индивидуальный треугольник в OpenGL ES 1.1?
ответ
Я сделал это на iPhone, но, как уже упоминалось, мне пришлось сворачивать свой собственный сбор. Неизбежно, у него есть вкус, уникальный для моего конкретного приложения, но на высоком уровне, вот как это происходит.
Вам понадобится функция для проецирования координаты экрана в мировые координаты. На рабочем столе есть gluUnProject(), но на iPhone такой утилиты нет. Лично я использую порт iPhone той же функции, доступной от Mesa here. Возможно, вам придется настроить его.
Вы можете использовать указанную выше функцию, чтобы получить две точки в мировом пространстве, которые представляют, где бесконечная линия позади вашего пикселя пересекает плоскость отсечения ближнего и дальнего конца. Используя этот вектор, вам придется перебирать треугольники в вашей сцене, принимая во внимание любые локальные преобразования и испытывать столкновения, используя алгоритм пересечения лучей, что само по себе может быть вопросом.
Существует множество способов пересечения лучей с треугольником. Я рекомендую поездку в Википедию. Я скажу, что я использую что-то вроде следующего: во-первых, просто пересечь луч с плоскостью, содержащей треугольник. Затем проверьте, действительно ли точка пересечения находится внутри рассматриваемого треугольника. Если да, то все готово. Если нет, продолжайте идти.
OpenGL ES 1.1 не имеет специальных функций выбора. Вы должны создать свою собственную систему, чтобы сделать это.
Просто размышляя над моей головой, вам нужно начать с любого способа получения точки, которую вы хотите использовать для выбора. Если этот пункт находится в другой системе координат, вам нужно будет преобразовать его, чтобы быть в курсе любых текущих преобразований, которые у вас есть на вашей сцене. После этого вы можете сбрасывать массив по оси z и использовать любой алгоритм пересечения треугольника, чтобы получить первый треугольник, через который он проходит. Вы можете отслеживать свою сцену, используя график сцены или что-то в этом роде. Надеюсь это поможет.
Спасибо, это похоже на то, что мне нужно. У меня есть «рендеринг в реальном времени», и в нем описываются некоторые способы сделать именно это. Я думаю, что я смогу ускорить процесс еще больше, проверив цвет касающейся части, а затем повторив только те модели, которые имеют этот цвет. – Davido