Aplicación de gluUnProject Android OpenGL ES 1.1

Estoy tratando de usar gluUnProject para convertir las coords de las ventanas a coords del mundo. No estoy tratando de obtener muestra de trabajo en el emulador o sistemas Android más antiguos (con OpenGL ES v1.0) y esto no es cuestión de disponibilidad de la función GL. Estoy tratando de trabajar en el dispositivo real con OpenGL ES 1.1 y funciones glGet devolver resultados no cero.

Hay muestra:

public Vector3 translateScreenCoordsToWorld(Vector2 screenCoords) { gl.glLoadIdentity(); final Matrix4x4 modelViewMatrix = new Matrix4x4(); final Matrix4x4 projectMatrix = new Matrix4x4(); int[] viewVectorParams = new int[4]; gl.glGetIntegerv(GL11.GL_VIEWPORT,viewVectorParams,0); gl.glGetFloatv(GL11.GL_MODELVIEW_MATRIX,modelViewMatrix.buffer,0); gl.glGetFloatv(GL11.GL_PROJECTION_MATRIX,projectMatrix.buffer,0); float[] output = new float[4]; GLU.gluUnProject( screenCoords.x, screenCoords.y, 0, modelViewMatrix.buffer, 0, projectMatrix.buffer, 0, viewVectorParams, 0, output, 0); return new Vector3(output[0],output[1],output[2]); } 

Matrix4x4 es sólo una envoltura para float [] buffer;

Con esta función estoy tratando de crear un plano para llenar toda la pantalla o detectar máximas coords del mundo para la matriz de proyección actual, pero no funciona en absoluto porque no estoy realmente seguro de que estoy utilizando estas funciones correctamente.

Por ejemplo, cuando intento ejecutar translateScreenCoordsToWorld (nuevo Vector2 (480.800)) devuelve valores de coordenadas muy pequeños Vector3 (0.27f, 0.42f, -1.0f).

¿Podría alguien proporcionar un buen uso de la muestra? GluUnProject para el modo GL_PROJECTION con una cámara posicionada.

Actualizado Gracias por los buenos enlaces. Pero todavía no funciona para mí 🙁 Ahora mi función se parece a:

 public Vector3 translateScreenCoordsToWorld(Vector2 screenCoords) { float winX = screenCoords.x, winY = screenCoords.y, winZ = 0; winY = (float)currentViewVectorParams[3] - winY; float[] output = new float[4]; GLU.gluUnProject( winX, winY, winZ, currentModelViewMatrix.buffer, 0, currentProjectMatrix.buffer, 0, currentViewVectorParams, 0, output, 0 ); Vector3 nearPlane = new Vector3(output[0],output[1],output[2]); winZ = 1.0f; GLU.gluUnProject( winX, winY, winZ, currentModelViewMatrix.buffer, 0, currentProjectMatrix.buffer, 0, currentViewVectorParams, 0, output, 0 ); Vector3 farPlane = new Vector3(output[0],output[1],output[2]); farPlane.sub(nearPlane); farPlane.div( nearPlane.length()); float dot1, dot2; Vector3 pointInPlane = new Vector3(), pointPlaneNormal = new Vector3(0,0,-1); pointInPlane.sub( nearPlane ); dot1 = (pointPlaneNormal.x * pointInPlane.x) + (pointPlaneNormal.y * pointInPlane.y) + (pointPlaneNormal.z * pointInPlane.z); dot2 = (pointPlaneNormal.x * farPlane.x) + (pointPlaneNormal.y * farPlane.y ) +(pointPlaneNormal.z * farPlane.z); float t = dot1/dot2; farPlane.mul(t); return farPlane.add(nearPlane); } 

Y aquí es donde mi cámara está configurando:

 public void updateCamera() { Camera camera = scene.getCamera(); GLU.gluLookAt(gl, camera.position.x, camera.position.y, camera.position.z, camera.target.x, camera.target.y, camera.target.z, camera.upAxis.x, camera.upAxis.y, camera.upAxis.z ); gl.glGetIntegerv(GL11.GL_VIEWPORT,currentViewVectorParams,0); gl.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, currentModelViewMatrix.buffer,0); gl.glGetFloatv(GL11.GL_PROJECTION_MATRIX,currentProjectMatrix.buffer,0); } 

La cámara está configurada con los siguientes cables:

 camera.position = { 0, 0, 65 }; camera.target = { 0, 0, 0 } camera.upAxis = { 0, 1, 0 } 

Ok, normalmente cuando se utiliza gluUnProject que está tratando de obtener la coordenada de espacio mundial de un píxel en la pantalla. Necesita tres elementos de información (aparte de las matrices) para incluir en glUnProject, una coordenada x de pantalla, una coordenada y de pantalla y el valor de búfer de profundidad correspondiente a ese píxel. El proceso normalmente es así:

  1. Dibuje un marco, para que toda la información del buffer de profundidad esté lista.
  2. Grab viewport / matrices / screen coords
  3. Invertir la coordenada y de la pantalla.
  4. Lea el valor de profundidad en un píxel dado. Ésta es efectivamente una coordenada z normalizada.
  5. Introduzca los x, yyz en glUnProject.

Esto termina dando la coordenada del espacio del mundo del fragmento dado de un pixel. Una guía mucho más detallada se puede encontrar aquí . De todos modos, puedo ver dos errores posibles en su código. La primera es que normalmente usted tiene que invertir la coordenada de pantalla y, (el tutorial en el enlace detalles por qué), el segundo es que siempre está pasando en 0 como el valor z de gluUnProject. Hacer esto desprotege el vértice como si estuviera en el plano cercano. ¿Es esto lo que quieres?

De todas formas, perdóneme si he leído mal su pregunta.

  • Problema de OpenGL en Android
  • Cómo depurar shaders en Android
  • GlDrawElements vs glDrawArray eficiencia
  • Android: ¿Es posible crear una SurfaceTexture sin SurfaceView?
  • Coordenadas de textura en opengl android mostrando la imagen invertida
  • Cómo detener el procesador GL abierto
  • Cómo utilizar la biblioteca Assimp en Android NDK
  • EGLConfig en HTC Desire, la configuración disponible cuelga el dispositivo
  • ¿Por qué mi rendimiento aumenta al tocar la pantalla?
  • Open GL error de configuración incorrecta en Samsung S4
  • Punto flotante o de punto fijo para Android NDK aplicaciones OpenGL?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.