ARKit Demo: Realizarea de filme în realitate mărită

Publicat: 2022-03-11

AR și VR devin mainstream și toate companiile importante de înaltă tehnologie le urmăresc: Apple are ARKit, Google are ARCore și Microsoft are propriul HoloLens (și apoi, desigur, există Unity). Și cu câteva aplicații care primesc multă atenție publică, dezvoltarea de aplicații în realitate augmentată devine o abilitate foarte de dorit pentru dezvoltatorii de telefonie mobilă.

În acest articol, aș dori să demonstrez o mică aplicație simplă, dar semnificativă, care va face mai mult decât să aibă un cub rotativ. Oricum cine are nevoie de cuburi rotative? Să facem Matrix.

Introducere în ARKit

ARKit este un cadru Apple pentru crearea de aplicații AR pentru dispozitivele iOS. Cu acesta pot fi folosite mai multe randare: SpriteKit pentru obiecte 2D, SceneKit pentru 3D și Metal dacă dorim să implementăm un randament personalizat.

Pentru această demonstrație, vom folosi SceneKit pentru a reda și a plasa obiecte 3D complet randate (cuțite).

imagine: distincție între randare

Din ARKit v2, cinci tipuri de configurații sunt acceptate în ARKit:

AROrientationTrackingConfiguration – Când doriți să urmăriți doar orientarea dispozitivului (de exemplu, pentru o aplicație de constelație de stele). Cu această configurație, mișcările fizice, cum ar fi pașii laterale, nu sunt urmărite și nu vor afecta poziția sau direcția obiectelor de pe scenă.

ARWorldTrackingConfiguration – Aceasta este probabil cea mai des folosită configurație pentru AR, deoarece acceptă ceea ce majoritatea oamenilor ar considera realitate augmentată. Exemplele includ aplicații de vânătoare pentru animale de companie virtuale sau Pokemon.

ARFaceTrackingConfiguration – Această configurație este acceptată în prezent numai de iPhone X, deoarece necesită o cameră TrueDepth (cum ar fi Face ID). Această configurație urmărește caracteristicile feței și decalajul său relativ față de expresia facială neutră (de exemplu, o aplicație în care utilizatorii pot încerca ochelari de soare la modă înainte de a-i comanda).

ARImageTrackingConfiguration – Dacă aveți un set de markere și doriți să arătați animalele care sar din marker, atunci această configurație este potrivită pentru dvs. Acestea nu trebuie să fie semne de tip card, ci orice imagine 2D. Ai putea să îndrepți camera către Mona Lisa, iar ea ar întoarce capul și ți-ar spune ceva. Un dezavantaj este că trebuie să spuneți în prealabil care este dimensiunea fizică a markerului de imagine.

ARObjectScanningConfiguration – Această configurație este versiunea 3D a ARImageTrackingConfiguration.

În această demonstrație, vom adăuga cuțite și gloanțe la scenă și am dori să avem șase grade de libertate, așa că instrumentul potrivit este ARWorldTrackingConfiguration.

Conceptul de aplicație

Toți cei care au văzut Matrix își pot aminti că Neo (Keanu Reeves) a eschivat gloanțe și le-a oprit în aer. Aplicația noastră ne va ajuta să recreăm această scenă dintr-un flux live al camerei. Astfel, putem crea videoclipuri personalizate care demonstrează puteri asemănătoare Neo.

