Demo ARKit: Pembuatan Film Realitas Tertambah
Diterbitkan: 2022-03-11AR dan VR menjadi arus utama, dan semua perusahaan teknologi tinggi terkemuka mengejar mereka: Apple memiliki ARKit, Google memiliki ARCore dan Microsoft memiliki HoloLens mereka sendiri (dan kemudian, tentu saja, ada Unity). Dan dengan beberapa aplikasi yang menerima banyak perhatian publik, pengembangan aplikasi augmented reality menjadi keterampilan yang sangat diinginkan oleh pengembang seluler.
Dalam artikel ini, saya ingin mendemonstrasikan aplikasi kecil yang sederhana, namun bermakna, yang akan melakukan lebih dari sekadar memiliki kubus yang berputar. Siapa yang butuh kubus berputar? Mari kita membuat The Matrix.
Pengantar ARKit
ARKit adalah kerangka kerja Apple untuk membuat aplikasi AR untuk perangkat iOS. Beberapa renderer dapat digunakan dengannya: SpriteKit untuk objek 2D, SceneKit untuk 3D, dan Metal jika kita ingin mengimplementasikan renderer kustom.
Untuk demo ini, kita akan menggunakan SceneKit untuk merender dan menempatkan objek 3D (pisau) yang dirender sepenuhnya.
Dari ARKit v2, lima jenis konfigurasi didukung di ARKit:
AROrientationTrackingConfiguration – Bila Anda hanya ingin melacak orientasi perangkat (misalnya, untuk aplikasi konstelasi bintang). Dengan konfigurasi ini, gerakan fisik seperti side-stepping tidak terlacak dan tidak akan mempengaruhi posisi atau arah objek di tempat kejadian.
ARWorldTrackingConfiguration – Ini mungkin konfigurasi yang paling sering digunakan untuk AR karena mendukung apa yang kebanyakan orang anggap sebagai augmented reality. Contohnya termasuk hewan peliharaan virtual atau aplikasi berburu Pokemon.
ARFaceTrackingConfiguration – Konfigurasi ini saat ini hanya didukung oleh iPhone X karena memerlukan kamera TrueDepth (seperti Face ID). Konfigurasi ini melacak fitur pada wajah dan offset relatifnya dari ekspresi wajah netral (misalnya, aplikasi di mana pengguna dapat mencoba kacamata hitam fashion sebelum memesannya).
ARImageTrackingConfiguration – Jika Anda memiliki satu set penanda dan ingin menunjukkan hewan melompat keluar dari penanda, maka konfigurasi ini tepat untuk Anda. Ini tidak harus berupa spidol seperti kartu, tetapi gambar 2D apa pun. Anda bisa mengarahkan kamera Anda ke Mona Lisa, dan dia akan menoleh dan memberi tahu Anda sesuatu. Kerugiannya adalah Anda harus mengatakan terlebih dahulu berapa ukuran fisik penanda gambar.
ARObjectScanningConfiguration – Konfigurasi ini adalah versi 3D dari ARImageTrackingConfiguration.
Dalam demo ini, kami akan menambahkan pisau dan peluru ke tempat kejadian, dan kami ingin memiliki enam derajat kebebasan, jadi alat yang sesuai adalah ARWorldTrackingConfiguration.
Konsep Aplikasi
Setiap orang yang telah melihat The Matrix dapat mengingat Neo (Keanu Reeves) menghindari peluru dan menghentikannya di udara. Aplikasi kami akan membantu kami membuat ulang adegan ini dari umpan kamera langsung. Dengan demikian, kami dapat membuat video khusus yang menunjukkan kekuatan seperti Neo.
Aplikasi kami akan memiliki model peluru dan pisau 3D. Terserah pengguna berapa banyak peluru atau pisau yang mereka inginkan dalam film mereka. Jika Anda ingin meluangkan waktu dan menambahkan model lain, kode aplikasi open source dan tersedia di GitHub (https://github.com/altaibayar/toptal_ar_video_maker). Meskipun ini bukan tutorial AR lengkap, demo dan sumbernya harus menjadi sumber yang berharga jika Anda mencoba masuk ke pengembangan Aplikasi AR di iOS.
Skenario use case yang dimaksud adalah sebagai berikut:
- minta teman berpakaian seperti Neo (Tidak sepenuhnya diperlukan untuk fungsi aplikasi, tetapi mungkin juga terlihat bagus saat kita melakukan ini).
- Minta "Neo" untuk berdiri sekitar 10 meter (30 kaki) dari Anda.
- Mulai aplikasi dan pindai bidang tanah.
- Tambahkan peluru dan pisau terbang di "Neo."
- Tahan tombol rekam untuk merekam video saat "Neo" melakukan beberapa gerakan keren menghindari atau menghentikan peluru
- lepaskan tombol rekam dan simpan video ke perpustakaan Anda.
Membangun Aplikasi
Seperti yang disebutkan sebelumnya, kami ingin dapat bergerak bebas saat merekam semua 360 pemandangan dan membuat peluru dan pisau melacak gerakan kamera dengan tepat.

Untuk tujuan demonstrasi, kita hanya memiliki dua jenis objek virtual: pisau dan peluru senapan.
Pisau adalah objek detail dan saya akan menggunakan model gratis dari https://poly.google.com/view/3TnnfzKfHrq (Terima kasih Andrew).
Peluru shotgun, bagaimanapun, adalah objek bulat sederhana dan kita dapat dengan mudah mengkodekannya. Kita akan membuatnya metalik dan merah-panas untuk variasi. Karena kami meniru senapan, kami juga akan membuatnya sebagai kelompok yang dikelompokkan. Untuk membuat pengelompokan masuk akal tanpa terlalu banyak kerumitan, kita dapat menggunakan generator angka acak Gaussian dari GamplayKit.
GameplayKit adalah alat berguna yang berguna kapan pun Anda membutuhkan pembangkitan derau acak, mesin status, AI, atau pengambilan keputusan berbasis probabilitas.
override init() { super.init(); // generate 50 gaussian distributed position around [0, 0, 0] let positions = Randomness.gaussian(center: SCNVector3Zero, count: 50); for pos in positions { let node = SCNNode(geometry: sphereGeometry()); node.position = pos; self.addChildNode(node); } } private func sphereGeometry() -> SCNGeometry { // radius of one projectile sphere is 5mm/0.2inch let sphere = SCNSphere(radius: 0.005); // sphere is reddish sphere.firstMaterial?.diffuse.contents = UIColor.red; // reflection on light is gray/silver sphere.firstMaterial?.reflective.contents = UIColor.gray; // metalness is 0.3 sphere.firstMaterial?.metalness.contents = 0.3; // shading should be realistic sphere.firstMaterial?.lightingModel = .physicallyBased; return sphere; }
Logika offset acak serupa dapat digunakan untuk pisau, tetapi karena pisau tidak berperilaku sebagai kluster, distribusi acak sederhana dapat digunakan.
Arsitektur Aplikasi
Di luar cakupan demo ini, diskusi tentang paradigma arsitektur mana yang terbaik. Ada banyak artikel di luar sana yang membahas topik itu.
Sebagai gantinya, saya hanya akan memaparkan struktur proyek sebagai panduan untuk menemukan jalan Anda di sekitar proyek GitHub yang ditautkan: apa komponen utamanya, bagaimana mereka terhubung, dan mengapa mereka dipilih.
Aplikasi ini hanya memiliki tiga layar:
PermissionViewController – Layar tempat kami meminta pengguna untuk memberikan akses aplikasi ke fitur seluler yang diperlukan.
- Kamera – Jelas
- Galeri – Untuk menyimpan rekaman video dan input mikrofon
- Mikrofon – Izin diperlukan oleh perpustakaan yang saya gunakan untuk membuat video (secara default, suara dari mikrofon akan digunakan sebagai sumber trek audio).
ExportViewController – Layar ini menampilkan video yang direkam dan menawarkan opsi untuk membagikan atau menyimpan video.
MainViewController – Semua keajaiban terjadi di sini.
Dari pengalaman saya, yang terbaik adalah Anda membungkus semua kelas ARKit yang diperlukan seperti ARSession, ARConfiguration, dan semua jenis SCNNode yang unik. Dengan begitu, kodenya sudah cukup jelas.
ARSession diwarisi ke ToptalARSession, dan kelas sesi baru hanya memiliki tiga metode: konstruktor kelas tempat kami mengatur semua yang diperlukan dan metode resetTracking dan pauseTracking.
Aplikasi ini mengenali empat jenis SCNNode yang unik:
- KnifeNode – Mewakili objek 3D pisau, dan secara otomatis memuat pisau 3D sebagai geometrinya.
BulletsNode – Node ini mewakili satu set peluru senapan. Kebisingan Gaussian acak, warna, dan mode pencahayaan fisik diatur secara otomatis.
Tidak ada pekerjaan khusus atau tambahan yang diperlukan di kelas yang menggunakan KnifeNode atau BulletsNode, dan mereka dapat digunakan sebagai template untuk menyesuaikan aplikasi untuk menambahkan lebih banyak jenis objek 3D.
- ReticleNode – Membungkus model 3D yang muncul di pemandangan di atas lantai untuk menunjukkan di mana pisau atau peluru akan ditambahkan.
- DirectionalLightNode - Ini adalah simpul yang mewakili cahaya vertikal yang mengarah ke bawah.
Referensi dan Kredit
Model pisau: https://poly.google.com/view/3TnnfzKfHrq
Merekam dari SCNScene: https://github.com/svtek/SceneKitVideoRecorder
Ikon tombol, aplikasi demo ARKit: https://developer.apple.com/documentation/arkit/handling_3d_interaction_and_ui_controls_in_augmented_reality