Demo ARKit: realizzazione di filmati in realtà aumentata
Pubblicato: 2022-03-11AR e VR stanno diventando mainstream e tutte le principali aziende high-tech le stanno perseguendo: Apple ha ARKit, Google ha ARCore e Microsoft ha il proprio HoloLens (e poi, ovviamente, c'è Unity). E con alcune applicazioni che ricevono molta attenzione da parte del pubblico, lo sviluppo di app di realtà aumentata sta diventando un'abilità molto desiderabile per gli sviluppatori mobili.
In questo articolo, vorrei dimostrare una piccola app semplice ma significativa che farà di più che avere semplicemente un cubo rotante. Chi ha bisogno di cubi rotanti comunque? Facciamo The Matrix.
Introduzione ad ARKit
ARKit è un framework Apple per la creazione di app AR per dispositivi iOS. È possibile utilizzare diversi renderer: SpriteKit per oggetti 2D, SceneKit per 3D e Metal se vogliamo implementare un renderer personalizzato.
Per questa demo, utilizzeremo SceneKit per eseguire il rendering e posizionare oggetti 3D completamente renderizzati (coltelli).
Da ARKit v2, in ARKit sono supportati cinque tipi di configurazione:
AROrientationTrackingConfiguration – Quando si desidera tracciare solo l'orientamento del dispositivo (ad esempio, per un'applicazione di costellazioni di stelle). Con questa configurazione, i movimenti fisici come i passi laterali non vengono tracciati e non influiranno sulla posizione o sulla direzione degli oggetti sulla scena.
ARWorldTrackingConfiguration – Questa è probabilmente la configurazione più utilizzata per AR poiché supporta ciò che la maggior parte delle persone considererebbe la realtà aumentata. Gli esempi includono animali virtuali o applicazioni di caccia di Pokemon.
ARFaceTrackingConfiguration – Questa configurazione è attualmente supportata solo da iPhone X perché richiede una fotocamera TrueDepth (come Face ID). Questa configurazione tiene traccia delle caratteristiche del viso e del relativo offset dall'espressione facciale neutra (ad esempio, un'applicazione in cui gli utenti possono provare occhiali da sole alla moda prima di ordinarli).
ARImageTrackingConfiguration – Se hai un set di marker e vuoi mostrare gli animali che saltano fuori dal marker, allora questa configurazione è giusta per te. Questi non devono essere pennarelli simili a carte, ma qualsiasi immagine 2D. Potresti puntare la tua macchina fotografica verso la Gioconda, e lei girerebbe la testa e ti direbbe qualcosa. Uno svantaggio è che devi dire in anticipo qual è la dimensione fisica dell'indicatore dell'immagine.
ARObjectScanningConfiguration : questa configurazione è la versione 3D di ARImageTrackingConfiguration.
In questa demo, aggiungeremo coltelli e proiettili alla scena e vorremmo avere sei gradi di libertà, quindi lo strumento appropriato è ARWorldTrackingConfiguration.
Il concetto di app
Tutti coloro che hanno visto Matrix possono ricordare che Neo (Keanu Reeves) schiva i proiettili e li ferma a mezz'aria. La nostra applicazione ci aiuterà a ricreare questa scena da un feed live della telecamera. Pertanto, possiamo creare video personalizzati che dimostrano i poteri neo-simili.
La nostra app avrà modelli 3D di proiettili e coltelli. Spetta all'utente quanti proiettili o coltelli desidera nel film. Se desideri dedicare un po' di tempo e aggiungere altri modelli, il codice dell'app è open source ed è disponibile su GitHub (https://github.com/altaibayar/toptal_ar_video_maker). Anche se questo non è un tutorial AR completo, la demo e la fonte dovrebbero essere una risorsa preziosa se stai cercando di entrare nello sviluppo di app AR su iOS.
Lo scenario del caso d'uso previsto è il seguente:
- chiedi a un amico di vestirsi da Neo (non strettamente necessario per il funzionamento dell'applicazione, ma potrebbe anche avere un bell'aspetto mentre lo stiamo facendo).
- Chiedi a "Neo" di stare a una decina di metri da te.
- Avvia l'applicazione e scansiona il piano terra.
- Aggiungi proiettili e coltelli che volano a "Neo".
- Tieni premuto il pulsante di registrazione per registrare il video mentre "Neo" esegue alcune mosse interessanti schivando o fermando i proiettili
- rilascia il pulsante di registrazione e salva il video nella tua libreria.
Costruire l'app
Come accennato in precedenza, vogliamo essere in grado di muoverci liberamente mentre registriamo tutta la scena a 360 gradi e fare in modo che i proiettili e i coltelli seguano il movimento della telecamera in modo appropriato.

