Realidad aumentada en Android con Unity3D y Vuforia

Hace algunas semanas, me surgió la posibilidad de desarrollar una aplicación de realidad aumentada para un centro educativo dentro de una jornada que tenía como objetivo la conmemoración del Día del Libro. La idea era divulgar entre alumnos y profesores las posibilidades que tiene esta tecnología en el ámbito formativo.

La demostración consistía en repartir por la sala diferentes marcadores y que al apuntar con el teléfono móvil hacia ellos apareciesen diferentes personajes con los que el niño se pudiese fotografiar.

Para el desarrollo de aplicaciones de realidad aumentada con elementos 3D, la combinación más sencilla de implementar es, sin duda, Unity3d y el plugin Vuforia. Este plugin dispone de un SDK para el desarrollo de aplicaciones nativas Android y también una extensión para Unity que nos facilitará enormemente la tarea y es compatible con la versión free del motor.

Una vez creado un proyecto vacío de Unity, nos registramos en la página de Vuforia y descargamos la extensión desde aquí:

https://developer.vuforia.com/resources/sdk/unity

Esto nos descargará un paquete de Unity que simplemente debemos de importar en nuestro proyecto. Veremos que han aparecido una serie de elementos en nuestra ventana Project, entre los cuales, se encuentra una carpeta Qualcomm Augmented Reality; dentro de esta carpeta, existe otra llamada Prefabs en la que se encuentran los elementos que utilizaremos en nuestra simulación.

Concretamente nos harán falta los prefab ARCamera e ImageTarget. Los arrastramos a nuestra escena y eliminamos el elemento Main Camera que Unity sitúa por defecto.

A continuación, importamos nuestro modelo 3D, que puede tener animaciones, y lo situamos como hijo del elemento ImageTarget.

mario

Creando los marcadores

Para que la simulación funcione, debemos de crear los marcadores que nuestra aplicación detectará y sobre los que aparecerán nuestros elementos 3D; es lo que vuforia llama Targets. Para ello, debemos de utilizar una herramienta online que nos ofrecen llamada Target Manager.

En esta herramienta, lo primero que haremos será crear una nueva base de datos (simplemente dándole un nombre) y a continuación, ya podemos comenzar a subir las imágenes que utilizaremos como marcadores. Estas imágenes tienen que cumplir una serie de requisitos para que el seguimiento por parte de la cámara del dispositivo sea correcto y que podemos consultar aquí; básicamente, la imagen no ha de ser simétrica y tener el suficiente detalle para que sea fácilmente identificable. La experiencia me dice que no hay “recetas mágicas” y que la mejor manera es comenzar por las que trae de ejemplo (para asegurarnos que nuestra aplicación funciona) y posteriormente subir nuestras propias imágenes. En el campo de ancho de la imagen, siempre me ha funcionado correctamente con un valor de 1.

Una vez creado el marcador en el Target Manager es hora de incluirlo en Unity; para ello, lo seleccionamos y pulsamos el botón Download selected targets, esto abrirá una ventana que nos pregunta si lo queremos usar con el SDK o con la extensión de Untiy. En este último caso, que es el que nos interesa, nos descargará un paquete de Unity que importaremos dentro del proyecto.

vuforia

Incluyendo el marcador en el proyecto

Una vez importado el marcador tenemos que indicarle a Unity que lo vamos a utilizar. Para ello, seleccionamos nuestro objeto ImageTarget y en el script Image Target Behaviour cambiamos la propiedad Data Set de Undefined al nombre que le hemos dado a nuestro marcador en el Target Manager (si hemos seguido los pasos solamente habrá una opción). Una vez cambiada esta propiedad, se actualizará también la propiedad Image Target que se encuentra debajo de ésta última. La forma de comprobar que hemos llegado hasta aquí correctamente, es que hasta ahora teníamos en la escena un cuadrado blanco en el objeto ImageTarget y ahora aparecerá nuestro marcadro.

Queda un último paso, seleccionamos el objeto ARCamera y en el script Data Set Load Behaviour marcamos las casillas Load Data Set <nombre marcador> y Activate. Ahora ya tenemos una aplicación que podemos exportar como aplicación Android e instalar en nuestro teléfono. Por supuesto, necesitaremos imprimir el marcador que hemos utilizado en el Target Manager en un tamaño adecuado (yo he utilizado un A4); cuando ejecutemos la aplicación se abrirá automáticamente la cámara y al enfocar el marcador aparecerá nuestro elemento 3D.

Algunos trucos

Como comenté anteriormente, antes de empezar a utilizar nuestros propios marcadores, es conveniente que comencemos con los que Vuforia nos ofrece. Así descartamos problemas de detección y podemos centrarnos en conseguir que nuestra aplicación funcione correctamente.

Otro tema a tener en cuenta es el tamaño en el que vamos a imprimir el marcador. Si la imagen es grande (A4 o más) no hay problema en utilizar el prefab ImageTarget pero para marcadores más pequeños (centímetros) será necesario utilizar el prefab FrameMarker. Si utilizamos FrameMarkers, no necesitamos el Target Manager de Vuforia, aunque tendremos menos libertad a la hora de elegir nuestra imagen ya que estos necesitan tener unos bordes “dentados” que, además, están codificados con un ID de tal manera que tenemos que bajarnos unas imágenes de base de la página de Vuforia.