Aprenda a desarrollar aplicaciones Android de realidad virtual desde cero
Publicado: 2015-11-16Este artículo lo guiará sobre cómo desarrollar aplicaciones Android de realidad virtual desde cero, suponiendo que ya conozca los conceptos básicos del desarrollo de aplicaciones Android.
Requisitos
- Android Studio 1.0 o superior
- Versión 19 del SDK de Android
- Un dispositivo Android físico con Android 16 (Jelly Bean) o superior
El archivo de manifiesto
<manifiesto... <usos-permiso android:name="android.permission.NFC" /> <usos-permiso android:name="android.permission.READ_EXTERNAL_STORAGE" /> <usos-permiso android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <usos-permiso android:name="android.permission.VIBRATE" /> ... <usa-sdk android:minSdkVersion="16" android:targetSdkVersion="19"/> <usos-función android:glEsVersion="0x00020000" android:required="true" /> <aplicación ... <actividad android:nombre=".Actividad principal" android:screenOrientation="paisaje"> ... <intent-filter> <acción android:name="android.intent.action.MAIN" /> <categoría android:name="android.intent.category.LAUNCHER" /> <categoría android:name="com.google.intent.category.CARDBOARD" /> </intent-filter> </actividad> </aplicación> </manifiesto>
Explicando los permisos:
- <uses-sdk android:minSdkVersion=”16″/> indica que el dispositivo debe ejecutar el nivel de API 16 (Jellybean) o superior.
- <uses-sdk android:targetSdkVersion=”19″/> indica que nuestra aplicación tiene como objetivo el nivel de API 19 (KitKat).
- <uses-feature android:glEsVersion=”0x00020000″ android:required=”true” /> indica que la aplicación usa gráficos y, por lo tanto, debe ser compatible con OpenGL ES 2.0.
- android:screenOrientation=”landscape” indica que la orientación de pantalla requerida de la actividad es “horizontal”. Esta es la orientación que debe establecer para las aplicaciones de realidad virtual. La vista utilizada por Cardboard SDK, CardboardView, solo se representa en los modos de pantalla completa y paisaje (paisaje, paisaje inverso, paisaje del sensor).
- La configuración android:configChanges=”orientation|keyboardHidden” también se recomienda, pero no es obligatoria.
- El SDK de Cardboard requiere el permiso android.permission.NFC para acceder a la etiqueta NFC de Cardboard.
- android.permission.READ_EXTERNAL_STORAGE y android.permission.WRITE_EXTERNAL_STORAGE . El SDK de Cardboard requiere estos permisos para emparejar el teléfono del usuario con su visor de realidad virtual.
- Nuestra aplicación de demostración requiere el permiso android.permission.VIBRATE para hacer que el teléfono vibre e informar al usuario que algo sucedió.
- El filtro de intenciones y específicamente com.google.intent.category.CARDBOARD indican que esta actividad es compatible con visores similares a Cardboard. La aplicación Cardboard utiliza esta categoría para enumerar las aplicaciones compatibles instaladas en el teléfono del usuario.
Extender la actividad de cartón:
CardboardActivity es el punto de partida para codificar una aplicación de cartón. CardboardActivity es la actividad base que proporciona una fácil integración con los dispositivos Cardboard. Expone eventos para interactuar con Cardboards y maneja muchos de los detalles comúnmente requeridos cuando se crea una actividad para renderizar VR.
Tenga en cuenta que CardboardActivity usa el modo inmersivo fijo, en el que la interfaz de usuario del sistema está oculta y el contenido ocupa toda la pantalla. Este es un requisito para una aplicación de realidad virtual, ya que CardboardView solo se representará cuando la actividad esté en modo de pantalla completa.
Android 4.4 (nivel de API 19) presenta un nuevo indicador SYSTEM_UI_FLAG_IMMERSIVE para setSystemUiVisibility() que permite que su aplicación vaya realmente a "pantalla completa". Esta bandera, cuando se combina con las banderas SYSTEM_UI_FLAG_HIDE_NAVIGATION y SYSTEM_UI_FLAG_FULLSCREEN, oculta las barras de navegación y de estado y permite que su aplicación capture todos los eventos táctiles en la pantalla.
Defina un CardBoardView:
Todos los elementos de la interfaz de usuario en una aplicación de Android se crean mediante vistas. Cardboard SDK para Android proporciona su propia vista, CardboardView, que es una extensión conveniente de GLSurfaceView que se puede usar para renderizar VR. CardboardView representa el contenido en estéreo. Puede ver cómo la aplicación de demostración define aCardboardView en su archivo xml de diseño de actividad de la siguiente manera:
<com.google.vrtoolkit.cardboard.CardboardView android:fill_parent" android:layout_height="fill_parent" />
Luego, en la clase de actividad principal, inicializa CardboardView en el método onCreate():
** * Establece la vista en nuestro CardboardView e inicializa las matrices de transformación que usaremos * para renderizar nuestra escena. * @param estado de instancia guardado */ @Anular public void onCreate (Paquete guardadoInstanceState) { super.onCreate(estadoDeInstanciaGuardado); setContentView(R.layout.common_ui); Vista de cartón Vista de cartón = (Vista de cartón) findViewById (R.id.cardboard_view); // Asociar un CardboardView.StereoRenderer con un cartónView. vistacarton.setRenderer(esto); // Asociar la vista de cartón con esta actividad. setVistaCartón(vistaCartón); // Inicializar otros objetos aquí .... }
Renderizar la vista
Una vez que obtiene CardboardView, lo asocia con un renderizador y luego asocia CardboardView con la actividad. Cardboard admite dos tipos de renderizadores, pero la forma más rápida de comenzar es usar CardboardView.StereoRenderer, que es lo que usa la aplicación de demostración.
CardboardView.StereoRenderer incluye estos métodos clave:
- onNewFrame(), llamado cada vez que se procesa la aplicación.
- onDrawEye(), llamado para cada ojo con diferentes parámetros de ojo.
Implementarlos es similar a lo que normalmente haría para una aplicación OpenGL. Estos métodos se analizan con más detalle en las siguientes secciones.
Implementar en NewFrame
Utilice el método onNewFrame() para codificar la lógica de representación antes de que se representen los ojos individuales. Cualquier operación por cuadro que no sea específica de una sola vista debería ocurrir aquí. Este es un buen lugar para actualizar su modelo. En este fragmento, la variable mHeadView contiene la posición de la cabeza. Este valor debe guardarse para usarlo más tarde para saber si el usuario está mirando un tesoro:
/** * Prepara OpenGL ES antes de dibujar un marco. * @param headTransform La transformación de la cabeza en el nuevo marco. */ @Anular public void onNewFrame(HeadTransform headTransform) { ... headTransform.getHeadView(mHeadView, 0); ... }
Implementar onDrawEye
Implemente onDrawEye() para realizar la configuración por ojo.
Esta es la esencia del código de renderizado y es muy similar a la creación de una aplicación OpenGL ES2 normal. El siguiente fragmento muestra cómo obtener la matriz de transformación de vista y también la matriz de transformación de perspectiva. Debe asegurarse de renderizar con baja latencia. El objeto Eye contiene las matrices de transformación y proyección para el ojo. Esta es la secuencia de eventos:
- El tesoro entra en el espacio ocular.
- Aplicamos la matriz de proyección. Esto proporciona la escena renderizada para el ojo especificado.
- Cardboard SDK aplica distorsión automáticamente para renderizar la escena final.
/** * Dibuja un marco para un ojo. * * @param eye El ojo a renderizar. Incluye todas las transformaciones requeridas. */ @Anular public void onDrawEye(Ojo ojo) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); ... // Aplicar la transformación del ojo a la cámara. Matrix.multiplyMM(mView, 0, eye.getEyeView(), 0, mCamera, 0); // Establecer la posición de la luz Matrix.multiplyMV(mLightPosInEyeSpace, 0, mView, 0, LIGHT_POS_IN_WORLD_SPACE, 0); // Construir las matrices ModelView y ModelViewProjection // para calcular la posición del cubo y la luz. float[] perspectiva = eye.getPerspective(Z_NEAR, Z_FAR); Matrix.multiplyMM(mModelView, 0, mView, 0, mModelCube, 0); Matrix.multiplyMM(mModelViewProjection, 0, perspectiva, 0, mModelView, 0); dibujarCubo(); // Dibuja el resto de la escena. ... }
Manejo de insumos
El visor Cardboard incluye un pulsador que utiliza un imán. Cuando empuja el imán, el campo magnético cambia y es detectado por el magnetómetro de su teléfono. El Cardboard SDK detecta estos eventos magnéticos por usted.
Para proporcionar un comportamiento personalizado cuando el usuario tira del imán, invalideCardboardActivity.onCardboardTrigger() en la actividad de su aplicación. En la aplicación de búsqueda del tesoro, si encuentras el tesoro y tiras del imán, puedes quedarte con el tesoro:
/** * Aumente la puntuación, oculte el objeto y brinde comentarios si el usuario tira del imán mientras * mirando el objeto. De lo contrario, recuerda al usuario qué hacer. */ @Anular vacío público enCardboardTrigger() { if (estáMirandoUnObjeto()) { puntuación m++; mOverlayView.show3DToast("¡Lo encontré! Busque otro.\nScore = " + mScore); ... } más { mOverlayView.show3DToast("¡Mira a tu alrededor para encontrar el objeto!"); } // Dar siempre retroalimentación a los usuarios mVibrador.vibrar(50); }
Comience su propio proyecto
Ahora que está más familiarizado con Cardboard SDK para Android, es hora de crear sus propias aplicaciones.
Ya sea que se trate de un nuevo proyecto que comienza desde cero o de uno existente, esto es lo que debe hacer.
1) Descarga los dos archivos JAR. Haga click aquí para descargar
2) Cópielo y péguelo en su carpeta app/libs (Encuéntrelo en la vista Proyecto de la Estructura del proyecto de Android Studio)
3) Haga clic derecho en las bibliotecas y seleccione "Agregar como biblioteca"
Luego, asegúrese de que las siguientes líneas estén presentes en el archivo app/build.gradle de su proyecto:
dependencias {... compile fileTree (dir: 'libs', include: ['*.jar']) }
¡Estás listo para dar un puntapié inicial al desarrollo de aplicaciones de Realidad Virtual!