• Update(): funzione invocata ad ogni frame, se lo script è attivato all’interno dell’Inspector. La sua frequenza dipende dalla velocità alla quale il computer su cui è eseguito l’applicativo renderizza le immagini;
• FixedUpdate(): funzione invocata ad intervalli prefissati, non dipende dalle prestazioni del computer;
• LateUpdate(): funzione invocata una volta completate tutte le chiamate alle funzioni Update();
Per la scrittura del codice sono stati utilizzati gli IDE Visual Studio e JetBrains Rider e il linguaggio utilizzato è stato C, un linguaggio orientato ad oggetti sviluppato nei primi anni 2000 da Microsoft.
Unity3D rappresenta il software di riferimento, insieme ad Unreal Engine, per lo sviluppo di videogiochi o applicazioni virtuali indipendenti e presenta una documentazione molto approfondita oltre che una community vasta, fattori che sono stati decisivi per la scelta di questo software e in seguito nello sviluppo dell’applicativo.
essendo right-handed e allineato con la gravità sull’asse Y. Per facilitare la manipolazione della mesh l’algoritmo la suddivide in cubi di grandezza uguale (lato di 1,4 metri circa) e tiene conto di ogni cubo che contiene almeno un triangolo della mesh generata. L’aggiornamento della mesh poi avviene andando a modificare i cubi nei quali variano il numero di vertici e di facce ma, per evitare grossi costi computazionali, l’applicazione deve limitare al massimo questi aggiornamenti.
• Networking: ARDK offre funzionalità utili anche alla creazione di esperienze multiplayer, fornendo la possibilità agli sviluppatori di andare a lavorare sia con componenti di alto livello HLAPI (High Level API), che a basso livello (IMultipeer Networking features). Il multiplayer è supportato da un server stateless che fornisce la gestione delle sessioni, routing dei messaggi e il rilevamento dei peer. Il concetto di sessione è fondamentale per il networking ARDK poichè permette di rendere noto ai dispositivi con quali peer è necessario scambiarsi i messaggi. Ogni sessione è identificata da un id che permette di crearne una o di parteciparvi. Il problema che viene affrontato dal Networking è quello di garantire la coerenza tra i diversi ambienti sui diversi dispositivi e ARDK utilizza una soluzione host-oriented per ovviare a questo problema.
Il primo peer che si connette ad una sessione ne diventa automaticamente host: il suo compito sarà quello di scannerizzare l’ambiente circostante e la sua posizione iniziale, dall’inizio della scannerizzazione, verrà considerata come origine (0,0,0) del sistema di riferimento comune. I peer che si connettono successivamente alla sessione, dovranno anche loro scannerizzare lo stesso ambiente, ma le loro posizioni saranno rilocalizzate nelle nuove posizioni corrispondenti al sistema di riferimento dell’host: questo è possibile grazie ad un confronto tra le diverse mesh ottenute dalle scannerizzazioni dei dispositivi.
Nelle diverse fasi di questo processo di sincronizzazione i peer assumono diversi stati:
– Unknown: quando il client non è connesso al Niantic Beckend, ma è in procinto di farlo;
– Waiting For Localization Data: quando l’host non ha ancora completato il caricamento della mappa iniziale e del suo sistema di riferimento;
– Localizing: il client ha ricevuto la mappa dell’host e deve iniziare a scannerizzare l’ambiente;
– Stable: ARDK è sincronizzato e la mappa su tutti i dispositivi stable e connessi alla stessa sessione è coerente;
– Failed: l’host non ha mai caricato uno scan utiizzabile della mappa e si è disconnesso dalla sessione.
È possibile sincronizzarsi anche tramite markers, includendo in essi sia infor-mazioni utili per localizzare un’origine del sistema di riferimento comune, sia informazioni necessarie per connettersi alla sessione, ma questa metodologia risulta meno precisa e può provocare drift nella posizione e nell’orientamento reciproci degli oggetti virtuali. La soluzione migliore è rappresentata dalla combinazione di localizzazione tramite marker e tramite scan: così facendo, tutti i peer, mentre si occupano della scannerizzazione, assumono le informazioni utili dal marker per iniziare l’esperienza condivisa nel caso alcuni dispositivi fossero più lenti a sincro-nizzarsi con lo scan e a raggiungere lo stato stable. Per la gestione del networking, ARDK offre la possibilità di utilizzare un approccio sia ad alto livello (HLAPI), che a basso livello (IMultipeer Networking).
HLAPI
Sistema che lavora out-of-the-box, però generico abbastanza da permettere imple-mentazioni custom a qualunque livello. Introduce uno schema di indirizzamento gerarchico dove ogni oggetto è rappresentato da un NetworkGroup con uno specifi-co tag NewtorkID: ciascun NetworkGroup specifi-contiene dei NetworkedDataHandlers, identificati da stringhe e che permettono la gestione dei dati (come ad esempio la posizione di un oggetto che si muove). HLAPI inoltre mette a disposizione dello sviluppatore infrastrutture utili per velocizzare la pipeline di sviluppo come ad esempio la network transform (componente che invia automaticamente informazioni agli altri peer riguardo la posizione dell’oggetto a cui è attaccato) o i Generic Network Fields (campi che propagano automaticamente aggiornamenti riguardo il valore di una certa variabile mantenendo coerente il suo valore tra i diversi peer) e gestisce, tramite classi intermedie (come HlapiSession e NetworkGroup) i problemi classici del networking come l’addressing,il caching, e la serializzazione di dati.
IMultipeer Networking
Consigliato quando si hanno applicazioni dove non è necessaria una grande varietà di tipologie di messaggi per provvedere alla coerenza dell’ambiente condiviso, l’
IMultipeer Networking è un sistema più grezzo, meno raffinato, che permette però allo sviluppatore di lavorare a basso livello. I messaggi di scambio tra i peer risultano più snelli poiché l’intestazione non deve contenere informazioni su NetworkGroup, NetworkID e DataHandlers, ma sono identificati da un intero che indica la tipologia di messaggio(per questo è consigliato avere poche tipologie di messaggio), dalla reliability (UnreliableUnordered, UnreliableOrdered, ReliableUnordered e Relia-bleOrdered), e dal destinatario. L’IMultipeer Networking offre anche la possibilità di usare coppie chiave e valore persistenti che garantiscono la condivisione di dati e la notifica di eventuali cambiamenti a tutti i client appartenenti ad una sessione, e offre la possibilità ai peers di sincronizzare il proprio clock con il clock del server:
ciò garantisce che tutti i clients abbiano un massimo di 30 ms di discrepanza su CurrentCorrectTime.
Purtroppo, trattandosi di uno strumento nuovo, ARDK presenta alcune limitazioni segnalate da Niantic:
• Limiti legati alle sessioni: Niantic consiglia sessioni di gioco per un massimo di 5 giocatori per una durata massima di 5 minuti.
• Affidabilità Messaggi: Ci sono alcuni casi in cui, nonostante il protocollo di trasporto usato sia il TCP, i messaggi possono essere persi ed è dunque importante salvare le informazioni sullo stato in coppie chiave valore.
• Visibilità Peer: E’ possibile che un peer connesso non sia immediatamente notificato agli altri, con conseguente perdita di messaggi trasmessi in questo periodo refrattario.
• Context Awareness (Semantic Segmentation): È possibile inoltre sfruttare la segmentazione semantica di ARDK per arricchire l’esperienza e per permettere di classificare oggetti reali che vengono inquadrati dall’utente con la telecamera, come ad esempio cielo o prato. Questo può essere utile per permettere interazioni particolari con superfici specifiche.
• Tools per testing: ARDK offre la possibilità inoltre di testare le funzionalità di realtà aumentata, sia condivisa che non, direttamente nella playmode di unity offrendo strumenti come Virtual Studio (nel caso specifico del networking) o delle scene di mockup dove testare funzionalità come il meshing, plane detection o altro. Inoltre procura con un package aggiuntivo (ARDK Examples) un vasta gamma di scene esempio per aiutare i neofiti, oltre a fornire, sulla pagina principale del sito, la possibilità di consultare un forum.
Lightship ARDK ad oggi rappresenta una realtà all’avanguardia nell’ambito della realtà aumentata accessibile a tutti ma, essendo un toolkit molto recente (ricordiamo che è stato pubblicato nel Novembre 2021), presenta ancora qualche imperfezione ed è difficoltoso reperire documentazione che non sia quella presente sul sito ufficiale.