contacto[arroba]digitallearning.es
OpenGL2 Img11

Proyecto Android con OpenGL: iluminación e interacción con objetos 3D

Post Series: Gráficos 2D-3D en Android: OpenGL (II)

En este tutorial vamos a desarrollar un proyecto Android, donde a partir de objetos 3D representados, se establecerán los parámetros de iluminación, además de implementar eventos de interacción con el usuario cómo la pantalla táctil o el acelerómetro. Para este ejemplo, sólo se hará hincapié en las modificaciones que hagamos respecto al primer caso práctico que publicamos sobre OpenGL.

Puedes descargar todo el código del proyecto, al final de este tutorial

En la Aplicación Android que vamos a crear, se definirá un menú principal, en el que podremos seleccionar la opción “Interacción usuario con objetos 3D”, mostrando posteriormente los objetos cubo y pirámide en la misma vista.

Interfaz de la App Android ejemplo

Elementos necesarios:

  • Una clase principal llamada MainActivity, que heredará de la clase base Activity, donde se definen los elementos enlazados con sus recursos a nivel de layout, además desde esta Activity se realiza la llamada a una nueva View, encargada de construir los objetos gráficos (sólo nos centraremos en la opción “Interacción usuario con objetos 3D” del componente RadioButton definido):
  • Una clase llamada GLRender, que implementará la interfaz Renderer, encargada de construir la vista dónde se representará el objeto, además de definir los parámetros de iluminación y posición de las luces.
  • Una clase llamada Cubo3D y Piramide3D, dónde se definen los parámetros del objeto 3D que será invocado desde la clase GLRender.
  • Una clase llamada HiloEventosUsuario, encargada de controlar las acciones que realice el usuario al tocar la pantalla del dispositivo. Esta clase hereda de la clase base GLSurfaceView.

Objetos 3D renderizados en la Aplicación Android

En la imagen vemos  que como se muestran los objetos 3D en la vista. El usuario podrá manejar la rotación de ambos, mediante el sensor de la pantalla táctil del dispositivo, pudiendo observar los cambios de iluminación de las caras de los objetos.

FormasPrimitivas/src/com.academiaandroid.formasprimitivas/HiloEventosUsuario.java

Vamos a ver paso a paso el desarrollo de este proyecto:

Se crea una nueva clase llamada HiloEventosUsuario, encargada de controlar las acciones que realice el usuario al tocar la pantalla del dispositivo. Esta clase hereda de la clase base GLSurfaceView, y su principal tarea es implementar el evento onTouchEvent(final MotionEvent event) , que cazará las pulsaciones en la pantalla del usuario, invocando el método girarObjetos() de la clase GLRender:

 

FormasPrimitivas/src/com.academiaandroid.formasprimitivas/GLRender.java

En primer lugar definimos e inicializamos las variables, a nivel de clase, necesarias para establecer la iluminación en la escena representada. También se definen tres variables de tipo float, que almacenarán las coordenadas de la posición de la pantalla que seleccione el usuario:

Se sobrescribe el método onSurfaceCreated() con la configuración de la iluminación que se define en la vista construida:

 

Se habilita la iluminación al representar la vista inicialmente:

Se define el método que será invocado por el evento que controla las diferentes acciones que se realicen sobre la pantalla. Los valores del eje X e Y serán enviados al primer parámetro del método  glRotatef()  para actualizar la posición de rotación del objeto:

 

FormasPrimitivas/src/com.academiaandroid.formasprimitivas/Cubo3D.java

OpenGL2-img11

Se definen e inicializan las variables a nivel de clase, necesarias para establecer la iluminación en la escena representada.

 

Se habilita la definición de materiales, permitiendo diferenciar la forma en que la luz se refleja sobre los objetos:

 

FormasPrimitivas/src/com.academiaandroid.formasprimitivas/Piramide3D.java

Al igual que la clase cubo3D, se definen e inicializan las variables a nivel de clase, necesarias para establecer la iluminación en la escena representada:

 

Iluminacion de objeto pirámide al ser rotada

 

Y posteriormente, dentro del método draw(), se habilita la definición de materiales, permitiendo diferenciar la forma en que la luz se refleja sobre los objetos:

 

FormasPrimitivas/res/layout/activity_main.xml

Se define un recurso de tipo string, para asociarlo a los componentes de tipo texto mostrado en el menú principal. También comentar, que el componente RadioButton “radioCubo3D”, que mostrará el texto “Interacción usuario con objetos 3D”, será la opción que nos permita controlar la rotación de objetos 3D en la pantalla, además de poder observar los diferentes cambios de iluminación:

Componentes tipo texto de la Aplicación

Recurso strings.xml:

FormasPrimitivas/res/values/strings.xml