Mapping spaziale

Il mapping spaziale offre una rappresentazione dettagliata delle superfici reali nell'ambiente intorno al 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. Ologrammi fluttuare nello spazio o spostarsi con l'utente non si sente come reale. 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

Mesh surfaces covering a room
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 al HoloLens (si spostano, ma non ruotano, con il 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 il 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 Ologrammi - Consapevolezza spaziale di seguito. Al termine, continuare per un approfondimento più dettagliato su argomenti specifici.

Questo video è stato tratto dall'app HoloLens 2 "Progettazione Ologrammi". 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

Illustrations of common Spatial Mapping usage scenarios: Placement, Occlusion, Physics and Navigation

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 generale, qualsiasi selezione di posizioni spaziali) per trovarsi su 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.

Impossibile usare la funzionalità NavMesh predefinita in Unity con le superfici di mapping spaziale. Ciò è dovuto al fatto che le superfici di mapping spaziale non sono note fino all'avvio dell'applicazione, ma i file di dati NavMesh devono essere generati dagli asset di origine in anticipo. Si noti anche che il sistema di mapping spaziale non fornisce informazioni sulle superfici lontane dalla posizione corrente dell'utente. L'applicazione deve quindi "ricordare" se si tratta di creare una mappa di un'area di grandi dimensioni.

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).

Mesh Caching

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.
    • Gli aggiornamenti alle superfici spaziali all'esterno dell'area corrente di interesse dell'utente possono essere ignorati 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 "ombre" da oggetti su superfici spaziali può fornire feedback visivo utile all'utente mentre posiziona gli ologrammi sulle superfici.
    • Una cosa da tenere presente è che le mesh spaziali sono diverse dal tipo di mesh che un artista 3D potrebbe creare. La topologia del triangolo non sarà "pulita" come topologia creata dall'utente e la mesh soffrirà di diversi errori.
    • Per creare un'estetica visiva piacevole, si può voler eseguire alcune elaborazioni mesh, ad esempio per riempire fori o normali di superficie liscia. È anche possibile usare uno shader per proiettare trame progettate dall'artista nella mesh invece di visualizzare direttamente topologie mesh e normali.
  • Per l'occlusione degli ologrammi dietro superfici reali
    • È possibile eseguire il rendering delle superfici spaziali 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 bloccato in modo da occudere successivamente gli ologrammi sottoposti a rendering dietro le superfici spaziali. Un'occlusione accurata degli ologrammi migliora il senso che gli ologrammi esistono effettivamente nello spazio fisico dell'utente.
    • Per abilitare il rendering di sola profondità, aggiornare lo stato di fusione per impostare RenderTargetWriteMask su zero per tutte le destinazioni di rendering dei colori.
  • Per modificare l'aspetto degli ologrammi occlusi da superfici reali
    • In genere, la geometria sottoposta a rendering è nascosta quando è occlusa. Ciò si ottiene impostando la funzione di profondità nello stato depth-stencil su "minore o uguale", che fa sì che la geometria sia visibile solo dove è più vicina alla fotocamera rispetto a tutta la geometria di cui è stato eseguito il rendering in precedenza.
    • Tuttavia, può essere utile mantenere una certa geometria visibile anche quando è occluso e modificarne l'aspetto quando è occluso come modo per fornire feedback visivo all'utente. Ad esempio, ciò consente all'applicazione di mostrare all'utente la posizione di un oggetto, rendendo chiaro che si trova dietro una superficie reale.
    • A tale scopo, 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 depth-stencil. Prima di tutto, impostare la funzione depth su "maggiore o uguale" in modo che la geometria sia visibile solo dove è più lontano dalla fotocamera rispetto a tutta la geometria di cui è stato eseguito il rendering in precedenza. 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. Ecco alcune tecniche di prestazioni 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 della superficie, richiedere la densità più bassa di mesh di triangoli che saranno sufficienti per le proprie esigenze.
    • Può essere opportuno variare la densità del triangolo in base alla superficie in base alla superficie, a seconda della distanza della superficie dall'utente e della sua pertinenza per l'esperienza utente.
    • La riduzione dei conteggi dei triangoli ridurrà l'utilizzo della memoria e i costi di elaborazione dei vertici nella GPU, anche se non influirà sui costi di elaborazione dei pixel.
  • Usare il frustum culling
    • Frustum culling ignora gli oggetti disegno che non possono essere visti perché si trovano all'esterno del frustum di visualizzazione corrente. In questo modo si riducono sia i costi di elaborazione della CPU che della GPU.
    • Poiché il culling viene eseguito su base mesh e le superfici spaziali possono essere grandi, la suddivisione di ogni mesh di superficie spaziale in blocchi più piccoli può comportare un culling più efficiente (in questo viene eseguito il rendering di un minor numero di triangoli fuori schermo). C'è però un compromesso; più mesh sono disponibili, più chiamate di disegno è necessario effettuare, che può aumentare i costi della CPU. In un caso estremo, i calcoli del frustum culling stessi potrebbero anche avere un costo misurabile della CPU.
  • Regolare l'ordine di rendering
    • Le superfici spaziali tendono a essere grandi, perché rappresentano l'intero ambiente circostante all'utente. I costi di elaborazione dei pixel nella 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 comporterà l'occlusione di qualsiasi livello più lontano, quindi qualsiasi tempo della GPU impiegato 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 (più vicini, più distanti per ultimo). Per "opaco" si intende la superficie per la quale DepthWriteMask è impostato su uno nello stato depth-stencil. Quando viene eseguito il rendering delle superfici più vicine, avviano il buffer di profondità in modo che le superfici più distanti vengano ignorate in modo efficiente dal processore pixel nella GPU.

