Belajar Mengembangkan Aplikasi Android Virtual Reality dari Awal
Diterbitkan: 2015-11-16Artikel ini akan memandu Anda tentang cara mengembangkan Aplikasi Android Virtual Reality dari awal, dengan asumsi bahwa Anda sudah mengetahui dasar-dasar pengembangan Aplikasi Android.
Persyaratan
- Android Studio 1.0 atau lebih tinggi
- Versi 19 Android SDK
- Perangkat Android fisik yang menjalankan Android 16 (Jelly Bean) atau Lebih Tinggi
File Manifes
<manifest... <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" /> <aplikasi ... <aktivitas android:nama=".Aktivitas Utama" android:screenOrientation="landscape"> ... <intent-filter> <action android:name="android.intent.action.MAIN" /> <kategori android:name="android.intent.category.LAUNCHER" /> <kategori android:name="com.google.intent.category.CARDBOARD" /> </intent-filter> </aktivitas> </aplikasi> </manifest>
Menjelaskan izin:
- <uses-sdk android:minSdkVersion="16″/> menunjukkan bahwa perangkat harus menjalankan API Level 16 (Jellybean) atau lebih tinggi.
- <uses-sdk android:targetSdkVersion="19″/> menunjukkan aplikasi kami menargetkan API Level 19 (KitKat).
- <uses-feature android:glEsVersion=”0x00020000″ android:required=”true” /> menunjukkan bahwa aplikasi menggunakan grafik sehingga harus mendukung OpenGL ES 2.0.
- android:screenOrientation="landscape" menunjukkan bahwa orientasi layar yang diperlukan aktivitas adalah "landscape". Ini adalah orientasi yang harus Anda atur untuk aplikasi VR. Tampilan yang digunakan oleh Cardboard SDK, CardboardView, hanya dirender pada mode layar penuh dan lanskap (lanskap, reverseLandscape, sensorLandscape).
- Pengaturan android:configChanges="orientation|keyboardHidden" juga disarankan, tetapi tidak wajib.
- izin android.permission.NFC diperlukan oleh Cardboard SDK untuk mengakses tag NFC Cardboard.
- android.permission.READ_EXTERNAL_STORAGE dan android.permission.WRITE_EXTERNAL_STORAGE . Izin ini diperlukan oleh Cardboard SDK untuk memasangkan ponsel pengguna ke penampil VR mereka.
- izin android.permission.VIBRATE diperlukan oleh aplikasi demo kami untuk membuat ponsel bergetar untuk memberi tahu pengguna bahwa sesuatu telah terjadi.
- Filter maksud dan khususnya com.google.intent.category.CARDBOARD menyatakan bahwa aktivitas ini kompatibel dengan pemirsa seperti Cardboard. Kategori ini digunakan oleh aplikasi Cardboard untuk mendaftar aplikasi kompatibel yang terpasang di ponsel pengguna.
Perluas Aktivitas Karton:
CardboardActivity adalah titik awal untuk mengkodekan aplikasi kardus. CardboardActivity adalah aktivitas dasar yang menyediakan integrasi mudah dengan perangkat Cardboard. Ini memaparkan peristiwa untuk berinteraksi dengan Cardboards dan menangani banyak detail yang biasanya diperlukan saat membuat aktivitas untuk rendering VR.
Perhatikan bahwa CardboardActivity menggunakan mode imersif yang melekat, di mana UI sistem disembunyikan, dan konten memenuhi seluruh layar. Ini adalah persyaratan untuk aplikasi VR, karena CardboardView hanya akan dirender saat aktivitas dalam mode layar penuh.
Android 4.4 (API Level 19) memperkenalkan tanda SYSTEM_UI_FLAG_IMMERSIVE baru untuk setSystemUiVisibility() yang memungkinkan aplikasi Anda benar-benar "layar penuh". Bendera ini, bila digabungkan dengan bendera SYSTEM_UI_FLAG_HIDE_NAVIGATION dan SYSTEM_UI_FLAG_FULLSCREEN, menyembunyikan bilah navigasi dan status dan memungkinkan aplikasi Anda menangkap semua peristiwa sentuh di layar.
Tentukan CardBoardView:
Semua elemen antarmuka pengguna dalam aplikasi Android dibuat menggunakan tampilan. Cardboard SDK untuk Android menyediakan tampilannya sendiri, CardboardView, yang merupakan ekstensi kenyamanan GLSurfaceView yang dapat digunakan untuk rendering VR. CardboardView merender konten dalam stereo. Anda dapat melihat bagaimana aplikasi demo mendefinisikan aCardboardView ke dalam file xml tata letak aktivitasnya dengan cara berikut:
<com.google.vrtoolkit.cardboard.CardboardView android:fill_parent" android:layout_height="fill_parent" />
Kemudian di kelas aktivitas utama ini menginisialisasi CardboardView dalam metode onCreate():
** * Menyetel tampilan ke CardboardView kami dan menginisialisasi matriks transformasi yang akan kami gunakan * untuk membuat adegan kami. * @param disimpanInstanceState */ @Mengesampingkan public void onCreate(Bundle saveInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.common_ui); CardboardView CardboardView = (CardboardView) findViewById(R.id.cardboard_view); // Kaitkan CardboardView.StereoRenderer dengan CardboardView. kartonView.setRenderer(ini); // Kaitkan kartonView dengan aktivitas ini. setCardboardView(cardboardView); // Inisialisasi objek lain di sini .... }
Render tampilan
Setelah Anda mendapatkan CardboardView, Anda mengaitkannya dengan perender, dan kemudian Anda mengaitkan CardboardView dengan aktivitas tersebut. Cardboard mendukung dua jenis perender, tetapi cara tercepat untuk memulai adalah menggunakan CardboardView.StereoRenderer, yang digunakan oleh aplikasi demo.
CardboardView.StereoRenderer menyertakan metode utama ini:
- onNewFrame(), dipanggil setiap kali aplikasi itu dirender.
- onDrawEye(), memanggil setiap mata dengan parameter mata yang berbeda.
Menerapkan ini mirip dengan apa yang biasanya Anda lakukan untuk aplikasi OpenGL. Metode-metode ini dibahas secara lebih rinci di bagian berikut.
Terapkan diNewFrame
Gunakan metode onNewFrame() untuk mengkodekan logika rendering sebelum mata individu dirender. Operasi per-bingkai apa pun yang tidak spesifik untuk satu tampilan harus terjadi di sini. Ini adalah tempat yang baik untuk memperbarui model Anda. Dalam cuplikan ini, variabel mHeadView berisi posisi kepala. Nilai ini perlu disimpan untuk digunakan nanti untuk mengetahui apakah pengguna sedang melihat harta karun:
/** * Mempersiapkan OpenGL ES sebelum kita menggambar bingkai. * @param headTransform Transformasi kepala dalam bingkai baru. */ @Mengesampingkan public void onNewFrame(HeadTransform headTransform) { ... headTransform.getHeadView(mHeadView, 0); ... }
Terapkan onDrawEye
Terapkan onDrawEye() untuk melakukan konfigurasi per-mata.
Ini adalah inti dari kode rendering, dan sangat mirip dengan membangun aplikasi OpenGL ES2 biasa. Cuplikan berikut menunjukkan cara mendapatkan matriks transformasi tampilan, dan juga matriks transformasi perspektif. Anda perlu memastikan bahwa Anda membuat dengan latensi rendah. Objek Mata berisi matriks transformasi dan proyeksi untuk mata. Berikut rangkaian acaranya:
- Harta itu datang ke ruang mata.
- Kami menerapkan matriks proyeksi. Ini memberikan pemandangan yang diberikan untuk mata yang ditentukan.
- Cardboard SDK menerapkan distorsi secara otomatis, untuk merender adegan terakhir.
/** * Menggambar bingkai untuk mata. * * @param eye Mata untuk dirender. Termasuk semua transformasi yang diperlukan. */ @Mengesampingkan public void onDrawEye(Mata mata) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); ... // Terapkan transformasi mata ke kamera. Matrix.multiplyMM(mView, 0, eye.getEyeView(), 0, mCamera, 0); // Atur posisi lampu Matrix.multiplyMV(mLightPosInEyeSpace, 0, mView, 0, LIGHT_POS_IN_WORLD_SPACE, 0); // Bangun matriks ModelView dan ModelViewProjection // untuk menghitung posisi kubus dan cahaya. float[] perspektif = eye.getPerspective(Z_NEAR, Z_FAR); Matrix.multiplyMM(mModelView, 0, mView, 0, mModelCube, 0); Matrix.multiplyMM(mModelViewProjection, 0, perspektif, 0, mModelView, 0); drawCube(); // Gambar sisa adegan. ... }
Menangani masukan
Penampil Cardboard menyertakan tombol tekan yang menggunakan magnet. Saat Anda mendorong magnet, medan magnet berubah dan terdeteksi oleh magnetometer ponsel Anda. Peristiwa magnet ini dideteksi oleh Cardboard SDK untuk Anda.
Untuk memberikan perilaku kustom saat pengguna menarik magnet, overrideCardboardActivity.onCardboardTrigger() dalam aktivitas aplikasi Anda. Di aplikasi berburu harta karun, jika Anda menemukan harta karun dan menarik magnetnya, Anda dapat menyimpan harta karun itu:
/** * Tingkatkan skor, sembunyikan objek, dan berikan umpan balik jika pengguna menarik magnet saat * melihat objek. Jika tidak, ingatkan pengguna apa yang harus dilakukan. */ @Mengesampingkan public void onCardboardTrigger() { if (isLookingAtObject()) { mScore++; mOverlayView.show3DToast("Ditemukan! Cari yang lain.\nScore = " + mScore); ... } kalau tidak { mOverlayView.show3DToast("Lihat sekeliling untuk menemukan objek!"); } // Selalu berikan umpan balik pengguna mVibrator.vibrate(50); }
Mulai proyek Anda sendiri
Sekarang setelah Anda lebih mengenal Cardboard SDK untuk Android, sekarang saatnya membuat aplikasi Anda sendiri.
Baik itu proyek baru yang Anda mulai dari awal atau yang sudah ada, inilah yang harus Anda lakukan.
1) Unduh dua file JAR. Klik di sini untuk mengunduh
2) Salin dan tempel ke folder app/libs Anda (Temukan ini di tampilan Proyek Struktur Proyek Android Studio)
3) Klik kanan pada perpustakaan dan pilih "Tambah sebagai perpustakaan"
Kemudian, pastikan baris berikut ada di file app/build.gradle proyek Anda:
dependensi { … kompilasi fileTree(dir: 'libs', include: ['*.jar']) }
Anda siap untuk memulai pengembangan aplikasi Virtual Reality!