Stabilizace hologramu – MRTK2

Výkon

Aby základní platforma a zařízení hybridní reality dosahovaly nejlepších výsledků, je důležité dosáhnout výkonu snímkových frekvencí. Cílová snímková rychlost (např. 60 snímků za sekundu nebo 90 FPS) se na různých platformách a zařízeních liší. Aplikace hybridní reality ale budou mít stabilní hologramy, efektivní sledování hlavy, sledování rukou a další.

Sledování prostředí

Stabilní holografické vykreslování se do značné míry spoléhá na sledování head-pose ze strany platformy & zařízení. Unity vykresluje scénu každý snímek z pozice fotoaparátu, který odhadne a poskytne podkladová platforma. Pokud toto sledování neodpovídá skutečnému pohybu hlavy, budou hologramy vypadat vizuálně nepřesně. To je zvlášť zřejmé a důležité pro zařízení s rozšířenou realitou, jako je HoloLens, kde uživatelé můžou propojit virtuální hologramy s reálným světem. Výkon je významný pro spolehlivé sledování hlavy, ale mohou existovat i další důležité funkce. Typy prvků prostředí, které ovlivňují uživatelské prostředí, budou záviset na specifikách cílové platformy.

Windows Mixed Reality

Platforma Windows Mixed Reality poskytuje referenční materiál pro stabilizaci hologramů na platformě. Existuje ale několik klíčových nástrojů, které můžou vývojáři využít ke zlepšení vizuálního prostředí hologramu pro uživatele.

Sdílení hloubkové vyrovnávací paměti

Vývojáři Unity mají možnost sdílet hloubkovou vyrovnávací paměť aplikace s platformou. Poskytuje informace o tom, kde existují hologramy pro aktuální rámec, které platforma může využít ke stabilizaci hologramů prostřednictvím hardwarově asistovaného procesu označovaného jako Late-Stage Reprojection.

Reprojekce v pozdní fázi

Na konci vykreslení snímku platforma Windows Mixed Reality vezme barvu & hloubkové vykreslení cílů vytvořených aplikací a transformuje výsledný výstup obrazovky tak, aby zohlednil jakýkoli mírný pohyb hlavy od poslední predikce pozice hlavy. Spuštění herní smyčky aplikace nějakou dobu trvá. Například při 60 FPS to znamená, že aplikace trvá přibližně 16,667ms, aby vykreslila rámeček. I když se to může zdát jako minimální doba, změní se pozice a orientace hlavy uživatele, což způsobí, že kamera bude vykreslovat nové matice projekce. Reprojekce v pozdní fázi transformuje pixely v konečném obrázku tak, aby zohlednily tuto novou perspektivu.

LSR na pixel vs. rovina stabilizace

V závislosti na koncovém bodu zařízení a verzi operačního systému spuštěné na Windows Mixed Reality zařízení se algoritmus Late-Stage Reprojection provede buď po pixelu, nebo prostřednictvím roviny stabilizace.

Hloubky založené na pixelech

Reprojekce na základě hloubky podle pixelů zahrnuje využití hloubkové vyrovnávací paměti k úpravě výstupu obrázku na pixel a tím ke stabilizaci hologramů v různých vzdálenostech. Například koule vzdálená 1 m může být před sloupem, který je vzdálený 10 m. Pixely představující kouli budou mít jinou transformaci než vzdálené pixely představující pilíř, pokud uživatel mírně nakloní hlavu. Reprojekce na pixel bude brát v úvahu tento rozdíl vzdálenosti v každém pixelu, aby bylo přesnější přeprojektování.

Stabilizační rovina

Pokud není možné vytvořit přesnou hloubkovou vyrovnávací paměť pro sdílení s platformou, jiná forma LSR využívá stabilizační rovinu. Všechny hologramy ve scéně budou mít určitou stabilizaci, ale hologramy, které jsou v požadované rovině, obdrží maximální hardwarovou stabilizaci. Bod a normální pro rovinu lze poskytnout platformě prostřednictvím Rozhraní API HolographicSettings.SetFocusPointForFrameposkytované unity.

Formát hloubkové vyrovnávací paměti

Pokud cílíte na HoloLens pro vývoj, důrazně doporučujeme použít 16bitový formát hloubkové vyrovnávací paměti v porovnání s 24bitovou verzí. To může výrazně ušetřit výkon, i když hodnoty hloubky budou mít menší přesnost. Chcete-li kompenzovat nižší přesnost a vyhnout se z-bojů, doporučujeme snížit vzdálenost roviny klipu z výchozí hodnoty 1000m nastavené Unity.

Poznámka

