• Non ci sono risultati.

4.5

Aggiornamento della scena

L’aggiornamento dell’ArPoiScene è controllato da un parametro boolea- no chiamato sceneIsUpToDate: quando è true significa che la scena è già aggiornata, se invece è false dobbiamo aggiornarla. Tra le opzioni configura- bili abbiamo un Refresh Timer che ogni n millisecondi, con n definito dallo sviluppatore, va a settare il parametro booleano a false forzando la scena ad aggiornarsi, in modo tale che tutti i Renderable siano sempre posizionati in modo corretto in base ai movimenti dell’utente.

Il Refresh Timer ed il parametro booleano appena descritti ci permet- tono di evitare l’aggiornamento della scena ad ogni frame, operazione che comporterebbe un costo computazionale non indifferente. Consideriamo ad esempio un’applicazione con un frame rate5 pari a 30 FPS6: se aggiornas-

simo la scena ad ogni frame dovremmo ripetere tutti i passaggi ed i calcoli circa 30 volte al secondo, sprecando così risorse per aggiornare una scena che molto probabilmente non è nemmeno cambiata nell’arco del secondo trascor- so. Purtroppo però, utilizzare soltanto il timer per aggiornare la scena crea alcune problematiche importanti:

• se lo sviluppatore ha abilitato il FOV Clipping nella scena, verranno renderizzati soltanto i Renderable che si trovano nel suo cono di vista nel frame in cui la scena viene aggiornata; il problema nasce quando l’utente si muove nell’ambiente guardandosi attorno: non vedrà nes- sun altro Renderable finché il Refresh Timer non aggiornerà la scena (Figura 4.5);

• un caso simile capita se lo sviluppatore ha abilitato almeno uno tra il

Near Plane Clipping ed il Far Plane Clipping nella scena; l’utente vedrà

tutti i Renderable che si trovavano all’interno dei limiti definiti nel frame

5Con frame rate si intende la frequenza di riproduzione dei fotogrammi che compongono

un video oppure un’animazione.

6L’acronimo FPS sta per frame per second ed è l’unità di misura utilizzata per esprimere

in cui la scena è stata aggiornata, ma se si muove e la sua posizione GPS cambia nel tempo che intercorre tra due aggiornamenti della scena, non potrà vedere i nuovi POIs che entrano nei limiti aggiornati (Figura 4.6).

Figura 4.5: Problema di aggiornamento della scena quando il FOV Clipping è abilitato. Nell’esempio il Refresh Timer aggiorna la scena ogni 10 secondi, quindi se l’utente si muove tra due aggiornamenti non vedrà correttamente tutti i POIs.

Al fine di risolvere queste due problematiche che si sono presentate ab- biamo sviluppato altre due modalità di aggiornamento della scena che si abilitano o disabilitano automaticamente assieme al relativo Clipping. In particolare, nel caso in cui venga abilitato uno tra il Near Plane Clipping ed il Far Plane Clipping verrà abilitato anche l’aggiornamento della scena in base agli spostamenti della posizione GPS dell’utente, mentre nel caso in cui venga abilitato il FOV Clipping verrà abilitato l’aggiornamento della scena in base ai movimenti dell’utente registrati dai sensori del device: grazie a queste due funzionalità è quindi possibile aggiornare la scena basandosi sul movi- mento dell’utente nell’ambiente che lo circonda, in modo tale che la scena contenga sempre i Renderable corretti in base alle configurazioni specificate dallo sviluppatore.

4.5 Aggiornamento della scena 69

Figura 4.6: Problema di aggiornamento della scena quando almeno uno tra il Near Plane Clipping ed il Far Plane Clipping è abilitato. Nell’esempio il

Refresh Timer aggiorna la scena ogni 10 secondi, quindi se l’utente si muove

tra due aggiornamenti consecutivi non vedrà correttamente tutti i POIs che dovrebbe vedere.

Quindi, quando viene processato un frame, gli step che vengono eseguiti in successione per controllare se la scena è da aggiornare oppure no sono i seguenti:

1. se la scena è aggiornata, ovvero se il parametro booleano sceneIsUpTo-

Date è settato a true, ed il FOV Clipping è abilitato, controlliamo se

l’utente si sta guardando attorno utilizzando la differenza tra il Bearing attuale ed il Bearing del device al momento dell’ultimo aggiornamento della scena; in base al risultato di questo controllo modificheremo il valore di sceneIsUpToDate per indicare se la scena ha bisogno di essere aggiornata oppure no;

2. se la scena è aggiornata ed è abilitato almeno uno tra il Near Plane Clip-

ping ed il Far Plane Clipping, allora controlliamo se l’utente si è sposta-

to in modo significativo utilizzando la differenza tra la posizione GPS attuale e quella memorizzata durante l’ultimo aggiornamento della sce-

na; anche in questo caso, modificheremo il valore di sceneIsUpToDate di conseguenza;

3. a questo punto controlliamo se il valore di sceneIsUpToDate è true o

false; nel primo caso la scena è aggiornata, quindi non effettuiamo più

nessun calcolo fino al prossimo frame, mentre nel secondo caso andremo ad aggiornare la scena processando il frame corrente.

Una cosa importante da notare è che ogni n millisecondi il Refresh Timer, se abilitato dallo sviluppatore, andrà a modificare il valore di isSceneUpToDate forzando l’aggiornamento della scena.

Nel caso in cui la scena sia da aggiornare processando le informazio- ni ottenute al frame corrente, allora non resta che controllare quali sono i

POIs visibili, quali sono i Renderable associati che devono essere renderizzati

e dove devono essere posizionati nella scena. All’interno della libreria AR

POI Experiences tutte queste operazioni sono finalizzate all’istanziazione del

parametro di tipo ArPoiAnchorNode associato ad ogni POI visibile.