Aplicația noastră va avea modele 3D de gloanțe și cuțite. Depinde de utilizator câte gloanțe sau cuțite își dorește în filmul său. Dacă doriți să petreceți ceva timp și să adăugați alte modele, codul aplicației este open source și este disponibil pe GitHub (https://github.com/altaibayar/toptal_ar_video_maker). Deși acesta nu este un tutorial complet AR, demonstrația și sursa ar trebui să fie o resursă valoroasă dacă încercați să intrați în dezvoltarea aplicației AR pe iOS.

Scenariul de caz de utilizare prevăzut este următorul:

  1. pune un prieten să se îmbrace în Neo (nu este strict necesar pentru funcționarea aplicației, dar ar putea la fel de bine să arate bine în timp ce facem asta).
  2. Cere-i lui „Neo” să stea la aproximativ 10 metri (30 picioare) de tine.
  3. Porniți aplicația și scanați planul de sol.
  4. Adăugați gloanțe și cuțite care zboară la „Neo”.
  5. Țineți apăsat butonul de înregistrare pentru a înregistra videoclipul în timp ce „Neo” efectuează câteva mișcări grozave evitând sau oprind gloanțele
  6. eliberați butonul de înregistrare și salvați videoclipul în biblioteca dvs.

Construirea aplicației

După cum am menționat anterior, dorim să ne putem mișca liber în timp ce înregistrăm toate scenele la 360 și ca gloanțele și cuțitele să urmărească mișcarea camerei în mod corespunzător.

În scop demonstrativ, vom avea doar două tipuri de obiecte virtuale: cuțite și gloanțe de pușcă.

Cuțitele sunt obiecte detaliate și voi folosi modelul gratuit de la https://poly.google.com/view/3TnnfzKfHrq (Mulțumesc Andrew).

Gloanțele puștilor, totuși, sunt simple obiecte sferice și le putem codifica pur și simplu. Le vom face metalice și roșii pentru varietate. Deoarece emulăm o pușcă, le vom genera și ca grupuri grupate. Pentru ca gruparea să aibă sens fără prea multe bătăi de cap, putem folosi generatorul de numere aleatorii Gaussian din GamplayKit.

GameplayKit este un instrument util care este util ori de câte ori aveți nevoie de generare aleatorie de zgomot, mașină de stare, AI sau luare a deciziilor bazate pe probabilități.

 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; }

O logică de decalaj aleatoriu similară poate fi utilizată pentru cuțite, dar deoarece acestea nu se comportă ca grupuri, poate fi utilizată o distribuție aleatorie simplă.

Arhitectura aplicației

Este dincolo de scopul acestei demonstrații să aprofundăm în discuțiile despre care paradigmă de arhitectură este cea mai bună. Există multe articole care aprofundează acest subiect.

În schimb, voi prezenta doar structura proiectului ca ghid pentru a vă găsi calea în jurul proiectului GitHub legat: care sunt componentele principale, cum sunt conectate și de ce au fost alese.

Aplicația are doar trei ecrane:

PermissionViewController – Ecranul în care solicităm utilizatorului să acorde aplicației acces la funcțiile mobile necesare.

  • Camera – Evident
  • Galerie – Pentru a salva înregistrarea video și intrarea microfonului
  • Microfon – Permisiunea este necesară de către o bibliotecă pe care o folosesc pentru a crea videoclipul (în mod implicit, sunetul de la microfon ar fi folosit ca sursă a unei piste audio).

ExportViewController – Acest ecran arată un videoclip înregistrat și oferă opțiuni de partajare sau salvare a videoclipului.

MainViewController – Toată magia se întâmplă aici.

Din experiența mea, cel mai bine este să includeți toate clasele ARKit necesare, cum ar fi ARSession, ARConfiguration și toate tipurile unice de SCNNode. În acest fel, codul se explică de la sine.

ARSession este moștenit în ToptalARSession, iar noua clasă de sesiune are doar trei metode: constructorul clasei în care setăm tot ceea ce este necesar și metodele resetTracking și pauseTracking.

Aplicația recunoaște patru tipuri unice de SCNNodes:

  • KnifeNode – Reprezintă un obiect 3D cuțit și încarcă automat un cuțit 3D ca geometrie.
  • BulletsNode – Acest nod reprezintă un set de obuze de pușcă. Zgomotul gaussian aleatoriu, culorile și modul de iluminare fizică sunt configurate automat.

    Nu este necesară nicio muncă specială sau suplimentară în clasele care folosesc KnifeNode sau BulletsNode și pot fi folosite ca șabloane pentru personalizarea aplicației pentru a adăuga mai multe tipuri de obiecte 3D.

  • ReticleNode – Înfășoară un model 3D care apare în scena de deasupra podelei pentru a arăta unde vor fi adăugate cuțite sau gloanțe.
  • DirectionalLightNode – Acesta este un nod care reprezintă o lumină verticală îndreptată în jos.

Referințe și credite

Model de cuțit: https://poly.google.com/view/3TnnfzKfHrq

Înregistrare din SCNScene: https://github.com/svtek/SceneKitVideoRecorder

Pictograme butoane, aplicație demo ARKit: https://developer.apple.com/documentation/arkit/handling_3d_interaction_and_ui_controls_in_augmented_reality