Stabilizzazione dell'ologramma - MRTK2

Prestazioni

Per consentire alla piattaforma di realtà mista sottostante e al dispositivo di produrre i migliori risultati, è importante ottenere prestazioni di frequenza dei fotogrammi. Il framerate di destinazione (ad esempio 60 FPS o 90 FPS) varia tra piattaforme e dispositivi. Tuttavia, le applicazioni di realtà mista con framerate di fotogrammi avranno ologrammi stabili, nonché il rilevamento della testa efficiente, il rilevamento delle mani e altro ancora.

Rilevamento dell'ambiente

Il rendering olografico stabile si basa fortemente sul rilevamento della posizione head dal dispositivo della piattaforma & . Unity eseguirà il rendering della scena ogni fotogramma dalla fotocamera stimata e fornita dalla piattaforma sottostante. Se questo rilevamento non segue correttamente lo spostamento effettivo della testa, gli ologrammi appariranno visivamente imprecisi. Questo è particolarmente evidente e importante per i dispositivi AR come HoloLens dove gli utenti possono correlare ologrammi virtuali al mondo reale. Le prestazioni sono significative per il rilevamento head affidabile, ma possono essere presenti anche altre caratteristiche importanti. I tipi di elementi di ambiente che influisce sull'esperienza utente dipendono dalle specifiche della piattaforma di destinazione.

Windows Mixed Reality

La piattaforma Windows Mixed Reality fornisce alcuni materiali di riferimento per la stabilizzazione degli ologrammi sulla piattaforma. Esistono alcuni strumenti chiave, anche se gli sviluppatori possono usare per migliorare l'esperienza visiva ologramma per gli utenti.

Condivisione del buffer di profondità

Gli sviluppatori di Unity hanno la possibilità di condividere il buffer di profondità dell'applicazione con la piattaforma. In questo modo vengono fornite informazioni, in cui esistono ologrammi per un frame corrente, che la piattaforma può usare per stabilizzare gli ologrammi tramite un processo assistito dall'hardware noto come Late-Stage Reprojection.

Riprogettazione in fase tardiva

Alla fine del rendering di un frame, la piattaforma Windows Mixed Reality accetta le destinazioni di rendering della profondità del colore & prodotte dall'applicazione e trasforma l'output finale dello schermo in modo da tenere conto di qualsiasi leggero movimento della testa dall'ultima previsione della posizione head. Il ciclo di gioco di un'applicazione richiede tempo per l'esecuzione. Ad esempio, a 60 FPS, l'applicazione richiede circa 16,667ms per eseguire il rendering di un frame. Anche se questo potrebbe sembrare una quantità minima di tempo, la posizione e l'orientamento dell'utente della testa cambieranno causando nuove matrici di proiezione per la fotocamera nel rendering. La riprogettazione in fase tardiva trasforma i pixel nell'immagine finale per tenere conto di questa nuova prospettiva.

Per pixel e piano di stabilizzazione LSR

A seconda dell'endpoint del dispositivo e della versione del sistema operativo in esecuzione in un dispositivo Windows Mixed Reality, l'algoritmo Late-Stage Reprojection verrà eseguito per pixel o tramite un piano di stabilizzazione.

In base alla profondità per pixel

La riprogettazione basata sulla profondità per pixel prevede l'uso del buffer di profondità per modificare l'output dell'immagine per pixel e quindi stabilizzare gli ologrammi in varie distanze. Ad esempio, una sfera 1m di distanza può essere davanti a un pilastro che è lontano da 10 metri. I pixel che rappresentano la sfera avranno una trasformazione diversa rispetto ai pixel lontani che rappresentano il pilastro se l'utente ha inclinato leggermente la testa. La riprogettazione per pixel tiene conto di questa differenza di distanza in ogni pixel per una riprogettazione più accurata.

Piano di stabilizzazione

Se non è possibile creare un buffer di profondità accurato da condividere con la piattaforma, un'altra forma di LSR usa un piano di stabilizzazione. Tutti gli ologrammi in una scena riceveranno una stabilizzazione, ma gli ologrammi che si trovano nel piano desiderato riceveranno la stabilizzazione hardware massima. Il punto e la normale per il piano possono essere forniti alla piattaforma tramite l'API HolographicSettings.SetFocusPointForFramefornita da Unity.

Formato del buffer di profondità

Se si punta HoloLens per lo sviluppo, è consigliabile usare il formato del buffer di profondità a 16 bit rispetto a 24 bit. Ciò può risparmiare enormemente sulle prestazioni anche se i valori di profondità avranno meno precisione. Per compensare la precisione inferiore ed evitare z-fighting, è consigliabile ridurre il piano di clip lontano dal valore predefinito di 1000m impostato da Unity.

Nota

