Aprenda a desenvolver aplicativos Android de realidade virtual do zero

Publicados: 2015-11-16

Este 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

Contrate Freelancer no Truelancer
  • 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.

Deve ler o sucesso do freelancing: conheça Aditya Web e desenvolvedor Android de Bangalore

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.
Deve ler Como contratar um desenvolvedor Wordpress e preparar seu site

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ê.

Deve ler o tutorial de fluxo de trabalho do Truelancer para empregadores

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!

Você é um desenvolvedor Android? Junte-se ao Truelancer hoje e comece a trabalhar como freelancer

Contrate Freelancer no Truelancer