Manejar eventos táctiles en una “escena” 3D o coordenadas de pantalla a 3D

Estoy tratando de implementar un juego tipo "whack-a-mole" usando 3D (OpenGL ES) en Android. Por ahora, tengo UNA forma 3D (cubo giratorio) en la pantalla en cualquier momento que representa mi "topo". Tengo un controlador de eventos táctiles en mi vista que establece aleatoriamente algunos valores x, y en mi renderizador, haciendo que el cubo se mueva (usando glTranslatef ()).

Todavía no he encontrado ningún tutorial o documentación que conecte completamente los eventos táctiles de la pantalla con una escena 3D. He hecho un montón de trabajo preliminar para llegar a donde estoy, pero parece que no puedo entender esto el resto del camino.

Desde developer.andrdoid.com Estoy usando lo que supongo que podría considerarse clases auxiliares para las Matrices: MatrixGrabber.java, MatrixStack.java y MatrixTrackingGL.java.

Yo uso esas clases en mi Método GLU.glUnProject, que se supone que realiza la conversión de las coordenadas de la pantalla real a las coordenadas 3D o de objetos.

Retazo

    MatrixGrabber mg = new MatrixGrabber();
    int viewport[] = {0, 0, renderer._width, renderer._height};
    mg.getCurrentModelView(renderer.myg);
    mg.getCurrentProjection(renderer.myg);
    float nearCoords[] = { 0.0f, 0.0f, 0.0f, 0.0f };
    float farCoords[] = { 0.0f, 0.0f, 0.0f, 0.0f };
    float x = event.getX();
    float y = event.getY();
    GLU.gluUnProject(x, y, -1.0f, mg.mModelView, 0, mg.mProjection , 0, viewport, 0, nearCoords, 0)
    GLU.gluUnProject(x, y, 1.0f, mg.mModelView, 0, mg.mProjection , 0, viewport, 0, farCoords, 0)

Este fragmento se ejecuta sin error y la salida no parece correcta. Sé que la pantalla tiene el origen (0,0) en la parte inferior izquierda. Y la escena 3D, al menos la mía, parece tener el origen justo en el medio de la pantalla como un sistema cartesiano clásico. Entonces ejecute mi código donde están las coordenadas de la pantalla (0, 718) desde tocar la esquina inferior izquierda. Mis salidas de los últimos parámetros a gluUnProject son:

Near: {-2.544, 2.927, 2.839, 1.99}

Far: {0.083, 0.802, -0.760, 0.009}

Esos números no tienen ningún sentido para mí. Mi toque incluso estaba en el tercer cuadrante, por lo que todos mis valores x, y para cerca y lejos deberían ser negativos, pero no lo son. La documentación de gluUnProject no menciona la necesidad de convertir las coordenadas de la pantalla. Por otra parte, esa misma documentación lo llevaría a creer que Near y Far deberían haber sido matrices de tamaño 3, pero tienen que ser de tamaño 4 y no tengo ni idea de por qué.

Entonces, tengo dos preguntas (estoy seguro de que surgirán más).

¿Cómo puedo asegurarme de que estoy obteniendo las coordenadas cercanas y lejanas adecuadas en función de las coordenadas de la pantalla?Una vez que tenga las coordenadas cercanas y lejanas, ¿cómo lo uso para encontrar si la línea que crean intersecta un objeto en la pantalla?

Respuestas a la pregunta(2)

Su respuesta a la pregunta