Pokud používáte 16bitový formát hloubky, nebudou požadované efekty vyrovnávací paměti vzorníku fungovat, protože Unity v tomto nastavení nevytvoří vyrovnávací paměť vzorníku . Výběr 24bitového formátu hloubky naopak obecně vytvoří 8bitovou vyrovnávací paměť vzorníku, pokud je to možné na grafické platformě koncového bodu.

Sdílení hloubkové vyrovnávací paměti v Unity

Aby bylo možné využívat hloubkové LSR, musí vývojáři provést dva důležité kroky.

  1. V části Upravit>nastavení> projektuPřehrávač>XR Nastavení>virtuální reality SADY SDK> povolit sdílení hloubkové vyrovnávací paměti
    1. Pokud cílíte na HoloLens, doporučujeme vybrat také 16bitový formát hloubky .
  2. Při vykreslování barev na obrazovce vykreslovat také hloubku

Neprůhlhlé objekty GameObjects v Unity obvykle zapisují do hloubky automaticky. Transparentní & textové objekty ale ve výchozím nastavení nebudou zapisovat do hloubky. Pokud využíváte mrtk Standard Shader nebo Text Mesh Pro, můžete to snadno napravit.

Poznámka

Chcete-li rychle zjistit, které objekty ve scéně nezapisují do vyrovnávací paměti hloubky vizuálně, můžete použít nástroj Vyrovnávací paměť hloubky vykreslení v části Nastavení editoru v konfiguračním profilu MRTK.

Transparentní standardní shader MRTK

U průhledných materiálů pomocí standardního shaderu MRTK vyberte materiál, který chcete zobrazit v okně inspektoru . Potom klikněte na tlačítko Opravit a převeďte materiál na zápis do hloubky (tj. Z-Write On).

Před

Hloubková vyrovnávací paměť před opravou standardního shaderu MRTK

Po

Standardní shader MRTK s pevnou hloubkovou vyrovnávací pamětí

Text Mesh Pro

Pro objekty Text Mesh Pro vyberte TMP GameObject a zobrazte ho v inspektoru. Pod komponentou material přepněte shader pro přiřazený materiál tak, aby používal shader MRTK TextMeshPro.

Oprava hloubkové vyrovnávací paměti textové sítě Pro

Vlastní shader

Pokud píšete vlastní shader, přidejte příznak ZWrite na začátek definice bloku Pass a nakonfigurujte shader tak, aby zapisoval do hloubkové vyrovnávací paměti.

Shader "Custom/MyShader"
{
    SubShader
    {
        Pass
        {
            ...
            ZWrite On
            ...
        }
    }
}
Neprůzná pozadí

Pokud výše uvedené metody nefungují pro daný scénář (tj. použití uživatelského rozhraní Unity), je možné, aby se do vyrovnávací paměti hloubky zapisovaly další objekty. Běžným příkladem je použití textu v uživatelském rozhraní Unity na plovoucím panelu ve scéně. Tím, že panel bude neprůhledný nebo alespoň zapíše do hloubky, pak budou oba texty & panelu stabilizovány platformou, protože jejich hodnoty z jsou tak blízko sebe.

WorldAnchors (HoloLens)

Spolu se zajištěním správných konfigurací pro zajištění vizuální stability je důležité zajistit, aby hologramy zůstaly stabilní ve správných fyzických umístěních. Aby vývojáři informovali platformu o důležitých místech ve fyzickém prostoru, můžou využít funkce WorldAnchors na objektech GameObjects, které potřebují zůstat na jednom místě. WorldAnchor je komponenta přidaná do objektu GameObject, která přebírá absolutní kontrolu nad transformací objektu.

Zařízení, jako je HoloLens, neustále skenují a učí se o prostředí. Tak, jak HoloLens sleduje pohyb & pozici v prostoru, jeho odhady budou aktualizovány a souřadnicový systém Unity upraven. Pokud je například objekt GameObject umístěn 1 m od kamery na začátku, protože HoloLens sleduje prostředí, může si uvědomit, že fyzický bod, ve kterém se gameObject nachází, je ve skutečnosti 1,1 m daleko. To by vedlo k posunu hologramu. Použití objektu WorldAnchor na Objekt GameObject umožní ukotvení řídit transformaci objektu tak, aby objekt zůstal ve správném fyzickém umístění (tj. aktualizace na 1,1 m daleko místo 1m za běhu). Pokud chtějí vývojáři zachovat WorldAnchors v relacích aplikací, můžou k ukládání a načítání worldanchorstore použít WorldAnchorStore.

Poznámka

Po přidání komponenty WorldAnchor do objektu GameObject není možné změnit transformaci objektu GameObject (tj. transform.position = x). Aby vývojář mohli transformaci upravit, musí odebrat objekt WorldAnchor.

WorldAnchor m_anchor;

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

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

Pokud chcete alternativu k ruční práci s ukotvením, podívejte se na nástroje Microsoft World Locking Tools.

Viz také