Erfahren Sie, wie Sie Virtual-Reality-Android-Apps von Grund auf neu entwickeln
Veröffentlicht: 2015-11-16In diesem Artikel erfahren Sie, wie Sie Virtual Reality-Android-Apps von Grund auf neu entwickeln, vorausgesetzt, Sie kennen bereits die Grundlagen der Entwicklung von Android-Apps.
Anforderungen
- Android Studio 1.0 oder höher
- Version 19 des Android-SDK
- Ein physisches Android-Gerät mit Android 16 (Jelly Bean) oder höher
Die Manifestdatei
<manifestieren ... <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" /> <Anwendung ... <Aktivität android:name=".MainActivity" android:screenOrientation="landscape"> ... <Absichtsfilter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="com.google.intent.category.CARDBOARD" /> </intent-filter> </Aktivität> </Anwendung> </manifest>
Erklärung der Berechtigungen:
- <uses-sdk android:minSdkVersion=”16″/> gibt an, dass auf dem Gerät API Level 16 (Jellybean) oder höher ausgeführt werden muss.
- <uses-sdk android:targetSdkVersion=”19″/> gibt an, dass unsere App auf API Level 19 (KitKat) abzielt.
- <uses-feature android:glEsVersion=“0x00020000″ android:required=“true“ /> gibt an, dass die App Grafiken verwendet und daher OpenGL ES 2.0 unterstützen muss.
- android:screenOrientation="Landscape" gibt an, dass die erforderliche Bildschirmausrichtung der Aktivität "Querformat" ist. Dies ist die Ausrichtung, die Sie für VR-Apps festlegen müssen. Die vom Cardboard SDK verwendete Ansicht, CardboardView, wird nur im Vollbild- und Querformat (Querformat, ReverseLandscape, SensorLandscape) gerendert.
- Die Einstellung android:configChanges="orientation|keyboardHidden" ist ebenfalls empfehlenswert, aber nicht zwingend erforderlich.
- Die Berechtigung android.permission.NFC wird vom Cardboard SDK benötigt, um auf das NFC-Tag von Cardboard zuzugreifen.
- android.permission.READ_EXTERNAL_STORAGE und android.permission.WRITE_EXTERNAL_STORAGE . Diese Berechtigungen werden vom Cardboard SDK benötigt, um das Telefon des Benutzers mit seinem VR-Viewer zu koppeln.
- Die android.permission.VIBRATE- Berechtigung wird von unserer Demo-App benötigt, um das Telefon vibrieren zu lassen, um den Benutzer darüber zu informieren, dass etwas passiert ist.
- Der Intent-Filter und insbesondere com.google.intent.category.CARDBOARD geben an, dass diese Aktivität mit Cardboard-ähnlichen Zuschauern kompatibel ist. Diese Kategorie wird von der Cardboard-App verwendet, um kompatible Apps aufzulisten, die auf dem Telefon des Benutzers installiert sind.
Erweitern Sie die Cardboard-Aktivität:
CardboardActivity ist der Ausgangspunkt für die Codierung einer Cardboard-App. CardboardActivity ist die Basisaktivität, die eine einfache Integration mit Cardboard-Geräten ermöglicht. Es stellt Ereignisse für die Interaktion mit Cardboards bereit und behandelt viele der Details, die üblicherweise beim Erstellen einer Aktivität für das VR-Rendering erforderlich sind.
Beachten Sie, dass CardboardActivity den Sticky-Immersive-Modus verwendet, in dem die Benutzeroberfläche des Systems ausgeblendet ist und der Inhalt den gesamten Bildschirm einnimmt. Dies ist eine Voraussetzung für eine VR-App, da CardboardView nur rendert, wenn sich die Aktivität im Vollbildmodus befindet.
Android 4.4 (API Level 19) führt ein neues SYSTEM_UI_FLAG_IMMERSIVE-Flag für setSystemUiVisibility() ein, mit dem Ihre App wirklich „Vollbild“ werden kann. Dieses Flag blendet in Kombination mit den Flags SYSTEM_UI_FLAG_HIDE_NAVIGATION und SYSTEM_UI_FLAG_FULLSCREEN die Navigations- und Statusleisten aus und lässt Ihre App alle Berührungsereignisse auf dem Bildschirm erfassen.
Definieren Sie eine CardBoardView:
Alle Elemente der Benutzeroberfläche in einer Android-App werden mithilfe von Ansichten erstellt. Das Cardboard SDK für Android bietet eine eigene Ansicht, CardboardView, eine praktische Erweiterung von GLSurfaceView, die für das VR-Rendering verwendet werden kann. CardboardView rendert Inhalte in Stereo. Sie können sehen, wie die Demo-App aCardboardView in ihrer Aktivitätslayout-XML-Datei auf folgende Weise definiert:
<com.google.vrtoolkit.cardboard.CardboardView android:fill_parent" android:layout_height="fill_parent" />
Dann initialisiert es in der Hauptaktivitätsklasse die CardboardView in der Methode onCreate():
** * Setzt die Ansicht auf unsere CardboardView und initialisiert die Transformationsmatrizen, die wir verwenden werden * um unsere Szene zu rendern. * @param savedInstanceState */ @Überschreiben public void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.common_ui); Kartonansicht Kartonansicht = (Kartonansicht) findViewById (R.id.cardboard_view); // CardboardView.StereoRenderer mit KartonView verknüpfen. KartonView.setRenderer (dies); // Verbinde die CardboardView mit dieser Aktivität. setCardboardView (Kartonansicht); // Andere Objekte hier initialisieren .... }
Rendern Sie die Ansicht
Nachdem Sie die CardboardView erhalten haben, ordnen Sie sie einem Renderer zu, und dann ordnen Sie die CardboardView der Aktivität zu. Cardboard unterstützt zwei Arten von Renderern, aber der schnellste Weg, um loszulegen, ist die Verwendung von CardboardView.StereoRenderer, die die Demo-App verwendet.
CardboardView.StereoRenderer enthält diese Schlüsselmethoden:
- onNewFrame(), wird jedes Mal aufgerufen, wenn die App rendert.
- onDrawEye(), aufgerufen für jedes Auge mit unterschiedlichen Augenparametern.
Diese zu implementieren ähnelt dem, was Sie normalerweise für eine OpenGL-Anwendung tun würden. Diese Methoden werden in den folgenden Abschnitten ausführlicher besprochen.
Implementieren Sie onNewFrame
Verwenden Sie die Methode onNewFrame(), um die Renderlogik zu codieren, bevor die einzelnen Augen gerendert werden. Alle Operationen pro Frame, die nicht spezifisch für eine einzelne Ansicht sind, sollten hier ausgeführt werden. Dies ist ein guter Ort, um Ihr Modell zu aktualisieren. In diesem Snippet enthält die Variable mHeadView die Position des Kopfes. Dieser Wert muss gespeichert werden, um ihn später zu verwenden, um festzustellen, ob der Benutzer einen Schatz betrachtet:
/** * Bereitet OpenGL ES vor, bevor wir einen Rahmen zeichnen. * @param headTransform Die Kopftransformation im neuen Frame. */ @Überschreiben public void onNewFrame(HeadTransform headTransform) { ... headTransform.getHeadView (mHeadView, 0); ... }
Implementieren Sie onDrawEye
Implementieren Sie onDrawEye(), um eine Konfiguration pro Auge durchzuführen.
Dies ist das Kernstück des Rendering-Codes und dem Erstellen einer regulären OpenGL ES2-Anwendung sehr ähnlich. Das folgende Snippet zeigt, wie Sie die Ansichtstransformationsmatrix und auch die Perspektiventransformationsmatrix erhalten. Sie müssen sicherstellen, dass Sie mit geringer Latenz rendern. Das Eye-Objekt enthält die Transformations- und Projektionsmatrizen für das Auge. Dies ist die Abfolge der Ereignisse:
- Der Schatz kommt in den Augenraum.
- Wir wenden die Projektionsmatrix an. Dadurch wird die für das angegebene Auge gerenderte Szene bereitgestellt.
- Das Cardboard SDK wendet automatisch eine Verzerrung an, um die endgültige Szene zu rendern.
/** * Zeichnet einen Rahmen für ein Auge. * * @param eye Das zu rendernde Auge. Beinhaltet alle erforderlichen Transformationen. */ @Überschreiben public void onDrawEye(Auge Auge) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); ... // Augentransformation auf die Kamera anwenden. Matrix.multiplyMM (mView, 0, eye.getEyeView(), 0, mCamera, 0); // Stellen Sie die Position des Lichts ein Matrix.multiplyMV (mLightPosInEyeSpace, 0, mView, 0, LIGHT_POS_IN_WORLD_SPACE, 0); // Erstellen Sie die ModelView- und ModelViewProjection-Matrizen // zur Berechnung der Würfelposition und des Lichts. float [] Perspektive = eye.getPerspective (Z_NEAR, Z_FAR); Matrix.multiplyMM (mModelView, 0, mView, 0, mModelCube, 0); Matrix.multiplyMM (mModelViewProjection, 0, Perspektive, 0, mModelView, 0); drawCube(); // Rest der Szene zeichnen. ... }
Umgang mit Eingaben
Der Cardboard Viewer enthält einen Druckknopf, der einen Magneten verwendet. Wenn Sie den Magneten drücken, ändert sich das Magnetfeld und wird vom Magnetometer Ihres Telefons erkannt. Diese Magnetereignisse werden vom Cardboard SDK für Sie erkannt.
Um ein benutzerdefiniertes Verhalten bereitzustellen, wenn der Benutzer den Magneten zieht, überschreiben Sie CardboardActivity.onCardboardTrigger() in der Aktivität Ihrer App. Wenn Sie in der Schatzsuche-App den Schatz gefunden und den Magneten gezogen haben, dürfen Sie den Schatz behalten:
/** * Erhöhen Sie die Punktzahl, verstecken Sie das Objekt und geben Sie Feedback, wenn der Benutzer den Magneten zieht * Betrachten des Objekts. Erinnern Sie den Benutzer andernfalls daran, was zu tun ist. */ @Überschreiben public void onCardboardTrigger() { if (isLookingAtObject()) { mScore++; mOverlayView.show3DToast("Gefunden! Sieh dich nach einem anderen um.\nScore = " + mScore); ... } anders { mOverlayView.show3DToast("Schauen Sie sich um, um das Objekt zu finden!"); } // Immer Benutzerfeedback geben mVibrator.vibrieren (50); }
Starten Sie Ihr eigenes Projekt
Jetzt, da Sie mit dem Cardboard SDK für Android besser vertraut sind, ist es an der Zeit, Ihre eigenen Anwendungen zu erstellen.
Ob es sich um ein neues Projekt handelt, das Sie von Grund auf neu beginnen, oder um ein bestehendes, hier ist, was Sie tun sollten.
1) Laden Sie die beiden JAR-Dateien herunter. Klicke hier zum herunterladen
2) Kopieren Sie es und fügen Sie es in Ihren App/Libs-Ordner ein (Sie finden es in der Projektansicht der Android Studio-Projektstruktur).
3) Klicken Sie mit der rechten Maustaste auf die Bibliotheken und wählen Sie „Als Bibliothek hinzufügen“.
Stellen Sie dann sicher, dass die folgenden Zeilen in der Datei app/build.gradle Ihres Projekts vorhanden sind:
Abhängigkeiten { … fileTree kompilieren (dir: 'libs', include: ['*.jar']) }
Sie sind bereit, der Entwicklung von Virtual Reality-Apps einen Kickstart zu geben!