Mapping spaziale

Il mapping spaziale fornisce una rappresentazione dettagliata delle superfici reali nell'ambiente intorno a HoloLens, consentendo agli sviluppatori di creare un'esperienza di realtà mista convincente. Unendo il mondo reale al mondo virtuale, un'applicazione può rendere gli ologrammi reali. Le applicazioni possono anche allinearsi più naturalmente alle aspettative degli utenti fornendo comportamenti e interazioni reali familiari.


Supporto del dispositivo

Funzionalità HoloLens (prima generazione) HoloLens 2 Visori VR immersive
Mapping spaziale ✔️ ✔️

Perché il mapping spaziale è importante?

Il mapping spaziale consente di posizionare gli oggetti su superfici reali. Ciò consente di ancorare oggetti nel mondo dell'utente e di sfruttare i segnali di profondità reali. L'occlusione degli ologrammi in base ad altri ologrammi e oggetti reali aiuta a convincere l'utente che questi ologrammi sono effettivamente nello spazio. Gli ologrammi fluttuano nello spazio o si spostano con l'utente non si sentono reali. Quando possibile, posizionare gli elementi per il comfort.

Visualizzare le superfici quando si posizionano o si spostano gli ologrammi (usare una griglia proiettata). Ciò consente agli utenti di sapere dove posizionare meglio gli ologrammi e mostra se il punto in cui sta tentando di posizionare l'ologramma non è mappato. È possibile "voci di cartellone" verso l'utente se finiscono troppo in un angolo.

Panoramica dei concetti

Superfici mesh che coprono una stanza
Esempio di mesh di mapping spaziale che copre una stanza

I due tipi di oggetti primari usati per il mapping spaziale sono "Spatial Surface Observer" e "Spatial Surface".

L'applicazione fornisce a Spatial Surface Observer uno o più volumi di delimitazione per definire le aree di spazio in cui l'applicazione desidera ricevere dati di mapping spaziale. Per ognuno di questi volumi, il mapping spaziale fornirà all'applicazione un set di superfici spaziali.