elaborazione Mesh

Un'applicazione può voler eseguire varie operazioni sulle mesh di superficie spaziale in base alle proprie esigenze. I dati di indice e vertice forniti con ogni mesh di superficie spaziale usano lo stesso layout familiare dei vertex e dei buffer di indice usati per il rendering di mesh di triangoli 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 in senso orario anteriore. Ogni triangolo è rappresentato da tre indici dei vertici nel buffer di indice della mesh e questi indici identificano i vertici del triangolo in senso 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 della mesh solo se la densità del triangolo più grossolana fornita dall'osservatore della superficie è ancora insufficiente. Questo lavoro è dispendioso dal livello di calcolo e già eseguito dal runtime per generare i vari livelli di dettaglio forniti.

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

Raycasting e collisione

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

  • Contengono solo piccoli numeri di triangoli. Le operazioni di fisica sono più a elevato utilizzo di calcolo rispetto alle operazioni di rendering.
  • Sono "stretti". Le superfici che devono essere solide non devono avere piccoli fori in esse; anche i fori troppo piccoli per essere visibili possono causare problemi.
  • Vengono convertiti in scafi convesso. Gli scafi convesso hanno pochi poligoni e sono privi di fori e sono molto più efficienti dal livello di calcolo per elaborare le mesh di triangoli non elaborati.

Quando si fanno raycast su superfici spaziali, tenere presente che queste superfici sono spesso complesse, forme ingombrate piene di piccoli dettagli disordinati - proprio come la 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 una piccola area e usare i risultati aggregati per derivare una comprensione più affidabile della superficie. Ad esempio, l'uso della media di 10 raycast per guidare il posizionamento dell'ologramma su una superficie produrrà un risultato molto più fluido e meno "instabilità" 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, è consigliabile evitare il costo computazionale dei raycast aggiuntivi (eseguiti ogni fotogramma) rispetto al costo computazionale dell'elaborazione mesh per uniformare e rimuovere fori nelle superfici spaziali (eseguite quando vengono aggiornate le mesh spaziali).

Esperienza di analisi dell'ambiente

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

Example of scanning
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 progettazione.

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

