Impara a sviluppare app Android di realtà virtuale da zero
Pubblicato: 2015-11-16Questo articolo ti guiderà su come sviluppare da zero app Android di realtà virtuale, partendo dal presupposto che tu sia già a conoscenza delle basi dello sviluppo di app Android.
Requisiti
- Android Studio 1.0 o versioni successive
- Versione 19 dell'SDK Android
- Un dispositivo Android fisico con Android 16 (Jelly Bean) o versioni successive
Il file 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" /> <applicazione ... <attività android:name=".MainActivity" android:screenOrientation="paesaggio"> ... <filtro intento> <action android:name="android.intent.action.MAIN" /> <categoria android:name="android.intent.category.LAUNCHER" /> <categoria android:name="com.google.intent.category.CARDBOARD" /> </filtro intento> </attività> </applicazione> </manifesto>
Spiegazione dei permessi:
- <uses-sdk android:minSdkVersion="16″/> indica che il dispositivo deve eseguire API di livello 16 (Jellybean) o superiore.
- <uses-sdk android:targetSdkVersion="19″/> indica che la nostra app ha come target API di livello 19 (KitKat).
- <uses-feature android:glEsVersion=”0x00020000″ android:required=”true” /> indica che l'app utilizza la grafica e quindi deve supportare OpenGL ES 2.0.
- android:screenOrientation="orizzontale" indica che l'orientamento dello schermo richiesto per l'attività è "orizzontale". Questo è l'orientamento che devi impostare per le app VR. La vista utilizzata da Cardboard SDK, CardboardView, esegue il rendering solo in modalità a schermo intero e orizzontale (orizzontale, reverseLandscape, sensorLandscape).
- Anche l'impostazione android:configChanges="orientation|keyboardHidden" è consigliata, ma non obbligatoria.
- L'autorizzazione android.permission.NFC è richiesta da Cardboard SDK per accedere al tag NFC di Cardboard.
- android.permission.READ_EXTERNAL_STORAGE e android.permission.WRITE_EXTERNAL_STORAGE . Queste autorizzazioni sono richieste da Cardboard SDK per accoppiare il telefono dell'utente al proprio visualizzatore VR.
- L'autorizzazione android.permission.VIBRATE è richiesta dalla nostra app demo per far vibrare il telefono per informare l'utente che è successo qualcosa.
- Il filtro intent e in particolare com.google.intent.category.CARDBOARD affermano che questa attività è compatibile con visualizzatori simili a Cardboard. Questa categoria viene utilizzata dall'app Cardboard per elencare le app compatibili installate sul telefono dell'utente.
Estendi l'attività del cartone:
CardboardActivity è il punto di partenza per la codifica di un'app di cartone. CardboardActivity è l'attività di base che fornisce una facile integrazione con i dispositivi Cardboard. Espone gli eventi per interagire con Cardboards e gestisce molti dei dettagli comunemente richiesti durante la creazione di un'attività per il rendering VR.
Si noti che CardboardActivity utilizza la modalità immersiva permanente, in cui l'interfaccia utente del sistema è nascosta e il contenuto occupa l'intero schermo. Questo è un requisito per un'app VR, poiché CardboardView eseguirà il rendering solo quando l'attività è in modalità a schermo intero.
Android 4.4 (API Level 19) introduce un nuovo flag SYSTEM_UI_FLAG_IMMERSIVE per setSystemUiVisibility() che consente alla tua app di andare veramente a "schermo intero". Questo flag, se combinato con i flag SYSTEM_UI_FLAG_HIDE_NAVIGATION e SYSTEM_UI_FLAG_FULLSCREEN, nasconde la navigazione e le barre di stato e consente all'app di acquisire tutti gli eventi touch sullo schermo.
Definisci un CardBoardView:
Tutti gli elementi dell'interfaccia utente in un'app Android vengono creati utilizzando le visualizzazioni. Cardboard SDK per Android fornisce la propria vista, CardboardView, che è una comoda estensione di GLSurfaceView che può essere utilizzata per il rendering VR. CardboardView esegue il rendering del contenuto in stereo. Puoi vedere come l'app demo definisce aCardboardView nel suo file XML del layout di attività nel modo seguente:
<com.google.vrtoolkit.cardboard.CardboardView android:fill_parent" android:layout_height="fill_parent" />
Quindi nella classe di attività principale inizializza CardboardView nel metodo onCreate():
** * Imposta la vista sul nostro CardboardView e inizializza le matrici di trasformazione che utilizzeremo * per rendere la nostra scena. * @param salvatoInstanceState */ @Oltrepassare public void onCreate(Bundle saveInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.common_ui); CardboardView cartoneView = (CardboardView) findViewById(R.id.cardboard_view); // Associa un CardboardView.StereoRenderer a cartoneView. cartoneView.setRenderer(questo); // Associa il cartoneView a questa attività. setCardboardView(cardboardView); // Inizializza qui altri oggetti .... }
Rendi la vista
Una volta ottenuto CardboardView, lo associ a un renderer, quindi associ CardboardView all'attività. Cardboard supporta due tipi di renderer, ma il modo più rapido per iniziare è usare CardboardView.StereoRenderer, che è ciò che usa l'app demo.
CardboardView.StereoRenderer include questi metodi chiave:
- onNewFrame(), chiamato ogni volta che l'app esegue il rendering.
- onDrawEye(), chiamato per ciascun occhio con parametri oculari diversi.
L'implementazione di questi è simile a ciò che faresti normalmente per un'applicazione OpenGL. Questi metodi sono discussi più dettagliatamente nelle sezioni seguenti.
Implementare su NewFrame
Utilizzare il metodo onNewFrame() per codificare la logica di rendering prima che venga eseguito il rendering dei singoli occhi. Qualsiasi operazione per fotogramma non specifica per una singola vista dovrebbe avvenire qui. Questo è un buon posto per aggiornare il tuo modello. In questo frammento di codice, la variabile mHeadView contiene la posizione della testa. Questo valore deve essere salvato per essere utilizzato in seguito per dire se l'utente sta guardando un tesoro:
/** * Prepara OpenGL ES prima di disegnare una cornice. * @param headTransform La trasformazione della testa nel nuovo frame. */ @Oltrepassare public void onNewFrame(HeadTransform headTransform) { ... headTransform.getHeadView(mHeadView, 0); ... }
Implementare su DrawEye
Implementa onDrawEye() per eseguire la configurazione per occhio.
Questa è la carne del codice di rendering ed è molto simile alla creazione di una normale applicazione OpenGL ES2. Il frammento di codice seguente mostra come ottenere la matrice di trasformazione della vista e anche la matrice di trasformazione della prospettiva. Devi assicurarti di eseguire il rendering con una bassa latenza. L'oggetto Eye contiene le matrici di trasformazione e proiezione per l'occhio. Questa è la sequenza degli eventi:
- Il tesoro entra nello spazio degli occhi.
- Applichiamo la matrice di proiezione. Ciò fornisce la scena renderizzata per l'occhio specificato.
- Il Cardboard SDK applica automaticamente la distorsione per rendere la scena finale.
/** * Disegna una cornice per un occhio. * * @param eye L'occhio da renderizzare. Include tutte le trasformazioni richieste. */ @Oltrepassare public void onDrawEye(Eye eye) { GLES20.glCancella(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); ... // Applica la trasformazione dell'occhio alla fotocamera. Matrix.multiplyMM(mView, 0, eye.getEyeView(), 0, mCamera, 0); // Imposta la posizione della luce Matrix.multiplyMV(mLightPosInEyeSpace, 0, mView, 0, LIGHT_POS_IN_WORLD_SPACE, 0); // Crea le matrici ModelView e ModelViewProjection // per il calcolo della posizione e della luce del cubo. float[] prospettiva = eye.getPerspective(Z_NEAR, Z_FAR); Matrix.multiplyMM(mModelView, 0, mView, 0, mModelCube, 0); Matrix.multiplyMM(mModelViewProjection, 0, prospettiva, 0, mModelView, 0); drawCube(); // Disegna il resto della scena. ... }
Gestione degli input
Il visore Cardboard include un pulsante che utilizza un magnete. Quando si preme il magnete, il campo magnetico cambia e viene rilevato dal magnetometro del telefono. Questi eventi magnetici vengono rilevati da Cardboard SDK per te.
Per fornire un comportamento personalizzato quando l'utente tira il magnete, sovrascriviCardboardActivity.onCardboardTrigger() nell'attività della tua app. Nell'app di caccia al tesoro, se hai trovato il tesoro e hai tirato la calamita, puoi conservare il tesoro:
/** * Aumenta il punteggio, nascondi l'oggetto e dai un feedback se l'utente tira il magnete mentre * guardando l'oggetto. In caso contrario, ricorda all'utente cosa fare. */ @Oltrepassare vuoto pubblico suCardboardTrigger() { se (isLookingAtObject()) { punteggio m++; mOverlayView.show3DToast("Trovato! Cercane un altro.\nScore = " + mScore); ... } altro { mOverlayView.show3DToast("Guarda intorno per trovare l'oggetto!"); } // Fornisci sempre feedback agli utenti mVibrator.vibrate(50); }
Inizia il tuo progetto
Ora che hai più familiarità con Cardboard SDK per Android, è il momento di creare le tue applicazioni.
Che si tratti di un nuovo progetto che inizi da zero o di uno esistente, ecco cosa dovresti fare.
1) Scarica i due file JAR. Clicca qui per scaricare
2) Copialo e incollalo nella tua cartella app/libs (trova questo nella vista progetto di Android Studio Project Structure)
3) Fare clic con il tasto destro sulle librerie e selezionare "Aggiungi come libreria"
Quindi, assicurati che le seguenti righe siano presenti nel file app/build.gradle del tuo progetto:
dipendenze { … compile fileTree(dir: 'libs', include: ['*.jar']) }
Sei pronto per dare il via allo sviluppo di app di realtà virtuale!