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:
- Java.lang.RuntimeException: eglSwapBuffers falló: EGL_SUCCESS
- GLSurfaceView: ¿Necesito llamar a onPause / onResume?
- Cambio de OpenGL ES 1.0 a 2.0
- OpenGL ES - líneas discontinuas
- Problema dibujo de una esfera en OPENGL ES
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 }
- ¿Cómo superponer GLSurfaceView sobre un MapView en Android?
- Android: Decidir entre SurfaceView y OpenGL (GLSurfaceView)
- "SDK-buildable" Navegadores Web de código abierto para Android
- OpenGL "Error de operación no válido" Después de glDrawElements función en el teléfono Android
- OpenGL ES - textura mapa todas las caras de un cubo de 8 vértices?
- Android Aplicar efecto en el marco de la cámara
- Android - GLSurfaceView EGL_BAD_ALLOC
- Extensiones OpenGL disponibles en diferentes dispositivos Android
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í:
- Dibuje un marco, para que toda la información del buffer de profundidad esté lista.
- Grab viewport / matrices / screen coords
- Invertir la coordenada y de la pantalla.
- Lea el valor de profundidad en un píxel dado. Ésta es efectivamente una coordenada z normalizada.
- 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.
- Detectar dispositivos específicos dentro de la aplicación Android
- No se puede compartir contenido en Facebook a través de la aplicación Android