In secondo luogo, le applicazioni dovrebbero tentare di trovare un equilibrio tra efficienza e affidabilità. Quando è possibile farlo in modo affidabile, le applicazioni devono analizzare automaticamente i dati di mapping spaziale per risparmiare tempo all'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 scansione guidata; apprenderà le superfici osservate nel corso del movimento dell'utente naturale.
    • Ad esempio, un'applicazione che consente all'utente di disegnare su superfici con vernice spray 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à dedicato molto tempo usando il HoloLens.
    • Tenere presente tuttavia che la fotocamera usata dal mapping spaziale può visualizzare solo 3,1 m davanti all'utente, in modo che il mapping spaziale non conosca le superfici più distanti a meno che l'utente non le abbia osservate da una distanza più vicina in passato.
    • Pertanto, l'utente capisce quali superfici sono state analizzate, l'applicazione deve fornire feedback visivo a questo effetto, ad esempio il cast di ombre virtuali su superfici analizzate può aiutare l'utente a posizionare gli ologrammi su tali superfici.
    • In questo caso, i volumi di delimitazione dell'osservatore della superficie spaziale devono essere aggiornati a ogni fotogramma in un sistema di coordinate spaziali bloccate dal corpo, in modo che seguano l'utente.
  • Trovare una posizione appropriata

    • 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 che possa praticare in modo sicuro kung-fu olografico.
    • Le applicazioni devono comunicare eventuali requisiti specifici all'utente in anticipo e rafforzarle con un feedback visivo chiaro.
    • In questo esempio, l'applicazione deve visualizzare l'estensione dell'area vuota richiesta ed evidenziare visivamente la presenza di eventuali oggetti indesiderati all'interno di questa zona.
    • In questo caso, i volumi di delimitazione dell'osservatore della superficie spaziale devono usare un sistema di coordinate spaziali bloccato al mondo nella posizione scelta.
  • Trovare una configurazione appropriata delle superfici

    • Un'applicazione può richiedere una configurazione specifica di superfici, ad esempio due pareti grandi, piatte 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 necessita di 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 desidera vendere.
    • In questo caso, l'applicazione deve acquisire i dati di mapping spaziale all'interno delle aree osservate dall'utente durante l'analisi.
  • Analizza 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 Lilliputiani che si avvicinano da tutte le direzioni.
    • In questi casi, l'applicazione dovrà determinare quanti delle superfici nella stanza corrente sono già state analizzate e indirizzare lo sguardo dell'utente per riempire lacune significative.
    • La chiave di questo processo fornisce commenti visivi che rendono chiaro all'utente che le superfici non sono ancora state analizzate. L'applicazione potrebbe, ad esempio, usare la nebbia basata sulla distanza per evidenziare visivamente le aree che non sono coperte dalle superfici di mapping spaziale.
  • Acquisire uno snapshot iniziale dell'ambiente

    • Un'applicazione può voler ignorare tutte le modifiche nell'ambiente dopo aver eseguito 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 eseguire una copia dei dati del 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 occlusi correttamente dall'ambiente.
    • Gli aggiornamenti continui ai dati di mapping spaziale consentono anche di visualizzare eventuali modifiche che si sono verificate, 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 solo alle modifiche ambientali quando viene indicato 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 il "cambiamento della scena" per un gioco olografico che si svolge sull'altro lato.
  • Guida l'utente a evitare errori nei dati del mapping spaziale

    • Un'applicazione può voler fornire indicazioni all'utente durante l'analisi del proprio ambiente.
    • Ciò consente all'utente di evitare determinati tipi di errori nei dati del mapping spaziale, ad esempio mantenendo lontano da finestre o specchi in luce solare.

Un dettaglio aggiuntivo da tenere presente è che l'intervallo di dati di mapping spaziale non è illimitato. Mentre 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 tornano all'inizio. È possibile attenuare questo problema memorizzando nella cache tali superfici nell'applicazione dopo che sono scomparsi dai dati di mapping spaziale disponibili.

Mesh elaborazione

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

Tenere presente che i dati di mapping spaziale sono destinati a essere più fedeli possibile alle superfici reali, in modo che qualsiasi elaborazione che si applicano rischi di spostare le superfici ulteriormente dalla "verità".