A scopo dimostrativo, avremo solo due tipi di oggetti virtuali: coltelli e proiettili di fucile.
I coltelli sono oggetti dettagliati e userò il modello gratuito da https://poly.google.com/view/3TnnfzKfHrq (Grazie Andrew).
I proiettili di fucile, tuttavia, sono semplici oggetti sferici e possiamo semplicemente codificarli. Li renderemo metallici e roventi per la varietà. Dal momento che stiamo emulando un fucile, li genereremo anche come gruppi raggruppati. Per dare un senso al raggruppamento senza troppi problemi, possiamo usare il generatore di numeri casuali gaussiani del GaplayKit.
GameplayKit è uno strumento utile che torna utile ogni volta che hai bisogno di generazione casuale di rumore, macchina a stati, intelligenza artificiale o processo decisionale basato sulla probabilità.
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; }
Una logica di offset casuale simile può essere utilizzata per i coltelli, ma poiché non si comportano come gruppi, è possibile utilizzare una semplice distribuzione casuale.
Architettura dell'app
È oltre lo scopo di questa demo approfondire le discussioni su quale paradigma dell'architettura sia il migliore. Ci sono molti articoli là fuori che approfondiscono questo argomento.
Invece, illustrerò la struttura del progetto come guida per orientarsi nel progetto GitHub collegato: quali sono i componenti principali, come sono collegati e perché sono stati scelti.
L'applicazione ha solo tre schermate:
PermissionViewController – La schermata in cui chiediamo all'utente di concedere all'applicazione l'accesso alle funzionalità mobili richieste.
- Fotocamera – Ovviamente
- Galleria – Per salvare il video registrato e l'ingresso del microfono
- Microfono : l'autorizzazione è richiesta da una libreria che sto utilizzando per creare il video (per impostazione predefinita, l'audio del microfono viene utilizzato come sorgente di una traccia audio).
ExportViewController : questa schermata mostra un video registrato e offre le opzioni per condividere o salvare il video.
MainViewController – Tutta la magia avviene qui.
In base alla mia esperienza, è meglio racchiudere tutte le classi ARKit necessarie come ARSession, ARConfiguration e tutti i tipi univoci di SCNNode. In questo modo, il codice è autoesplicativo.
ARSession viene ereditato in ToptalARSession e la nuova classe di sessione ha solo tre metodi: il costruttore di classi in cui impostiamo tutto ciò che è richiesto e i metodi resetTracking e pauseTracking.
L'applicazione riconosce quattro tipi univoci di SCNNodes:
- KnifeNode – Rappresenta un oggetto 3D coltello e carica automaticamente un coltello 3D come sua geometria.
BulletsNode – Questo nodo rappresenta una serie di proiettili per fucili. Il rumore gaussiano casuale, i colori e la modalità di illuminazione fisica vengono impostati automaticamente.
Non è richiesto alcun lavoro speciale o aggiuntivo nelle classi che utilizzano KnifeNode o BulletsNode e possono essere utilizzate come modelli per personalizzare l'applicazione per aggiungere più tipi di oggetti 3D.
- ReticleNode – Avvolge un modello 3D che appare nella scena sopra il pavimento per mostrare dove verranno aggiunti coltelli o proiettili.
- DirectionalLightNode – Questo è un nodo che rappresenta una luce verticale che punta verso il basso.
Riferimenti e crediti
Modello di coltello: https://poly.google.com/view/3TnnfzKfHrq
Registrazione da SCNScene: https://github.com/svtek/SceneKitVideoRecorder
Icone dei pulsanti, applicazione demo ARKit: https://developer.apple.com/documentation/arkit/handling_3d_interaction_and_ui_controls_in_augmented_reality