Aprenda a desenvolver aplicativos Android de realidade virtual do zero
Publicados: 2015-11-16Este artigo irá orientá-lo sobre como desenvolver aplicativos Android de realidade virtual a partir do zero, supondo que você já esteja ciente dos fundamentos do desenvolvimento de aplicativos Android.
Requisitos
- Android Studio 1.0 ou superior
- Versão 19 do SDK do Android
- Um dispositivo Android físico executando o Android 16 (Jelly Bean) ou superior
O arquivo de manifesto
<manifesto... <uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.VIBRATE" /> ... <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="19"/> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> <aplicativo ... <atividade android:name=".MainActivity" android:screenOrientation="paisagem"> ... <filtro de intenção> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="com.google.intent.category.CARDBOARD" /> </intent-filter> </atividade> </aplicativo> </manifest>
Explicando as permissões:
- <uses-sdk android:minSdkVersion=”16″/> indica que o dispositivo deve estar executando a API Nível 16 (Jellybean) ou superior.
- <uses-sdk android:targetSdkVersion=”19″/> indica que nosso aplicativo tem como alvo a API Nível 19 (KitKat).
- <uses-feature android:glEsVersion=”0x00020000″ android:required=”true” /> indica que o aplicativo usa gráficos e, portanto, deve suportar OpenGL ES 2.0.
- android:screenOrientation="landscape" indica que a orientação de tela necessária para a atividade é "paisagem". Esta é a orientação que você deve definir para aplicativos de RV. A visualização usada pelo SDK do Cardboard, CardboardView, só é renderizada nos modos de tela cheia e paisagem (paisagem, paisagem reversa, paisagem de sensor).
- A configuração android:configChanges=”orientation|keyboardHidden” também é recomendada, mas não obrigatória.
- A permissão android.permission.NFC é exigida pelo SDK do Cardboard para acessar a tag NFC do Cardboard.
- android.permission.READ_EXTERNAL_STORAGE e android.permission.WRITE_EXTERNAL_STORAGE . Essas permissões são exigidas pelo SDK do Cardboard para emparelhar o telefone do usuário com o visualizador de RV.
- A permissão android.permission.VIBRATE é exigida pelo nosso aplicativo de demonstração para fazer o telefone vibrar para informar ao usuário que algo aconteceu.
- O filtro de intenção e especificamente com.google.intent.category.CARDBOARD declaram que essa atividade é compatível com visualizadores do tipo Cardboard. Essa categoria é usada pelo aplicativo Cardboard para listar aplicativos compatíveis instalados no telefone do usuário.
Estender a atividade do Cardboard:
CardboardActivity é o ponto de partida para codificar um aplicativo de papelão. CardboardActivity é a atividade base que oferece fácil integração com dispositivos Cardboard. Ele expõe eventos para interagir com o Cardboards e lida com muitos dos detalhes normalmente necessários ao criar uma atividade para renderização de RV.
Observe que CardboardActivity usa o modo imersivo fixo, no qual a interface do usuário do sistema fica oculta e o conteúdo ocupa a tela inteira. Este é um requisito para um aplicativo de RV, pois o CardboardView só será renderizado quando a atividade estiver no modo de tela cheia.
O Android 4.4 (API de nível 19) apresenta um novo sinalizador SYSTEM_UI_FLAG_IMMERSIVE para setSystemUiVisibility() que permite que seu aplicativo fique realmente em "tela cheia". Esse sinalizador, quando combinado com os sinalizadores SYSTEM_UI_FLAG_HIDE_NAVIGATION e SYSTEM_UI_FLAG_FULLSCREEN, oculta as barras de navegação e de status e permite que seu aplicativo capture todos os eventos de toque na tela.
Defina um CardBoardView:
Todos os elementos da interface do usuário em um aplicativo Android são criados usando visualizações. O SDK do Cardboard para Android fornece sua própria visualização, CardboardView, que é uma extensão conveniente do GLSurfaceView que pode ser usada para renderização de VR. CardboardView renderiza conteúdo em estéreo. Você pode ver como o aplicativo de demonstração define aCardboardView em seu arquivo xml de layout de atividade da seguinte maneira:
<com.google.vrtoolkit.cardboard.CardboardView android:fill_parent" android:layout_height="fill_parent" />
Em seguida, na classe de atividade principal, ele inicializa o CardboardView no método onCreate():
** * Define a view para nosso CardboardView e inicializa as matrizes de transformação que usaremos * para renderizar nossa cena. * @param savedInstanceState */ @Sobrepor public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.common_ui); CardboardView cartonView = (CardboardView) findViewById(R.id.cardboard_view); // Associe um CardboardView.StereoRenderer com o papelãoView. cartonView.setRenderer(this); // Associe o papelãoView a esta atividade. setCardboardView(cardboardView); // Inicializa outros objetos aqui .... }
Renderize a visualização
Depois de obter o CardboardView, você o associa a um renderizador e, em seguida, associa o CardboardView à atividade. O Cardboard oferece suporte a dois tipos de renderizadores, mas a maneira mais rápida de começar é usar CardboardView.StereoRenderer, que é o que o aplicativo de demonstração usa.
CardboardView.StereoRenderer inclui estes métodos principais:
- onNewFrame(), chamado toda vez que o aplicativo é renderizado.
- onDrawEye(), chamado para cada olho com diferentes parâmetros de olho.
Implementá-los é semelhante ao que você faria normalmente para um aplicativo OpenGL. Esses métodos são discutidos em mais detalhes nas seções a seguir.
Implementar emNewFrame
Use o método onNewFrame() para codificar a lógica de renderização antes que os olhos individuais sejam renderizados. Quaisquer operações por quadro que não sejam específicas de uma única visualização devem ocorrer aqui. Este é um bom lugar para atualizar seu modelo. Neste trecho, a variável mHeadView contém a posição da cabeça. Este valor precisa ser salvo para usar mais tarde para saber se o usuário está olhando para o tesouro:
/** * Prepara o OpenGL ES antes de desenharmos um quadro. * @param headTransform A transformação da cabeça no novo quadro. */ @Sobrepor public void onNewFrame(HeadTransform headTransform) { ... headTransform.getHeadView(mHeadView, 0); ... }
Implementar no DrawEye
Implemente onDrawEye() para realizar a configuração por olho.
Essa é a essência do código de renderização e muito semelhante à construção de um aplicativo OpenGL ES2 regular. O trecho a seguir mostra como obter a matriz de transformação de visualização e também a matriz de transformação de perspectiva. Você precisa ter certeza de renderizar com baixa latência. O objeto Eye contém as matrizes de transformação e projeção para o olho. Esta é a sequência de eventos:
- O tesouro entra no espaço dos olhos.
- Aplicamos a matriz de projeção. Isso fornece a cena renderizada para o olho especificado.
- O SDK do Cardboard aplica distorção automaticamente para renderizar a cena final.
/** * Desenha uma moldura para um olho. * * @param eye O olho a ser renderizado. Inclui todas as transformações necessárias. */ @Sobrepor public void onDrawEye(Eye eye) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); ... // Aplique a transformação do olho na câmera. Matrix.multiplyMM(mView, 0, eye.getEyeView(), 0, mCamera, 0); // Define a posição da luz Matrix.multiplyMV(mLightPosInEyeSpace, 0, mView, 0, LIGHT_POS_IN_WORLD_SPACE, 0); // Construir as matrizes ModelView e ModelViewProjection // para calcular a posição e a luz do cubo. float[] perspectiva = olho.getPerspective(Z_NEAR, Z_FAR); Matrix.multiplyMM(mModelView, 0, mView, 0, mModelCube, 0); Matrix.multiplyMM(mModelViewProjection, 0, perspectiva, 0, mModelView, 0); desenharCubo(); // Desenha o resto da cena. ... }
Manipulando entradas
O visualizador do Cardboard inclui um botão que usa um ímã. Quando você empurra o ímã, o campo magnético muda e é detectado pelo magnetômetro do seu telefone. Esses eventos magnéticos são detectados pelo SDK do Cardboard para você.
Para fornecer um comportamento personalizado quando o usuário puxar o ímã, overrideCardboardActivity.onCardboardTrigger() na atividade do seu aplicativo. No aplicativo de caça ao tesouro, se você encontrar o tesouro e puxar o ímã, poderá ficar com o tesouro:
/** * Aumente a pontuação, esconda o objeto e dê feedback se o usuário puxar o ímã enquanto * olhando para o objeto. Caso contrário, lembre o usuário o que fazer. */ @Sobrepor public void onCardboardTrigger() { if (isLookingAtObject()) { mScore++; mOverlayView.show3DToast("Encontrei! Procure outro.\nPontuação = " + mScore); ... } senão { mOverlayView.show3DToast("Olhe ao redor para encontrar o objeto!"); } // Sempre dê feedback ao usuário mVibrador.vibrar(50); }
Comece seu próprio projeto
Agora que você está mais familiarizado com o SDK do Cardboard para Android, é hora de criar seus próprios aplicativos.
Seja um novo projeto que você começa do zero ou um já existente, eis o que você deve fazer.
1) Baixe os dois arquivos JAR. Clique aqui para baixar
2) Copie e cole na pasta app/libs (Encontre isso na visualização do projeto da estrutura do projeto do Android Studio)
3) Clique com o botão direito do mouse nas bibliotecas e selecione “Adicionar como biblioteca”
Em seguida, verifique se as seguintes linhas estão presentes no arquivo app/build.gradle do seu projeto:
dependencies { … compile fileTree(dir: 'libs', include: ['*.jar']) }
Você está pronto para dar um pontapé inicial no desenvolvimento de aplicativos de Realidade Virtual!