Ecco alcuni esempi di diversi tipi di elaborazione mesh che è possibile trovare utili:

  • Riempimento foro

    • Se un piccolo oggetto fatto di un materiale scuro non riesce a analizzare, lascerà un buco nella superficie circostante.
    • I fori influiscono sull'occlusione: gli ologrammi possono essere visti "attraverso" un buco in una superficie reale presumibilmente opaca.
    • I fori influiscono sui raycast: se si usano i raycast per aiutare gli utenti a interagire con le superfici, potrebbe essere indesiderato per questi raggi passare attraverso fori. Una mitigazione consiste nell'usare un bundle di più raycast che coprono un'area di dimensioni appropriate. Ciò consente di 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 fisiche: un oggetto controllato dalla simulazione fisica può cadere attraverso un buco nel pavimento e diventare perso.
    • È possibile riempire in modo algoritmico tali fori nella rete di superficie. Tuttavia, è necessario ottimizzare l'algoritmo in modo che i "buchi reali" come finestre e porte non siano compilati. Può essere difficile distinguere in modo affidabile "buchi reali" da "fori immaginari", quindi sarà necessario sperimentare con diverse euristiche, ad esempio "dimensioni" e "forma limite".
  • Rimozione dell'allucinazione

    • I riflessi, le luci luminose e gli oggetti mobili possono lasciare piccoli "allucinazioni" fluttuanti a metà aria.
    • Le allucinazioni influiscono sull'occlusione: le allucinazioni possono diventare visibili come forme scure che si spostano davanti a e occludando altri ologrammi.
    • Le allucinazioni influiscono sui raycast: se si usano i raycast per aiutare gli utenti a interagire con le superfici, questi raggi potrebbero colpire una allucinazione anziché la superficie dietro di esso. Come per i fori, una mitigazione consiste nell'usare molti raycast anziché un singolo raycast, ma anche questo verrà a un costo di calcolo.
    • Le allucinazioni influiscono sulle collisioni fisiche: un oggetto controllato dalla simulazione fisica può diventare bloccato contro una allucinazione e non è in grado di spostarsi attraverso un'area apparentemente chiara dello spazio.
    • È possibile filtrare tali allucinazioni dalla rete di superficie. Tuttavia, come con i fori, è necessario ottimizzare l'algoritmo in modo che i veri oggetti piccoli, ad esempio gli stand della lampada e le maniglie delle porte non vengono rimossi.
  • Definizione di movimenti uniformi

    • Il mapping spaziale può restituire superfici che sembrano essere approssimative o "rumorose" rispetto alle loro controparti reali.
    • La fluidità influisce sulle collisioni fisiche: se il pavimento è grossolano, una palla da golf simulata fisicamente potrebbe non rotolare uniformemente su di esso in una linea dritta.
    • La fluidità influisce sul rendering: se una superficie viene visualizzata direttamente, le normali di superficie approssimativa possono influire sul suo aspetto e interrompere un aspetto "pulito". È possibile attenuare questo problema usando illuminazione e trame appropriate nello shader usato per eseguire il rendering della superficie.
    • È possibile regolare la rugosità in una rete di superficie. Tuttavia, questo può spingere la superficie più lontano dalla superficie reale corrispondente. La gestione di una corrispondenza stretta è importante per produrre un'occlusione ologramma accurata e per consentire agli utenti di ottenere interazioni precise e prevedibili con superfici olografiche.
    • Se è necessaria solo una modifica estetica, può essere sufficiente per regolare i vertici senza modificare le posizioni del vertice.
  • Ricerca del piano

    • Esistono molte forme di analisi che un'applicazione può voler eseguire sulle superfici fornite dal mapping spaziale.
    • Un semplice esempio è 'piano ricerca'; identificazione di aree delimitate, principalmente aree planari delle 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 limitare l'interfaccia utente, per guidare gli utenti a interagire con le superfici più adatte alle proprie esigenze.
    • Le aree planari possono essere usate come nel mondo reale, per le controparti olografiche agli oggetti funzionali, ad esempio schermi LCD, tabelle o lavagna.
    • Le aree planari possono definire aree di gioco, formando la base dei livelli di videogiochi.
    • Le regioni planari possono aiutare gli agenti virtuali a spostarsi nel mondo reale, identificando le aree del pavimento che le persone reali probabilmente camminano.

Prototipazione e debug

Strumenti utili

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

Linee guida generali per la creazione di prototipi

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

Risoluzione dei problemi

  • Affinché le mesh di superficie siano orientate correttamente, ogni GameObject deve essere attivo prima che venga inviato al server SurfaceOb per avere la sua mesh costruita. In caso contrario, le mesh verranno visualizzate nello spazio, ma ruotate in angoli strani.
  • 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 server SurfaceOb per avere le loro mesh costruite avranno un offset uguale all'offset dell'oggetto Gioco padre. Ciò può rendere le mesh visualizzate più metri di distanza, che rende difficile eseguire il debug di ciò che sta succedendo.

Vedi anche