Open GL - ES 2.0: обнаружение касания - PullRequest
2 голосов
/ 17 февраля 2012

Привет, ребята. Я делаю некоторую работу на iOS, и работа требует использования OpenGL es.Так что теперь у меня есть куча квадратов, кубов и треугольников на экране.Некоторые из этих геометрий могут перекрываться.Любые идеи / подходы для обнаружения касания?

С уважением

Ответы [ 3 ]

1 голос
/ 27 февраля 2012

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

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

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

Если это достаточно быстро, то отлично, иначе вам, вероятно, захочется разбить мир на части или разбить объекты на их силуэты. Выпуклые объекты действительно просты - рассмотрим все ребра, проходящие между одним многоугольником и следующим. Если только один из этих многоугольников находится спереди, то край является частью силуэта. Все края силуэтов вместе можно проецировать в выпуклую 2-мерную форму на плоскости обзора. Затем вы можете проверить касания, выполнив 2d точку-полигон из этого.

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

Для целей glu на iPhone вы можете взять реализацию SGI (как используется MESA). Я использовал его тесселлятор в проекте по отгрузке и производству.

1 голос
/ 17 февраля 2012

У меня была такая проблема в прошлом. Я использовал реализацию glu unproject, которую вы можете найти в Google (она использует обратную матрицу проекции вида модели и размер области просмотра). Это позволяет сопоставить координаты 2D-экрана с трехмерным вектором в мире. Затем вы можете использовать этот вектор, чтобы пересекаться с вашими объектами и видеть, какой из них пересекается (или очень близко подходит для этого).

Я надеюсь, что есть лучшие способы сделать это, поэтому я с нетерпением жду и других ответов!

0 голосов
/ 27 февраля 2012

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

...