Mapping spaziale

Il mapping spaziale offre una rappresentazione dettagliata delle superfici reali nell'ambiente intorno a HoloLens, consentendo agli sviluppatori di creare un'esperienza di realtà mista convincente. Combinando il mondo reale con il mondo virtuale, un'applicazione può creare ologrammi sembra reale. 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 gli 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 mobili nello spazio o lo spostamento con l'utente non saranno reali. Quando possibile, posizionare gli elementi per il comfort.

Visualizzare le superfici durante l'inserimento o lo spostamento di ologrammi (usare una griglia proiettata). Questo aiuta gli utenti a sapere dove possono posizionare meglio gli ologrammi e mostra se il punto in cui stanno cercando di posizionare l'ologramma non è mappato. È possibile "visualizzare elementi di cartellone" verso l'utente se finiscono troppo in un angolo.

Panoramica dei concetti

Superfici mesh che coprono una stanza
Esempio di una rete 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 Surface Observer spaziale uno o più volumi di delimitazione, per definire le aree dello 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 stazioni (in una posizione fissa in base al mondo reale) o possono essere collegati a HoloLens (si spostano, ma non ruotano, con HoloLens mentre si sposta attraverso l'ambiente). Ogni superficie spaziale descrive le superfici reali in un piccolo volume di spazio, rappresentato come una mesh triangolare collegata a un sistema di coordinate spaziali bloccato dal mondo.

Poiché HoloLens raccoglie nuovi dati sull'ambiente e, quando si verificano modifiche all'ambiente, le superfici spaziali verranno visualizzate, scompaiono e cambiano.

Demo dei concetti di progettazione della consapevolezza spaziale

Per visualizzare i concetti di progettazione della consapevolezza spaziale in azione, vedere la demo del video Designing Holograms - Spatial Awareness video sotto. Al termine, continuare per un'analisi più dettagliata di argomenti specifici.

Questo video è stato tratto dall'app "Designing Holograms" HoloLens 2. Scaricare e godere dell'esperienza completa qui.

Mapping spaziale e Scene Understanding WorldMesh

Per HoloLens 2, è possibile eseguire una query su una versione statica dei dati di mapping spaziale usando l'SDK di comprensione delle scene (impostazione EnableWorldMesh). Ecco le differenze tra due modi per accedere ai dati del 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 eventi SurfaceChanged.
    • Livello variabile dei dettagli controllati dal parametro Triangoli per misuratore cubo.
  • SDK di comprensione delle scene:
    • 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. Ottenere i dati di mapping spaziale aggiornati richiede l'esecuzione di una nuova query per l'intera mesh.
    • Livello coerente di dettagli controllati dall'impostazione RequestedMeshLevelOfDetail.

Che influenza la qualità del mapping spaziale?

Diversi fattori, dettagliati 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 di utilizzo comuni 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 all'utente; cosa potrebbe essere più naturale di posizionare 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 più veloci, facili e precise le interazioni dell'utente. Questo è vero perché "lontano" non è qualcosa che viene usato per comunicare fisicamente ad altre persone o ai computer. Quando puntiamo con il dito, stiamo specificando una direzione ma non una distanza.

Un aspetto importante è che quando un'applicazione inferisce la distanza dalla direzione (ad esempio eseguendo un raycast lungo la direzione dello sguardo 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 loro senso di controllo e questo può diventare rapidamente frustrante. Un metodo che aiuta a farlo consiste nell'eseguire più raycast anziché solo uno. I risultati dell'aggregazione devono essere più scorrevoli e più prevedibili, meno soggetti all'influenza dai risultati "outlier" temporanei (come possono essere causati da raggi che passano attraverso piccoli fori o colpiscono piccoli bit di geometria che l'utente non è consapevole). L'aggregazione o il smoothing possono essere eseguiti anche nel tempo; ad esempio, è possibile limitare la velocità massima in base alla quale un ologramma può variare in distanza dall'utente. Limitando semplicemente il valore minimo e massimo di distanza può essere utile, quindi l'ologramma spostato non si sposta improvvisamente verso la distanza o si blocca nuovamente nella faccia dell'utente.

Le applicazioni possono anche usare la forma e la direzione delle superfici per guidare la posizione dell'ologramma. Una sedia olografica non dovrebbe penetrare attraverso pareti e dovrebbe sedersi a scaricarsi con il pavimento anche se è leggermente irregolare. Questo tipo di funzionalità probabilmente si basa sull'uso delle collisioni fisiche anziché sui raycast, ma le preoccupazioni simili verranno applicate. Se l'ologramma posizionato ha molti poligoni piccoli che si arrotondano, 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 sulle superfici spaziali senza snagare.

Al suo estremo, l'input utente può essere semplificato completamente e le superfici spaziali possono essere usate per eseguire completamente il posizionamento ologramma automatico. Ad esempio, l'applicazione potrebbe posizionare un commutatore olografico da qualche parte sulla parete per la pressione dell'utente. La stessa attenzione sulla prevedibilità si applica in modo doubly qui; se l'utente prevede il controllo sul posizionamento dell'ologramma, ma l'applicazione non inserisce sempre gli ologrammi in cui si prevede (se il commutatore di luce appare da qualche parte che l'utente non può raggiungere), questa sarà un'esperienza frustrante. Può effettivamente essere peggio fare il posizionamento automatico che richiede la correzione dell'utente alcuni dei tempi, piuttosto che richiedere solo all'utente di eseguire sempre il posizionamento stesso; perché il posizionamento automatico riuscito è previsto, la correzione manuale si sente come un carico!

Si noti anche che la capacità di un'applicazione di usare le superfici spaziali per il posizionamento dipende fortemente dall'esperienza di analisi dell'applicazione. Se una superficie non è stata analizzata, non può essere usata per il posizionamento. L'applicazione deve essere chiara all'utente, in modo che possano analizzare nuove superfici o selezionare una nuova posizione.

Il feedback visivo all'utente è di importanza fondamentale 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 possono inserire un ologramma nella posizione corrente, il feedback visivo dovrebbe rendere chiaro perché non. Ad esempio, se l'utente sta cercando di posizionare un divano olografico bloccato a metà del muro, le parti del divano che sono 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 rendere chiara questa operazione. L'assenza evidente di un effetto di base in questa area può raggiungere questo scopo.

Occlusione

Uno degli usi principali delle superfici di mapping spaziale consiste semplicemente nell'occludere gli ologrammi. Questo comportamento semplice ha un impatto enorme sul realismo percepito degli ologrammi, aiutando a creare un senso viscerale che in realtà usa 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 feedback visivo aggiuntivo come la posizione spaziale di quell'ologramma nel mondo. Al contrario, l'occlusione può anche nascondere informazioni dall'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 colliderà con tale superficie e non passarlo.

A volte, l'occlusione degli ologrammi è indesiderata. Se un utente deve interagire con un ologramma, è necessario vederlo, anche se è dietro una superficie reale. In questi casi, in genere è consigliabile eseguire il rendering di un ologramma in modo diverso quando è occluso (ad esempio, riducendo la sua 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 fuori dalla mia scrivania, rimbalza sul pavimento e scompare sotto il divano, potrebbe essere difficile per me credere che non sia lì.

La simulazione fisica offre anche l'opportunità per un'applicazione di usare interazioni fisiche naturali e familiari. Lo spostamento di un pezzo di mobili olografici intorno al pavimento probabilmente sarà più facile per l'utente se l'arredamento risponde come se fosse scorrevole sul pavimento con l'inertia 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 galleggianti e superfici ruvide smussate.

È anche necessario considerare il modo in cui l'esperienza di analisi dell'applicazione influisce sulla simulazione della fisica. In primo luogo, le superfici mancanti non si scontrano con nulla; cosa succede quando la palla di gomma rotola giù dal corridoio e fuori dalla fine del mondo conosciuto? In secondo luogo, è necessario decidere se si continuerà a rispondere alle modifiche nell'ambiente nel tempo. In alcuni casi, si vuole rispondere il più rapidamente possibile; si supponga se l'utente usa porte e mobili come barricate mobili in difesa contro una tempesta di frecce romane in ingresso. In altri casi, tuttavia, potresti voler 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 in mezzo alla pista.

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

Le funzionalità di spostamento possono essere utili anche per gli utenti. Dopo aver creato una mappa di spostamento in una determinata area, potrebbe essere condivisa per fornire indicazioni olografiche per i nuovi utenti che non hanno familiarità con tale posizione. Questa mappa può essere progettata per mantenere il flusso uniforme del "traffico" pedonale o per evitare incidenti in luoghi pericolosi come i cantieri.

Le principali sfide tecniche coinvolte nell'implementazione delle funzionalità di navigazione saranno il rilevamento affidabile delle superfici camminabili (gli esseri umani non camminano sulle tabelle!) e l'adattamento normale ai cambiamenti nell'ambiente (gli esseri umani non camminano attraverso le porte chiuse!). La mesh può richiedere un'elaborazione prima che sia utilizzabile per la pianificazione del percorso e la navigazione in base a un carattere virtuale. Smussare la mesh e rimuovere allucinazioni può aiutare a evitare che i personaggi diventino bloccati. È anche possibile semplificare drasticamente la mesh per velocizzare i calcoli di spostamento e pianificazione del percorso del personaggio. Queste sfide hanno ricevuto una grande quantità di attenzione nello sviluppo della tecnologia di videogiochi, e c'è una vasta gamma 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 compilare NavMesh durante il runtime installando NavMeshComponents. Si noti che il sistema di mapping spaziale non fornirà informazioni sulle superfici lontano 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 degli extent di osservazione nel profilo di consapevolezza spaziale, aumentando l'area su cui è possibile creare il NavMesh.

Visualizzazione

Nella maggior parte dei casi è opportuno che le superfici spaziali siano invisibili; 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 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 proiettando un'ombreggiatura sulla superficie. In questo modo l'utente ha un senso molto più chiaro della prossimità fisica esatta tra l'ologramma e la superficie. Questo è anche un esempio della pratica più generale di una modifica visivamente "in anteprima" prima che l'utente ne esemplififi il commit.

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

La visualizzazione delle superfici può essere un modo utile per mostrare agli spazi vicini dell'utente nascosti dalla visualizzazione. Questo potrebbe fornire un modo per concedere all'utente l'accesso alla propria cucina (e tutti i suoi ologrammi contenuti) dal proprio 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 di superficie in modo visivo distrazione, mentre le trame "pulite" proiettate sulla superficie possono contribuire a dare un aspetto più ordinato. È anche possibile eseguire l'elaborazione mesh per migliorare le proprietà della mesh, prima che venga eseguito il 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 del programma è il seguente:

  • Creare un oggetto osservatore superficie
    • Fornire uno o più volumi spaziali per definire le aree di interesse in cui l'applicazione desidera 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 a livello globale per identificare un'area fissa del mondo fisico.
    • Usare un volume spaziale, aggiornato ogni fotogramma con un sistema di coordinate spaziali bloccato 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, in quanto lo stato dell'applicazione o l'utente cambia.
  • Usare il polling o la notifica per recuperare informazioni sulle superfici spaziali
    • È possibile eseguire il polling dell'osservatore della superficie per lo stato della superficie spaziale in qualsiasi momento. È invece possibile registrarsi per l'evento "superfici modificate" dell'osservatore della superficie, che invierà una notifica all'applicazione quando le superfici spaziali sono cambiate.
    • Per un volume spaziale dinamico, ad esempio il frustum di visualizzazione o un volume bloccato dal corpo, le applicazioni dovranno eseguire il polling delle modifiche 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 globale che copre una singola stanza, le applicazioni possono registrarsi per l'evento "superfici modificate" per ricevere una notifica quando le superfici spaziali all'interno di tale volume possono essere cambiate.
  • Modifiche delle superfici di processo
    • Eseguire l'iterazione del set specificato 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 al 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 utilizzare 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 di mesh. Questo schema deve determinare quali mesh conservare e quali eliminare e quando aggiornare la mesh per ogni superficie spaziale.

Molte delle considerazioni descritte in questo articolo indicherà direttamente come l'applicazione deve affrontare la memorizzazione nella cache mesh. È consigliabile considerare il modo in cui l'utente passa attraverso l'ambiente, quali superfici sono necessarie, quando si osservano superfici diverse e quando devono essere acquisite modifiche nell'ambiente.

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

  • Se l'applicazione vede un ID superficie spaziale che non è stato visto in precedenza, deve considerarlo come una nuova superficie spaziale.
  • Se l'applicazione rileva una superficie spaziale con un ID noto ma con un nuovo tempo di aggiornamento, deve considerarla come una superficie spaziale aggiornata.
  • Se l'applicazione non vede più una superficie spaziale con un ID noto, deve considerarla come una superficie spaziale rimossa.

Spetta a ogni applicazione effettuare le scelte seguenti:

  • Per le nuove superfici spaziali, è necessario richiedere una mesh?
    • In genere la mesh deve essere richiesta immediatamente per le nuove superfici spaziali, che possono fornire nuove informazioni utili all'utente.
    • Tuttavia, alle nuove superfici spaziali vicino e davanti all'utente deve essere assegnata la priorità e la relativa mesh deve essere richiesta per prima.
    • Se la nuova mesh non è necessaria, se ad esempio l'applicazione ha permanentemente o temporaneamente "bloccato" il modello dell'ambiente, non deve essere richiesto.
  • Per le superfici spaziali aggiornate, è necessario richiedere mesh?
    • Alle superfici spaziali aggiornate vicino e davanti all'utente deve essere assegnata la priorità e la relativa mesh deve essere richiesta per prima.
    • Può anche essere opportuno dare priorità più alta alle nuove superfici rispetto alle superfici aggiornate, soprattutto durante l'esperienza di scansione.
    • Per limitare i costi di elaborazione, le applicazioni possono voler limitare la frequenza con 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 sufficientemente importante da elaborare.
    • Aggiornamenti alle superfici spaziali esterne all'area di interesse corrente dell'utente possono essere ignorate completamente, anche se in questo caso può essere più efficiente modificare i volumi di delimitazione spaziale in uso dall'osservatore della superficie.
  • Per le superfici spaziali rimosse, la mesh deve essere eliminata?
    • In genere, la mesh deve essere eliminata immediatamente per le superfici spaziali rimosse, in modo che l'occlusione dell'ologramma rimanga corretta.
    • Tuttavia, se l'applicazione ha motivo di credere che una superficie spaziale verrà nuovamente visualizzata a breve (in base alla progettazione dell'esperienza utente), potrebbe essere più efficiente mantenerla che eliminare la mesh e ricrearla di nuovo in un secondo momento.
    • Se l'applicazione sta creando un modello su larga scala dell'ambiente dell'utente, potrebbe non voler eliminare affatto le mesh. Sarà comunque necessario limitare l'utilizzo delle risorse, possibilmente eseguendo lo spooling di mesh su disco perché le 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. Pertanto, le applicazioni che scelgono di non rimuovere una superficie rimossa devono prestare attenzione a non finire con più mesh di superfici 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, deve essere rimossa. Ad esempio, se l'applicazione "sostituisce" la stanza dall'altro lato di una porta con uno spazio virtuale alternativo, le superfici spaziali in quella stanza non sono più importanti.

Ecco una strategia di memorizzazione nella cache mesh di esempio, usando l'isteresi spaziale e temporale:

  • Si consideri un'applicazione che vuole usare un volume spaziale a forma di frustum di interesse che segue lo sguardo dell'utente mentre si guarda intorno e si sposta.
  • Una superficie spaziale può scomparire temporaneamente da questo volume semplicemente perché l'utente si allontana dalla superficie o si allontana da esso... solo per guardare indietro o si avvicina di nuovo 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 della superficie spaziale, uno contenuto nell'altro. Il volume più grande è sferico e segue l'utente 'pigrita'; si sposta solo quando necessario per assicurarsi che il centro si trova entro 2,0 metri dall'utente.
  • Le mesh di superficie spaziale 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 sfida anche la rimozione delle 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 visualizzate in un passaggio di 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 certa 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 delle 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 nelle vicinanze 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 ingombrate piene di piccoli dettagli disordinati - proprio come la tua 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 ombre 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

    • I riflessi, le luci luminose e gli oggetti mobili possono lasciare piccole allucinazioni che fluttuano 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