Se si usa un formato di profondità a 16 bit, gli effetti necessari del buffer stencil non funzioneranno perché Unity non crea un buffer stencil in questa impostazione. Se si seleziona un formato di profondità a 24 bit , in genere si creerà un buffer stencil a 8 bit, se applicabile nella piattaforma grafica dell'endpoint.

Condivisione del buffer di profondità in Unity

Per usare LSR basato su profondità, esistono due passaggi importanti che gli sviluppatori devono intraprendere.

  1. In Modifica>Project Impostazioni>Player>XR Impostazioni> SDK > di realtàvirtuale abilitare la condivisione del buffer di profondità
    1. Se la destinazione HoloLens, è consigliabile selezionare anche il formato di profondità a 16 bit.
  2. Quando si esegue il rendering del colore sullo schermo, eseguire anche il rendering della profondità

I GameObject opachi in Unity in genere scriveranno automaticamente in profondità. Tuttavia, gli oggetti di testo trasparente & non scrivono in genere in profondità per impostazione predefinita. Se si usa l'Mesh Pro MRTK Standard Shader o Text, questo può essere facilmente rimediato.

Nota

Per determinare rapidamente quali oggetti in una scena non scrivono nel buffer di profondità visivamente, è possibile usare l'utilità Buffer profondità di rendering nell'editor Impostazioni nel profilo di configurazione MRTK.

Shader MRTK Standard trasparente

Per materiali trasparenti usando lo shader MRTK Standard, selezionare il materiale da visualizzare nella finestra Controllo . Fare quindi clic sul pulsante Correzione ora per convertire il materiale in profondità (ad esempio Z-Write On).

Prima

Depth Buffer Before Fix MRTK Standard Shader

After

Depth Buffer Fixed MRTK Standard Shader

Testo Mesh Pro

Per gli oggetti Text Mesh Pro selezionare TMP GameObject per visualizzarlo nel controllo. Nel componente materiale passare allo shader per il materiale assegnato per l'uso dello shader TextMeshPro MRTK.

Text Mesh Pro Depth Buffer Fix

Shader personalizzato

Se si scrive uno shader personalizzato, aggiungere il flag ZWrite all'inizio della definizione del blocco Pass per configurare lo shader per scrivere nel buffer di profondità.

Shader "Custom/MyShader"
{
    SubShader
    {
        Pass
        {
            ...
            ZWrite On
            ...
        }
    }
}
Backing opaco

Se i metodi precedenti non funzionano per uno scenario specifico (ad esempio usando l'interfaccia utente di Unity), è possibile disporre di un altro oggetto write nel buffer di profondità. Un esempio comune è l'uso del testo dell'interfaccia utente unity in un pannello mobile in una scena. Rendendo il pannello opaco o almeno scrivendo in profondità, entrambi il testo & del pannello verrà stabilizzato dalla piattaforma poiché i relativi valori z sono così vicini tra loro.

WorldAnchors (HoloLens)

Oltre a garantire che le configurazioni corrette siano soddisfatte per garantire la stabilità visiva, è importante garantire che gli ologrammi rimangano stabili nelle posizioni fisiche corrette. Per informare la piattaforma su posizioni importanti in uno spazio fisico, gli sviluppatori possono sfruttare WorldAnchors su GameObjects che devono rimanere in un unico posto. Un WorldAnchor è un componente aggiunto a un GameObject che accetta il controllo assoluto sulla trasformazione dell'oggetto.

I dispositivi come HoloLens sono costantemente a scansione e apprendimento sull'ambiente. Pertanto, quando il HoloLens tiene traccia della posizione di spostamento & nello spazio, le stime verranno aggiornate e il sistema di coordinate Unity modificato. Ad esempio, se un GameObject viene posizionato 1m dalla fotocamera all'inizio, come il HoloLens tiene traccia dell'ambiente, può realizzare il punto fisico in cui si trova GameObject è effettivamente 1,1m di distanza. Ciò comporta la deriva dell'ologramma. L'applicazione di un WorldAnchor a un GameObject consentirà all'ancoraggio di controllare la trasformazione dell'oggetto in modo che l'oggetto rimanga nella posizione fisica corretta(ad esempio l'aggiornamento a 1,1m invece di 1m in fase di esecuzione). Per rendere persistenti WorldAnchors tra sessioni di app, gli sviluppatori possono usare WorldAnchorStore per salvare e caricare WorldAnchors.

Nota

Dopo aver aggiunto un componente WorldAnchor a un GameObject, non è possibile modificare la trasformazione di GameObject (ad esempio transform.position = x). Uno sviluppatore deve rimuovere il WorldAnchor per modificare la trasformazione.

WorldAnchor m_anchor;

public void AddAnchor()
{
    this.m_anchor = this.gameObject.AddComponent<WorldAnchor>();
}

public void RemoveAnchor()
{
    DestroyImmediate(m_anchor);
}

Se si vuole usare manualmente ancoraggi, vedere Microsoft World Locking Tools.

Vedere anche