Обнаружение прикосновений пользователя к квадрату OpenGL

Возможный дубликат:
Как определить, к чему прикасаются в 3D-пространстве с экрана?

Я разрабатываю приложение для Android. Я также работаю с графикой OpenGL.

У меня есть квадрат, нарисованный на экране, и я хочу, чтобы пользователь перемещал его, когда он касается его. Другими словами, пользователь должен иметь возможность перемещаться по квадрату, когда он кладет на него палец. Если он касается вне квадрата, ничего не происходит.

Как я могу определить, когда пользователь касается квадрата?

Спасибо.


person VansFannel    schedule 11.11.2010    source источник


Ответы (3)


Учебники по сбору и выбору, представленные в других ответах, здесь не применимы; среди прочего glSelectBuffer и glRenderMode не являются частью OpenGL ES.

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

В качестве альтернативы вы можете сделать что-то вроде выбора, но с адаптацией к функциям, доступным в OpenGL ES. Например, очистите сцену до черного цвета и нарисуйте квадрат сплошным синим цветом. Используйте glReadPixels, чтобы получить значение цвета в месте касания. Если он синий, то касание идет по квадрату. Это, вероятно, более дорогой способ тестирования, потому что это означает дополнительную отрисовку сцены, но это означает, что вам не нужно реализовывать какие-либо дополнительные математические операции или другой код, помимо того, что предоставляет GL.

Единственная небольшая вещь, которую следует иметь в виду, это то, что OpenGL использует один и тот же способ адресации пикселей везде — (0, 0) находится внизу слева, положительный y идет вверх, а положительный x идет влево. Таким образом, независимо от того, относительно каких осей у вас есть координаты касания, вам нужно преобразовать их, чтобы они были относительно этого, прежде чем выполнять glReadPixels.

person Tommy    schedule 11.11.2010
comment
Это кажется таким трудным. Я собираюсь разместить на экране несколько кнопок и использовать их для перемещения объектов OpenGL. - person VansFannel; 12.11.2010
comment
@VansFannel это совсем не сложно, просто следуйте инструкциям по подбору цвета. Кнопка для того, что может делать палец на iPhone — очень плохая идея - person rano; 12.11.2010
comment
@rano: я делаю это для Android, а не для iPhone. - person VansFannel; 15.11.2010
comment
@VansFannel, лол, я неуклюж, я имел в виду: на сенсорном устройстве не использовать пальцы пользователя так естественно, как они могли бы, - плохая идея. - person rano; 15.11.2010

Обнаружение касаний может быть реализовано с помощью пикинга лучей. У меня была та же проблема, и я использовал код на этой странице: Android Выбор лучей OpenGL ES. Метод getViewRay() вычисляет направление луча. Если известно направление от [0,0,0] до луча[x,y,z], довольно легко смоделировать бросок луча и обнаружить столкновение с ограничивающим объектом.

person petrnohejl    schedule 31.03.2011

Если у вас есть только квадрат, вы можете проверить, лежат ли координаты касания внутри пространства, образованного четырьмя вершинами квадрата. В случае квадрата, непараллельного оси x, вы должны проецировать его вершины, используя матрицу проекции.

В целом существует несколько методов «выбора» модели OpenGL: выбор лучей и выбор цвета являются наиболее часто используемыми. Обязательно ознакомьтесь с этим документом

person rano    schedule 11.11.2010