Questi volumi possono essere stazionari (in una posizione fissa basata sul mondo reale) o possono essere collegati a HoloLens (si spostano, ma non ruotano, con HoloLens mentre si sposta nell'ambiente). Ogni superficie spaziale descrive le superfici reali in un piccolo volume di spazio, rappresentato come mesh di triangoli collegata a un sistema di coordinate spaziali bloccato dal mondo.

Man mano che HoloLens raccoglie nuovi dati sull'ambiente e, man mano che si verificano modifiche all'ambiente, le superfici spaziali vengono visualizzate, scompaiono e cambiano.

Demo dei concetti di progettazione della consapevolezza spaziale

Per vedere i concetti di progettazione della consapevolezza spaziale in azione, vedere la demo video Progettazione di ologrammi - Consapevolezza spaziale di seguito. Al termine, continuare per un approfondimento più dettagliato su argomenti specifici.

Questo video è stato tratto dall'app "Progettazione di ologrammi" HoloLens 2. Scarica e goditi l'esperienza completa qui.

Mapping spaziale e Scenario Understanding WorldMesh

Per HoloLens 2, è possibile eseguire una query su una versione statica dei dati di mapping spaziale usando Scene Understanding SDK (impostazione EnableWorldMesh). Ecco le differenze tra due modi per accedere ai dati di mapping spaziale:

  • API mapping spaziale:
    • Intervallo limitato: i dati di mapping spaziale disponibili per le applicazioni in una "bolla" limitata memorizzata nella cache intorno all'utente.
    • Fornisce aggiornamenti a bassa latenza delle aree mesh modificate tramite gli eventi SurfaceChanged.
    • Livello variabile di dettagli controllato dal parametro Triangoli per contatore cubico.
  • SDK di comprensione della scena:
    • Intervallo illimitato: fornisce tutti i dati di mapping spaziale analizzati all'interno del raggio della query.
    • Fornisce uno snapshot statico dei dati di mapping spaziale. Per ottenere i dati di mapping spaziale aggiornati è necessario eseguire una nuova query per l'intera mesh.
    • Livello coerente di dettagli controllati dall'impostazione RequestedMeshLevelOfDetail.

Che influenza la qualità del mapping spaziale?

Diversi fattori, descritti in dettaglio qui, possono influire sulla frequenza e la gravità di questi errori. Tuttavia, è necessario progettare l'applicazione in modo che l'utente possa raggiungere i propri obiettivi anche in presenza di errori nei dati di mapping spaziale.

Scenari di utilizzo comuni

Illustrazioni degli scenari comuni di utilizzo del mapping spaziale: posizionamento, occlusione, fisica e navigazione

Selezione host

Il mapping spaziale offre alle applicazioni l'opportunità di presentare forme naturali e familiari di interazione con l'utente; cosa potrebbe essere più naturale di mettere il telefono sulla scrivania?

Vincolando la posizione degli ologrammi (o più in genere, qualsiasi selezione di posizioni spaziali) a poggiare sulle superfici fornisce un mapping naturale da 3D (punto nello spazio) a 2D (punto sulla superficie). Ciò riduce la quantità di informazioni che l'utente deve fornire all'applicazione e rende le interazioni dell'utente più veloci, più semplici e precise. Questo è vero perché "distanza distanza" non è qualcosa che viene usato per comunicare fisicamente con altre persone o con computer. Quando puntiamo con il dito, specifichiamo una direzione ma non una distanza.

Un'importante avvertenza è che quando un'applicazione deduce la distanza dalla direzione (ad esempio eseguendo un raycast lungo la direzione dello sguardo fisso dell'utente per trovare la superficie spaziale più vicina), questo deve produrre risultati che l'utente può stimare in modo affidabile. In caso contrario, l'utente perderà il proprio senso di controllo e questo può diventare rapidamente frustrante. Un metodo che consente di eseguire più raycast invece di uno solo. I risultati aggregati devono essere più uniformi e più prevedibili, meno sensibili all'influenza da risultati temporanei "outlier" (come possono essere causati da raggi che passano attraverso piccoli fori o colpiscono piccoli bit di geometria di cui l'utente non è a conoscenza). L'aggregazione o lo smoothing può essere eseguito anche nel tempo; Ad esempio, è possibile limitare la velocità massima a cui un ologramma può variare a distanza dall'utente. Limitare semplicemente il valore minimo e massimo della distanza può essere utile, quindi l'ologramma spostato non si allontana improvvisamente dalla distanza o si blocca in faccia dell'utente.

Le applicazioni possono anche usare la forma e la direzione delle superfici per guidare il posizionamento dell'ologramma. Una sedia olografica non dovrebbe penetrare attraverso le pareti e dovrebbe sedersi a scaricarsi con il pavimento anche se è leggermente irregolare. Questo tipo di funzionalità probabilmente si basa sull'uso di collisioni di fisica anziché raycast, tuttavia si applicheranno problemi simili. Se l'ologramma posizionato ha molti piccoli poligoni che si attaccano, come le gambe su una sedia, può essere opportuno espandere la rappresentazione fisica di tali poligoni in qualcosa di più ampio e uniforme in modo che siano più in grado di scivolare su superfici spaziali senza snagging.

All'estremo, l'input dell'utente può essere semplificato completamente e le superfici spaziali possono essere usate per eseguire il posizionamento dell'ologramma completamente automatico. Ad esempio, l'applicazione potrebbe posizionare un interruttore di luce olografica da qualche parte sulla parete per consentire all'utente di premere. La stessa avvertenza sulla prevedibilità si applica in questo caso; se l'utente prevede il controllo sul posizionamento dell'ologramma, ma l'applicazione non posiziona sempre gli ologrammi in cui si aspettano (se l'interruttore viene visualizzato da qualche parte che l'utente non riesce a raggiungere), questa sarà un'esperienza frustrante. In realtà può essere peggio fare il posizionamento automatico che richiede la correzione dell'utente parte del tempo, piuttosto che richiedere semplicemente all'utente di eseguire sempre il posizionamento; perché è previsto un posizionamento automatico riuscito, la correzione manuale sembra un onere!

Si noti anche che la capacità di un'applicazione di usare superfici spaziali per il posizionamento dipende in larga parte dall'esperienza di analisi dell'applicazione. Se una superficie non è stata analizzata, non può essere usata per il posizionamento. Spetta all'applicazione chiarire questo problema all'utente, in modo che possa eseguire la scansione di nuove superfici o selezionare una nuova posizione.

Il feedback visivo per l'utente è di fondamentale importanza durante il posizionamento. L'utente deve sapere dove si basa l'ologramma sulla superficie più vicina con effetti di terra. Dovrebbero capire perché il movimento del loro ologramma è vincolato (ad esempio, a causa di collisioni con un'altra superficie vicina). Se non riescono a inserire un ologramma nella posizione corrente, il feedback visivo dovrebbe chiarire perché no. Ad esempio, se l'utente sta cercando di posizionare un divano olografico bloccato a metà strada nella parete, le porzioni del divano dietro il muro devono pulsare in un colore arrabbiato. In alternativa, se l'applicazione non riesce a trovare una superficie spaziale in una posizione in cui l'utente può visualizzare una superficie reale, l'applicazione dovrebbe chiarire questo problema. L'ovvia assenza di un effetto di base in questo settore può raggiungere questo scopo.

Occlusione

Uno degli usi principali delle superfici di mapping spaziale consiste semplicemente nell'occudere gli ologrammi. Questo comportamento semplice ha un impatto enorme sul realismo percepito degli ologrammi, contribuendo a creare un senso adattiva che in realtà abita lo stesso spazio fisico dell'utente.

L'occlusione fornisce anche informazioni all'utente; quando un ologramma sembra essere occluso da una superficie reale, questo fornisce un feedback visivo aggiuntivo sulla posizione spaziale di tale ologramma nel mondo. Viceversa, l'occlusione può anche nascondere informazioni all'utente; l'occlusione degli ologrammi dietro le pareti può ridurre il disordine visivo in modo intuitivo. Per nascondere o rivelare un ologramma, l'utente deve semplicemente spostare la testa.

L'occlusione può essere usata anche per prime aspettative per un'interfaccia utente naturale basata su interazioni fisiche familiari; se un ologramma è occluso da una superficie, è perché tale superficie è solida, quindi l'utente dovrebbe aspettarsi che l'ologramma si scontrerà con quella superficie e non passerà attraverso di esso.

A volte, l'occlusione degli ologrammi è indesiderata. Se un utente deve interagire con un ologramma, è necessario vederlo, anche se si trova dietro una superficie reale. In questi casi, in genere ha senso eseguire il rendering di un tale ologramma in modo diverso quando è occluso (ad esempio, riducendone la luminosità). In questo modo, l'utente può individuare visivamente l'ologramma, ma lo saprà ancora dietro qualcosa.

Fisica

L'uso della simulazione fisica è un altro modo in cui è possibile usare il mapping spaziale per rafforzare la presenza di ologrammi nello spazio fisico dell'utente. Quando la mia palla di gomma olografica rotola realisticamente dalla mia scrivania, rimbalza sul pavimento e scompare sotto il divano, potrebbe essere difficile per me credere che non ci sia.

La simulazione fisica offre anche l'opportunità per un'applicazione di usare interazioni naturali e familiari basate sulla fisica. Spostare un pezzo di mobili olografici intorno al pavimento sarà probabilmente più facile per l'utente se l'arredamento risponde come se fosse scivolato attraverso il pavimento con l'inerzia e l'attrito appropriati.

Per generare comportamenti fisici realistici, è probabile che sia necessario eseguire alcune operazioni di elaborazione mesh , ad esempio fori di riempimento, rimozione di allucinazioni mobili e superfici ruvide.

È anche necessario considerare come l'esperienza di analisi dell'applicazione influisce sulla simulazione fisica. Prima di tutto, le superfici mancanti non si collideranno con nulla; cosa accade quando la palla di gomma si rotola verso il corridoio e fuori dalla fine del mondo noto? In secondo luogo, è necessario decidere se continuare a rispondere alle modifiche nell'ambiente nel tempo. In alcuni casi, si vuole rispondere il più rapidamente possibile; dire se l'utente usa porte e mobili come barricate rimovibili in difesa contro una tempesta di frecce romane in ingresso. In altri casi, tuttavia, è possibile ignorare nuovi aggiornamenti; guidare la tua auto sportiva olografica intorno al circuito sul tuo pavimento potrebbe improvvisamente non essere così divertente se il tuo cane decide di sedersi al centro della pista.

Le applicazioni possono usare i dati di mapping spaziale per concedere caratteri olografici (o agenti) la possibilità di spostarsi nel mondo reale nello stesso modo in cui una persona reale avrebbe. Ciò può aiutare a rafforzare la presenza di caratteri olografici limitandoli allo stesso set di comportamenti naturali, familiari come quelli dell'utente e dei loro amici.

Le funzionalità di spostamento possono essere utili anche agli utenti. Dopo aver creato una mappa di spostamento in una determinata area, potrebbe essere condiviso per fornire indicazioni olografiche per i nuovi utenti non familiari con tale posizione. Questa mappa potrebbe essere progettata per aiutare a mantenere senza problemi il flusso del traffico pedonale o per evitare incidenti in posizioni pericolose come i siti di costruzione.

Le principali sfide tecniche coinvolte nell'implementazione della funzionalità di navigazione saranno il rilevamento affidabile delle superfici camminabili (gli esseri umani non camminano sulle tabelle!) e l'adattamento elegante alle modifiche nell'ambiente (gli esseri umani non camminano attraverso porte chiuse!). La mesh può richiedere un'elaborazione prima che sia utilizzabile per la pianificazione del percorso e lo spostamento in base a un carattere virtuale. Lisciare la rete e rimuovere le allucinazioni può aiutare a evitare che i caratteri diventino bloccati. È anche possibile semplificare drasticamente la mesh per velocizzare i calcoli di pianificazione e navigazione del carattere. Queste sfide hanno ricevuto una grande attenzione nello sviluppo della tecnologia del gioco video, e c'è una ricchezza di letteratura di ricerca disponibile su questi argomenti.

La funzionalità NavMesh predefinita in Unity non può essere usata per impostazione predefinita per le superfici di mapping spaziale perché le superfici non sono note fino all'avvio dell'applicazione. Tuttavia, è possibile creare un oggetto NavMesh durante il runtime installando NavMeshComponents. Si noti che il sistema di mapping spaziale non fornisce informazioni sulle superfici lontane dalla posizione corrente dell'utente; per creare una mappa di un'area di grandi dimensioni, l'applicazione deve "ricordare" le superfici. È anche possibile aumentare l'impostazione delle estensioni di osservazione nel profilo di consapevolezza spaziale, che aumenta l'area in cui è possibile creare NavMesh.

Visualizzazione

La maggior parte del tempo è appropriato per le superfici spaziali da invisibile; per ridurre al minimo il disordine visivo e lasciare che il mondo reale parli per se stesso. Tuttavia, a volte è utile visualizzare direttamente le superfici di mapping spaziale, nonostante le loro controparti reali siano visibili.

Ad esempio, quando l'utente sta tentando di posizionare un ologramma su una superficie (posizionando un armadio olografico sulla parete, ad esempio, può essere utile per "terra" l'ologramma eseguendo il cast di un'ombra sulla superficie. Ciò dà all'utente un senso molto più chiaro della prossimità fisica esatta tra l'ologramma e la superficie. Questo è anche un esempio della pratica più generale dell'anteprima visiva di una modifica prima del commit dell'utente.

Visualizzando le superfici, l'applicazione può condividere con l'utente la sua comprensione dell'ambiente. Ad esempio, un gioco da tavolo olografico potrebbe visualizzare le superfici orizzontali identificate come "tabelle", quindi l'utente sa dove devono passare per interagire.

La visualizzazione delle superfici può essere un modo utile per visualizzare gli spazi vicini dell'utente nascosti dalla visualizzazione. Questo potrebbe fornire un modo per concedere all'utente l'accesso alla loro cucina (e tutti i suoi ologrammi contenuti) dal loro soggiorno.

Le mesh di superficie fornite dal mapping spaziale potrebbero non essere particolarmente "pulite". È importante visualizzarli in modo appropriato. I calcoli di illuminazione tradizionali possono evidenziare gli errori nelle normali della superficie in modo visivo, mentre le trame "pulite" proiettate sulla superficie possono aiutare a dare un aspetto più ordinato. È anche possibile eseguire l'elaborazione mesh per migliorare le proprietà mesh, prima del rendering delle superfici.

Nota

HoloLens 2 implementa un nuovo runtime di Scene Understanding, che fornisce agli sviluppatori Realtà mista una rappresentazione di ambiente strutturata e di alto livello progettata per semplificare l'implementazione di posizionamento, occlusione, fisica e navigazione.

Uso dell'osservatore della superficie

Il punto di partenza per il mapping spaziale è l'osservatore della superficie. Il flusso di programma è il seguente:

  • Creare un oggetto osservatore di superficie
    • Fornire uno o più volumi spaziali per definire le aree di interesse in cui l'applicazione vuole ricevere dati di mapping spaziale. Un volume spaziale è semplicemente una forma che definisce un'area di spazio, ad esempio una sfera o una scatola.
    • Usare un volume spaziale con un sistema di coordinate spaziali bloccato al mondo per identificare un'area fissa del mondo fisico.
    • Usare un volume spaziale, aggiornato ogni frame con un sistema di coordinate spaziali bloccate dal corpo, per identificare un'area di spazio che si sposta (ma non ruota) con l'utente.
    • Questi volumi spaziali possono essere modificati in un secondo momento, come stato dell'applicazione o dell'utente cambia.
  • Usare il polling o la notifica per recuperare informazioni sulle superfici spaziali
    • È possibile "pollare" l'osservatore della superficie spaziale in qualsiasi momento. È invece possibile registrare per l'evento "superfici modificate" dell'osservatore della superficie, che notifica all'applicazione quando le superfici spaziali sono state modificate.
    • Per un volume spaziale dinamico, ad esempio il frustum di visualizzazione o un volume bloccato dal corpo, le applicazioni dovranno eseguire il polling di ogni fotogramma impostando l'area di interesse e quindi ottenendo il set corrente di superfici spaziali.
    • Per un volume statico, ad esempio un cubo bloccato a livello mondiale che copre una singola stanza, le applicazioni possono registrarsi per l'evento "superfici modificate" da notificare quando le superfici spaziali all'interno di tale volume potrebbero essere state modificate.
  • Modifiche alle superfici di processo
    • Iterazione del set fornito di superfici spaziali.
    • Classificare le superfici spaziali come aggiunte, modificate o rimosse.
    • Per ogni superficie spaziale aggiunta o modificata, se appropriato inviare una richiesta asincrona per ricevere una mesh aggiornata che rappresenta lo stato corrente della superficie a livello di dettaglio desiderato.
  • Elaborare la richiesta mesh asincrona (altri dettagli nelle sezioni seguenti).

Memorizzazione nella cache mesh

Le superfici spaziali sono rappresentate da mesh di triangoli densi. L'archiviazione, il rendering e l'elaborazione di queste mesh possono usare risorse di calcolo e archiviazione significative. Di conseguenza, ogni applicazione deve adottare uno schema di memorizzazione nella cache mesh appropriato alle proprie esigenze, per ridurre al minimo le risorse usate per l'elaborazione e l'archiviazione mesh. Questo schema deve determinare quali mesh mantenere e quali eliminare e quando aggiornare la mesh per ogni superficie spaziale.

Molte delle considerazioni illustrate vi indicherà direttamente come l'applicazione dovrebbe approcciarsi alla memorizzazione nella cache mesh. È consigliabile considerare come l'utente si sposta attraverso l'ambiente, quali superfici sono necessarie, quando verranno osservate superfici diverse e quando le modifiche nell'ambiente devono essere acquisite.

Quando si interpreta l'evento "superfici modificate" fornito dall'osservatore della superficie, la logica di memorizzazione nella cache mesh di base è la seguente:

  • Se l'applicazione vede un ID superficie spaziale che non è stato visto prima, dovrebbe trattarlo come una nuova superficie spaziale.
  • Se l'applicazione vede una superficie spaziale con un ID noto, ma con un nuovo tempo di aggiornamento, deve trattarlo come una superficie spaziale aggiornata.
  • Se l'applicazione non vede più una superficie spaziale con un ID noto, deve trattarla come una superficie spaziale rimossa.

È possibile eseguire le scelte seguenti per ogni applicazione:

  • Per le nuove superfici spaziali, è necessario richiedere mesh?
    • In genere la mesh deve essere richiesta immediatamente per le nuove superfici spaziali, che possono fornire nuove informazioni utili per l'utente.
    • Tuttavia, le nuove superfici spaziali vicino e davanti all'utente devono essere date priorità e la loro mesh deve essere richiesta prima.
    • Se la nuova mesh non è necessaria, se ad esempio l'applicazione ha definitivamente o temporaneamente "bloccato" il modello dell'ambiente, non deve essere richiesto.
  • Per le superfici spaziali aggiornate, è necessario richiedere mesh?
    • Le superfici spaziali aggiornate vicino e davanti all'utente devono essere date priorità e la loro mesh deve essere richiesta prima.
    • Può anche essere opportuno dare priorità maggiore alle nuove superfici rispetto alle superfici aggiornate, soprattutto durante l'esperienza di analisi.
    • Per limitare i costi di elaborazione, le applicazioni possono voler limitare la frequenza in cui elaborano gli aggiornamenti alle superfici spaziali.
    • Può essere possibile dedurre che le modifiche apportate a una superficie spaziale sono minori, ad esempio se i limiti della superficie sono piccoli, nel qual caso l'aggiornamento potrebbe non essere abbastanza importante da elaborare.
    • Aggiornamenti alle superfici spaziali all'esterno dell'area corrente di interesse dell'utente possono essere ignorate completamente, anche se in questo caso potrebbe essere più efficiente modificare i volumi di delimitamento spaziale in uso dall'osservatore della superficie.
  • Per le superfici spaziali rimosse, la mesh deve essere eliminata?
    • In genere la mesh deve essere rimossa immediatamente per le superfici spaziali rimosse, in modo che l'occlusione ologramma rimanga corretta.
    • Tuttavia, se l'applicazione ha motivo di credere che una superficie spaziale verrà riproposta brevemente (in base alla progettazione dell'esperienza utente), potrebbe essere più efficiente mantenerla che ignorarne la mesh e ricrearla nuovamente in un secondo momento.
    • Se l'applicazione sta creando un modello su larga scala dell'ambiente dell'utente, potrebbe non voler eliminare tutte le mesh. È comunque necessario limitare l'utilizzo delle risorse, possibilmente eseguendo ilpooling di mesh su disco come superfici spaziali scompaiono.
    • Alcuni eventi relativamente rari durante la generazione della superficie spaziale possono causare la sostituzione delle superfici spaziali da nuove superfici spaziali in una posizione simile, ma con ID diversi. Quindi, le applicazioni che scelgono di non eliminare una superficie rimossa devono prestare attenzione a non terminare con più mesh spaziali altamente sovrapposte che coprono la stessa posizione.
  • La mesh deve essere eliminata per qualsiasi altra superficie spaziale?
    • Anche se esiste una superficie spaziale, se non è più utile per l'esperienza dell'utente, dovrebbe essere rimossa. Ad esempio, se l'applicazione "sostituisce" la stanza dall'altra parte di una porta con uno spazio virtuale alternativo, le superfici spaziali in tale stanza non sono più importanti.

Di seguito è riportato un esempio di strategia di memorizzazione nella cache mesh usando l'hysteresis spaziale e temporale:

  • Si consideri un'applicazione che vuole usare un volume spaziale a forma di frustum che segue lo sguardo dell'utente mentre guardano intorno e camminano intorno.
  • Una superficie spaziale può sparire temporaneamente da questo volume semplicemente perché l'utente si allontana dalla superficie o dai passaggi più lontano da esso... solo per guardare indietro o spostarsi più vicino un attimo più tardi. In questo caso, l'eliminazione e la ricreazione della mesh per questa superficie rappresentano molte elaborazioni ridondanti.
  • Per ridurre il numero di modifiche elaborate, l'applicazione usa due osservatori di superficie spaziale, uno contenuto nell'altro. Il volume più grande è sferico e segue l'utente 'lazily'; si sposta solo quando necessario per assicurarsi che il suo centro sia compreso tra 2,0 metri dell'utente.
  • Le mesh spaziali nuove e aggiornate vengono sempre elaborate dall'osservatore della superficie interna più piccola, ma le mesh vengono memorizzate nella cache fino a quando non scompaiono dall'osservatore esterno più grande. Ciò consente all'applicazione di evitare di elaborare molte modifiche ridondanti a causa dello spostamento dell'utente locale.
  • Poiché una superficie spaziale può anche scomparire temporaneamente a causa della perdita di rilevamento, l'applicazione deferisce anche rimuovendo le superfici spaziali rimosse durante la perdita di rilevamento.
  • In generale, un'applicazione deve valutare il compromesso tra l'elaborazione degli aggiornamenti ridotta e l'aumento dell'utilizzo della memoria per determinare la strategia di memorizzazione nella cache ideale.

Rendering

Esistono tre modi principali in cui le mesh di mapping spaziale tendono a essere usate per il rendering:

  • Per la visualizzazione della superficie
    • Spesso è utile visualizzare direttamente le superfici spaziali. Ad esempio, il cast di "ombreggiature" da oggetti su superfici spaziali può fornire commenti visivi utili all'utente mentre inseriscono ologrammi sulle superfici.
    • Una cosa da tenere presente è che le mesh spaziali sono diverse al tipo di mesh che un artista 3D potrebbe creare. La topologia del triangolo non sarà "pulita" come topologia creata dall'uomo e la mesh subirà vari errori.
    • Per creare un'estetica visiva piacevole, è possibile eseguire alcune operazioni di elaborazione mesh, ad esempio per riempire fori o normali di superficie liscia. È anche possibile usare uno shader per proiettare trame progettate dall'artista nella mesh anziché visualizzare direttamente la topologia mesh e le normali.
  • Per l'occlusione degli ologrammi dietro le superfici reali
    • Le superfici spaziali possono essere sottoposte a rendering in un passaggio di sola profondità, che influisce solo sul buffer di profondità e non influisce sulle destinazioni di rendering del colore.
    • In questo modo il buffer di profondità viene eseguito successivamente l'occlude degli ologrammi dietro le superfici spaziali. L'occlusione accurata degli ologrammi migliora il senso che gli ologrammi esistono realmente nello spazio fisico dell'utente.
    • Per abilitare il rendering di sola profondità, aggiornare lo stato di blend per impostare RenderTargetWriteMask su zero per tutte le destinazioni di rendering del colore.
  • Per modificare l'aspetto degli ologrammi occlusi dalle superfici reali
    • In genere la geometria di cui viene eseguito il rendering è nascosta quando è occlusa. Questa operazione viene ottenuta impostando la funzione di profondità nello stato di profondità su "minore o uguale", che determina che la geometria sia visibile solo dove è più vicina alla fotocamera rispetto a tutte le geometrie di cui è stato eseguito il rendering in precedenza.
    • Tuttavia, può essere utile mantenere una determinata geometria visibile anche quando è occluso e modificare l'aspetto quando è occluso come modo per fornire commenti visivi all'utente. Ad esempio, ciò consente all'applicazione di mostrare all'utente la posizione di un oggetto, rendendo chiaro che è dietro una superficie reale.
    • Per ottenere questo risultato, eseguire il rendering della geometria una seconda volta con un shader diverso che crea l'aspetto "occluso" desiderato. Prima di eseguire il rendering della geometria per la seconda volta, apportare due modifiche allo stato di profondità-stencil. Impostare prima di tutto la funzione di profondità su "maggiore o uguale" in modo che la geometria sia visibile solo dove è più lontano dalla fotocamera rispetto a tutte le geometrie di cui è stato eseguito il rendering precedente. In secondo luogo, impostare DepthWriteMask su zero, in modo che il buffer di profondità non venga modificato(il buffer di profondità deve continuare a rappresentare la profondità della geometria più vicina alla fotocamera).

Le prestazioni sono un problema importante quando si esegue il rendering delle mesh di mapping spaziale. Di seguito sono riportate alcune tecniche di rendering specifiche per il rendering delle mesh di mapping spaziale:

  • Regolare la densità del triangolo
    • Quando si richiedono mesh di superficie spaziale dall'osservatore di superficie, richiedere la densità più bassa delle mesh di triangoli che saranno sufficienti per le proprie esigenze.
    • Può essere opportuno variare la densità del triangolo in base alla superficie, a seconda della distanza della superficie dall'utente e della relativa rilevanza per l'esperienza utente.
    • La riduzione dei conteggi dei triangoli riduce i costi di elaborazione della memoria e del vertice sulla GPU, anche se non influisce sui costi di elaborazione dei pixel.
  • Usare la culling di frustum
    • Frustum culling ignora gli oggetti di disegno che non possono essere visualizzati perché non sono all'esterno del frustum visualizzato corrente. Ciò riduce sia i costi di elaborazione DELLA CPU che della GPU.
    • Poiché la riduzione viene eseguita su una base per mesh e le superfici spaziali possono essere grandi, l'interruzione di ogni mesh di superficie spaziale in blocchi più piccoli può comportare un'analisi più efficiente (in quel minor numero di triangoli fuori schermo vengono sottoposti a rendering). C'è un compromesso, tuttavia; più mesh sono disponibili, più chiamate di disegno è necessario effettuare, che può aumentare i costi della CPU. In un caso estremo, i calcoli di riduzione dei frustum potrebbero anche avere un costo misurabile della CPU.
  • Modificare l'ordine di rendering
    • Le superfici spaziali tendono ad essere grandi, perché rappresentano l'intero ambiente dell'utente che li circonda. I costi di elaborazione dei pixel sulla GPU possono essere elevati, soprattutto nei casi in cui sono presenti più livelli di geometria visibile (incluse le superfici spaziali e altri ologrammi). In questo caso, il livello più vicino all'utente sarà l'occlusione di tutti i livelli più lontani, quindi qualsiasi tempo trascorso dalla GPU per il rendering di tali livelli più distanti viene sprecato.
    • Per ridurre questo lavoro ridondante sulla GPU, consente di eseguire il rendering di superfici opache nell'ordine front-to-back (quelle più vicine, più lontane per ultimo). Per "opaca" si intende la superficie per cui depthWriteMask è impostato su uno nello stato di profondità.stencil. Quando viene eseguito il rendering delle superfici più vicine, il buffer di profondità verrà in primo piano in modo che le superfici più distanti vengano ignorate in modo efficiente dal processore pixel sulla GPU.

Elaborazione mesh

Un'applicazione può voler eseguire varie operazioni sulle mesh di superficie spaziale per soddisfare le proprie esigenze. I dati di indice e vertice forniti con ogni mesh di superficie spaziale usano lo stesso layout familiare dei vertici e dei buffer di indice usati per il rendering di mesh triangolari in tutte le API di rendering moderne. Tuttavia, un fatto chiave da tenere presente è che i triangoli di mapping spaziale hanno un ordine di avvolgimento front-orario. Ogni triangolo è rappresentato da tre indici di vertice nel buffer di indice della mesh e questi indici identificano i vertici del triangolo in un ordine orario , quando il triangolo viene visualizzato dal lato anteriore . Il lato anteriore (o esterno) delle mesh di superficie spaziale corrisponde al lato anteriore (visibile) delle superfici reali.

Le applicazioni devono eseguire una semplificazione mesh solo se la densità del triangolo più grossolana fornita dall'osservatore di superficie è ancora insufficiente: questo lavoro è costoso e già eseguito dal runtime per generare i vari livelli di dettaglio forniti.

Poiché ogni osservatore di superficie può fornire più superfici spaziali non connesse, alcune applicazioni potrebbero voler ritagliare queste mesh di superficie spaziale tra loro, quindi comprimerle insieme. In generale, il passaggio di ritaglio è necessario, poiché le mesh della superficie spaziale vicina spesso si sovrappongono leggermente.

Raycasting e Collisione

Per consentire a un'API fisica (ad esempio Havok) di fornire un'applicazione con raycasting e funzionalità di collisione per le superfici spaziali, l'applicazione deve fornire mesh di superficie spaziale all'API fisica. Le mesh usate per la fisica hanno spesso le proprietà seguenti:

  • Contengono solo piccoli numeri di triangoli. Le operazioni fisiche sono più complesse di calcolo rispetto alle operazioni di rendering.
  • Sono "stretto d'acqua". Le superfici destinate a essere solide non devono avere fori piccoli in essi; anche i fori troppo piccoli da visualizzare possono causare problemi.
  • Vengono convertiti in scafi convesso. Gli scafi convesse hanno pochi poligoni e sono liberi di fori e sono molto più efficienti per elaborare le mesh di triangoli non elaborati.

Quando si eseguono raycast su superfici spaziali, tenere presente che queste superfici sono spesso complesse, forme inclutterate piene di piccoli dettagli disordinati - proprio come la vostra scrivania! Ciò significa che un singolo raycast è spesso insufficiente per fornire informazioni sufficienti sulla forma della superficie e sulla forma dello spazio vuoto vicino. In genere è consigliabile eseguire molti raycast all'interno di un'area piccola e usare i risultati aggregati per derivare una comprensione più affidabile della superficie. Ad esempio, usando la media di 10 raycast per guidare la posizione dell'ologramma su una superficie, restituirà un risultato più uniforme e meno "jittery" che usa solo un singolo raycast.

Tuttavia, tenere presente che ogni raycast può avere un costo di calcolo elevato. A seconda dello scenario di utilizzo, è necessario disattivare il costo di calcolo dei raycast aggiuntivi (eseguiti ogni fotogramma) rispetto al costo di calcolo dell'elaborazione mesh per regolare e rimuovere i fori nelle superfici spaziali (eseguite quando le mesh spaziali vengono aggiornate).

Esperienza di analisi dell'ambiente

Ogni applicazione che usa il mapping spaziale deve considerare la possibilità di fornire un'esperienza di analisi; il processo tramite il quale l'applicazione guida l'utente a analizzare le superfici necessarie per il corretto funzionamento dell'applicazione.

Esempio di analisi
Esempio di analisi

La natura di questa esperienza di analisi può variare notevolmente a seconda delle esigenze di ogni applicazione, ma due principi principali devono guidare la sua progettazione.

In primo luogo, la comunicazione chiara con l'utente è la preoccupazione principale. L'utente deve sempre essere consapevole del fatto che i requisiti dell'applicazione siano soddisfatti. Quando non vengono soddisfatte, dovrebbe essere immediatamente chiaro all'utente perché questo è così e dovrebbe essere portato rapidamente a intraprendere l'azione appropriata.

In secondo luogo, le applicazioni devono tentare di raggiungere un equilibrio tra efficienza e affidabilità. Quando è possibile farlo in modo affidabile, le applicazioni devono analizzare automaticamente i dati di mapping spaziale per salvare il tempo dell'utente. Quando non è possibile farlo in modo affidabile, le applicazioni devono invece consentire all'utente di fornire rapidamente all'applicazione le informazioni aggiuntive necessarie.

Per progettare l'esperienza di analisi corretta, considerare quali delle possibilità seguenti sono applicabili all'applicazione:

  • Nessuna esperienza di analisi

    • Un'applicazione può funzionare perfettamente senza alcuna esperienza di analisi guidata; apprenderà le superfici osservate nel corso del movimento dell'utente naturale.
    • Ad esempio, un'applicazione che consente all'utente di disegnare sulle superfici con vernice olografica richiede la conoscenza solo delle superfici attualmente visibili all'utente.
    • L'ambiente può essere analizzato già se è uno in cui l'utente ha già trascorso un sacco di tempo usando HoloLens.
    • Tenere presente tuttavia che la fotocamera usata dal mapping spaziale può visualizzare solo 3,1 m davanti all'utente, quindi il mapping spaziale non conoscerà più superfici distanti a meno che l'utente non li abbia osservati da una distanza più vicina in passato.
    • Quindi l'utente capisce quali superfici sono state analizzate, l'applicazione deve fornire feedback visivo a questo effetto, ad esempio il cast di ombreggiature virtuali sulle superfici analizzate può aiutare l'utente a posizionare gli ologrammi su tali superfici.
    • Per questo caso, i volumi di delimitazione della superficie spaziale dell'osservatore devono essere aggiornati ogni fotogramma in un sistema di coordinate spaziali bloccate dal corpo, in modo che seguono l'utente.
  • Trovare una posizione adatta

    • Un'applicazione può essere progettata per l'uso in una posizione con requisiti specifici.
    • Ad esempio, l'applicazione può richiedere un'area vuota intorno all'utente in modo da poter praticare in modo sicuro kung-fu olografica.
    • Le applicazioni devono comunicare qualsiasi requisito specifico all'utente in anticipo e rafforzarle con commenti visivi chiari.
    • In questo esempio, l'applicazione deve visualizzare l'estensione dell'area vuota richiesta e evidenziare visivamente la presenza di eventuali oggetti non desiderati all'interno di questa zona.
    • Per questo caso, i volumi di delimitazione della superficie spaziale dell'osservatore devono usare un sistema di coordinate spaziali bloccate al mondo nella posizione scelta.
  • Trovare una configurazione appropriata delle superfici

    • Un'applicazione può richiedere una configurazione specifica delle superfici, ad esempio due pareti grandi, flat e opposte per creare una sala olografica di specchi.
    • In questi casi, l'applicazione dovrà analizzare le superfici fornite dal mapping spaziale per rilevare le superfici appropriate e indirizzare l'utente verso di essi.
    • L'utente deve avere un'opzione di fallback se l'analisi della superficie dell'applicazione non è affidabile. Ad esempio, se l'applicazione identifica erroneamente una porta come parete piatta, l'utente deve un modo semplice per correggere questo errore.
  • Analizzare parte dell'ambiente

    • Un'applicazione può voler acquisire solo parte dell'ambiente, come indicato dall'utente.
    • Ad esempio, l'applicazione analizza parte di una stanza in modo che l'utente possa pubblicare un annuncio olografico classificato per mobili che desiderano vendere.
    • In questo caso, l'applicazione deve acquisire i dati di mapping spaziale all'interno delle aree osservate dall'utente durante l'analisi.
  • Analizzare l'intera stanza

    • Un'applicazione può richiedere un'analisi di tutte le superfici nella stanza corrente, incluse quelle dietro l'utente.
    • Ad esempio, un gioco può mettere l'utente nel ruolo di Gulliver, sotto assedio da centinaia di piccoli Lilliputi che si avvicinano da tutte le direzioni.
    • In questi casi, l'applicazione dovrà determinare quante superfici nella stanza corrente sono già state analizzate e indirizzare lo sguardo dell'utente a colmare lacune significative.
    • La chiave di questo processo è fornire feedback visivo che rende chiaro all'utente quali superfici non sono ancora state analizzate. L'applicazione potrebbe, ad esempio, usare la nebbia basata sulla distanza per evidenziare visivamente le aree non coperte dalle superfici di mapping spaziale.
  • Creare uno snapshot iniziale dell'ambiente

    • Un'applicazione può voler ignorare tutte le modifiche nell'ambiente dopo aver creato uno "snapshot" iniziale.
    • Ciò può essere appropriato per evitare interruzioni dei dati creati dall'utente strettamente associati allo stato iniziale dell'ambiente.
    • In questo caso, l'applicazione deve creare una copia dei dati di mapping spaziale nello stato iniziale al termine dell'analisi.
    • Le applicazioni devono continuare a ricevere aggiornamenti ai dati di mapping spaziale se gli ologrammi devono essere ancora isolati correttamente dall'ambiente.
    • Gli aggiornamenti continui ai dati di mapping spaziale consentono anche di visualizzare eventuali modifiche apportate, chiarendo all'utente le differenze tra gli stati precedenti e presenti dell'ambiente.
  • Acquisire snapshot avviati dall'utente dell'ambiente

    • Un'applicazione può voler rispondere alle modifiche ambientali solo quando richiesto dall'utente.
    • Ad esempio, l'utente potrebbe creare più statue 3D di un amico catturando le loro pose in momenti diversi.
  • Consentire all'utente di modificare l'ambiente

    • Un'applicazione può essere progettata per rispondere in tempo reale alle modifiche apportate nell'ambiente dell'utente.
    • Ad esempio, l'utente che disegna una tenda potrebbe attivare la "modifica della scena" per un gioco olografico che si svolge sull'altro lato.
  • Guidare l'utente per evitare errori nei dati di mapping spaziale

    • Un'applicazione può voler fornire indicazioni all'utente durante l'analisi dell'ambiente.
    • Ciò può aiutare l'utente a evitare determinati tipi di errori nei dati di mapping spaziale, ad esempio evitando finestre o specchi illuminati dal sole.

Un dettaglio aggiuntivo da tenere presente è che l'intervallo di dati di mapping spaziale non è illimitato. Anche se il mapping spaziale crea un database permanente di spazi di grandi dimensioni, rende disponibili solo i dati alle applicazioni in una "bolla" di dimensioni limitate intorno all'utente. Se si inizia all'inizio di un lungo corridoio e si cammina abbastanza lontano dall'inizio, alla fine le superfici spaziali indietro all'inizio scompariranno. È possibile attenuare questo problema memorizzando nella cache tali superfici nell'applicazione dopo che sono scomparsi dai dati di mapping spaziale disponibili.

Elaborazione mesh

Può essere utile rilevare i tipi comuni di errori nelle superfici e filtrare, rimuovere o modificare i dati di mapping spaziale in base alle esigenze.

Tenere presente che i dati di mapping spaziale devono essere il più fedele possibile alle superfici reali, in modo che qualsiasi elaborazione si applichi rischi di spostare ulteriormente le superfici dalla "verità".

Ecco alcuni esempi di diversi tipi di elaborazione mesh che possono risultare utili:

  • Riempimento foro

    • Se un piccolo oggetto fatto di un materiale scuro non riesce a scansione, lascerà un buco nella superficie circostante.
    • I fori influiscono sull'occlusione: gli ologrammi possono essere visti "attraverso" un buco in una superficie presumibilmente opaca reale.
    • I fori influiscono sui raycast: se si usano raycast per aiutare gli utenti a interagire con le superfici, potrebbe essere indesiderato che questi raggi passino attraverso fori. Una mitigazione consiste nell'usare un bundle di più raycast che coprono un'area di dimensioni appropriate. In questo modo sarà possibile filtrare i risultati "outlier", in modo che anche se un raycast passa attraverso un piccolo foro, il risultato di aggregazione sarà ancora valido. Tuttavia, questo approccio è a un costo di calcolo.
    • I fori influiscono sulle collisioni di fisica: un oggetto controllato dalla simulazione fisica può cadere attraverso un buco nel pavimento e perdersi.
    • È possibile riempire in modo algoritmico tali fori nella mesh di superficie. Tuttavia, è necessario ottimizzare l'algoritmo in modo che i "fori reali", ad esempio finestre e porte, non vengano riempiti. Può essere difficile distinguere in modo affidabile "fori reali" da "fori immaginari", quindi è necessario sperimentare con diverse euristiche, ad esempio "dimensioni" e "forma limite".
  • Rimozione allucinazione

    • Riflessi, luci luminose e oggetti mobili possono lasciare piccole "allucinazioni" persistenti fluttuando a metà aria.
    • Le allucinazioni influiscono sull'occlusione: le allucinazioni possono diventare visibili come forme scure che si muovono davanti ad altri ologrammi e occludando altri ologrammi.
    • Le allucinazioni influiscono sui raycast: se si usano raycast per aiutare gli utenti a interagire con le superfici, questi raggi potrebbero colpire un'allucinazione invece della superficie dietro di esso. Come per i fori, una mitigazione consiste nell'usare molti raycast invece di un singolo raycast, ma anche questo avverrà a un costo di calcolo.
    • Le allucinazioni influiscono sulle collisioni di fisica: un oggetto controllato dalla simulazione fisica può rimanere bloccato contro un'allucinazione e non essere in grado di muoversi attraverso un'area apparentemente chiara dello spazio.
    • È possibile filtrare tali allucinazioni dalla rete superficiale. Tuttavia, come con i fori, è necessario ottimizzare l'algoritmo in modo che oggetti di piccole dimensioni reali come lampo e maniglie di porta non vengano rimossi.
  • Definizione di movimenti uniformi

    • Il mapping spaziale può restituire superfici che sembrano essere ruvide o "rumorose" rispetto alle controparti reali.
    • Uniformità influisce sulle collisioni di fisica: se il pavimento è ruvido, una palla da golf fisicamente simulata potrebbe non rotolare uniformemente su di esso in una linea retta.
    • La fluidità influisce sul rendering: se una superficie viene visualizzata direttamente, le normali della superficie ruvida possono influire sull'aspetto e interrompere un aspetto "pulito". È possibile attenuare questo problema usando l'illuminazione e le trame appropriate nello shader usato per eseguire il rendering della superficie.
    • È possibile smussare la rugosità in una mesh di superficie. Tuttavia, questo può spingere la superficie più lontano dalla superficie reale corrispondente. Mantenere una corrispondenza stretta è importante per produrre occlusione accurata dell'ologramma e consentire agli utenti di ottenere interazioni precise e prevedibili con superfici olografiche.
    • Se è necessaria solo una modifica estetica, può essere sufficiente per uniformare le normali dei vertici senza modificare le posizioni dei vertici.
  • Ricerca dell'aereo

    • Esistono molte forme di analisi che un'applicazione può voler eseguire sulle superfici fornite dal mapping spaziale.
    • Un semplice esempio è "ricerca aereo"; identificazione di aree delimitate, per lo più planari di superfici.
    • Le aree planari possono essere usate come superfici di lavoro olografiche, aree in cui il contenuto olografico può essere inserito automaticamente dall'applicazione.
    • Le aree planari possono vincolare l'interfaccia utente, per consentire agli utenti di interagire con le superfici più adatte alle proprie esigenze.
    • Le aree planari possono essere usate come nel mondo reale, per le controparti olografiche di oggetti funzionali, ad esempio schermi LCD, tabelle o lavagne.
    • Le aree planari possono definire aree di gioco, formando la base dei livelli di videogiochi.
    • Le aree planari possono aiutare gli agenti virtuali a navigare nel mondo reale, identificando le aree di pavimento su cui è probabile che le persone reali possano camminare.

Creazione di prototipi e debug

Strumenti utili

  • L'emulatore HoloLens può essere usato per sviluppare applicazioni usando il mapping spaziale senza accedere a un dispositivo HoloLens fisico. Consente di simulare una sessione dinamica in un ambiente HoloLens in un ambiente realistico, con tutti i dati usati normalmente dall'applicazione, inclusi il movimento di HoloLens, i sistemi di coordinate spaziali e le mesh di mapping spaziale. Può essere usato per fornire input affidabile e ripetibile, che può essere utile per il debug dei problemi e la valutazione delle modifiche apportate al codice.
  • Per riprodurre uno scenario, acquisire i dati di mapping spaziale in rete da un dispositivo HoloLens attivo, quindi salvarli su disco e riutilizzarli nelle sessioni di debug successive.
  • La visualizzazione 3D del portale di dispositivi di Windows consente di visualizzare tutte le superfici spaziali attualmente disponibili tramite il sistema di mapping spaziale. Questo fornisce una base di confronto per le superfici spaziali all'interno dell'applicazione; Ad esempio, è possibile indicare facilmente se mancano superfici spaziali o vengono visualizzate nella posizione sbagliata.

Linee guida generali per la creazione di prototipi

  • Poiché gli errori nei dati di mapping spaziale possono influire fortemente sull'esperienza dell'utente, è consigliabile testare l'applicazione in un'ampia gamma di ambienti.
  • Non essere intrappolato nell'abitudine di eseguire sempre test nella stessa posizione, ad esempio nella scrivania. Assicurarsi di testare su varie superfici di posizioni, forme, dimensioni e materiali diversi.
  • Analogamente, mentre i dati sintetici o registrati possono essere utili per il debug, non diventano troppo dipendenti dagli stessi test case. Questo può ritardare la ricerca di problemi importanti che i test più vari avrebbero rilevato in precedenza.
  • È consigliabile eseguire test con utenti reali (e idealmente non raggiungibili), perché potrebbero non usare HoloLens o l'applicazione esattamente come si fa. Infatti, può sorprendere il comportamento, la conoscenza e i presupposti divergenti delle persone!

Risoluzione dei problemi

  • Affinché le mesh di superficie siano orientate correttamente, ogni GameObject deve essere attivo prima che venga inviato al surfaceObserver per far costruire la mesh. In caso contrario, le mesh verranno visualizzate nello spazio, ma ruotate ad angoli strani.
  • Il GameObject che esegue lo script che comunica con SurfaceObserver deve essere impostato sull'origine. In caso contrario, tutti gli oggetti GameObject creati e inviati al surfaceObserver per costruire le mesh avranno un offset uguale all'offset dell'oggetto gioco padre. Ciò può rendere le mesh visualizzate diversi metri di distanza, il che rende difficile eseguire il debug di ciò che sta succedendo.

Vedi anche