¿Cómo puedo determinar lo que se toca en el espacio 3D de la pantalla?

¿Cómo uso gl.gluUnproject en mi aplicación OpenGL ES 1.1 android para determinar qué se selecciona cuando el usuario toca la pantalla?

Mi comprensión es que el evento de toque resulta en una línea y tengo que encontrar la primera "cosa" con la que cruza.

¿Hay tutoriales sobre cómo hacer esto?

Si usted está haciendo 2D a 3D picking, es necesario para violín con matrices y vectores un poco. GlUnproject no existe para OpenGL ES 1.1 por lo que tiene que hacer algunas matemáticas por ti mismo.

Ray-objeto intersección es un camino a seguir. Timmmms respuesta ya cubre parte de ella, pero hay más. Idea es crear rayos 3D a partir de coordenadas 2D. Para ello se necesitan matriz de inversión de vista y matriz de proyección. Una vez que tengas ray, puedes usar la prueba de intersección de rayos de tu elección y por supuesto necesitas seleccionar el objeto más cercano como en el punto de Timmmm 4. Esferas de límite y cajas delimitadoras son fáciles de implementar e internet está lleno de tutoriales de prueba de intersección para ellos.

Este tutorial de picking es para DirectX, pero puede que tengas la idea. La parte que construye el rayo es lo más importante.

Editar Android implementa su propia versión de gluUnproject. Puede usarse para crear rayos, llamándolo para plano cercano y lejano (0 y 1) y restando los resultados del plano cercano de los resultados del plano lejano para obtener la dirección del rayo. El origen del rayo es la ubicación de la vista. Más aquí .

Creo que para la mayoría de las aplicaciones que debe ir para el correcto enfoque en 3D: Ray casting.

Tome la ubicación en 2D coordenadas de pantalla seleccionada por el usuario y proyectarlos en su espacio mundial. Esto da un rayo 3D que se origina en la cámara y apunta hacia la escena. Ahora es necesario realizar pruebas de colisión en 3D. En la mayoría de los casos, esto puede lograrse reduciendo los objetos a un conjunto de geometrías simples como elipsoides, esferas y cajas para acelerar.

Dada la precisión de los dispositivos portátiles, que debe ser suficiente precisión ya. Tenga en cuenta que dependiendo de la forma del objeto, es posible que necesite utilizar más de una primitiva básica. Además, es inútil utilizar siempre la misma primitiva: Una esfera delimitadora es una muy mala aproximación para una barra muy larga, obviamente.

Depende completamente de lo que es lo que estás haciendo. Usted probablemente no debería usar el enfoque de picking porque

A) Suena como si fuera lento, especialmente en android. B) Es posible que desee tener un "área de toque" más grande para objetos pequeños para que no tenga que tocar exactamente donde están. C) En realidad no responde a la pregunta correcta – le da el resultado "¿Cuál es el elemento gráfico más alto que se ha representado exactamente donde toqué?" Mientras que usted quiere saber "¿Qué entidad de juego hizo el usuario tocar o tocar cerca?"

Como he dicho, depende completamente de tu juego. Si se trata de un juego en 2D o casi 2D, entonces es sencillo y sólo tienes que alimentar las coordenadas táctiles en tu modelo de juego. Para los juegos 3D sugeriría este algoritmo simple que acabo de subir en el acto:

  1. Haga una lista de todos los objetos del juego que puedan tocarse.
  2. Transforme sus coordenadas centrales en coordenadas de pantalla 3D. (Coordenadas de pantalla 2D descritas aquí: http://www.flipcode.com/archives/Plotting_A_3D_Point_On_A_2D_Screen.shtml )
  3. Encuentra la distancia 2D a cada objeto, descarte los objetos con una distancia mayor a su umbral de contacto.
  4. Busque el objeto más cercano de acuerdo con una métrica de distancia. Tendrás que experimentar en este punto y de nuevo, depende de la naturaleza del juego.

Para obtener resultados exactos, se podría usar la intersección de líneas. Hay algoritmos para eso (búsqueda de 'línea de intersección de rayos de rayos').

Un pensamiento que tenía era almacenar en caché los resultados de llamar a gluProject. Esto sólo puede ser práctico cuando se trata de una cámara fija. Al final de cualquier cambio en la perspectiva de la cámara, puedo regenerar esta memoria caché de "touchables".

Esto también tiene el beneficio añadido de asegurar que sólo estoy probando entrada contra cosas que responderán a ser tocado.

¡Apreciaría cualquier pensamiento sobre este acercamiento!

  • Textura transparente en OpenGL ES para Android
  • Programación de gráficos Android 2D
  • Cómo utilizar la biblioteca Assimp en Android NDK
  • Nunca obtuvo 480 * 800 total cuando se utiliza la proyección ortogonal 2D en opengl-es
  • Android ejecuta OpenGL ES 1.1 o 1.0?
  • Android ICS: intento de error JNI para usar referencia local obsoleta 0x1
  • Open GL error de configuración incorrecta en Samsung S4
  • Android OpenGL ES - Todas las extensiones compatibles?
  • Error 1 libavcodec.so Formato de archivo no reconocido Android GL Live Wallpaper
  • Android NDK - OpenGL ES Tutorial / Bibliotecas
  • OpenGL ES - líneas discontinuas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.