Získání HolographicSpace

Poznámka

Tento článek se týká starších nativních rozhraní API WinRT. Pro nové projekty nativních aplikací doporučujeme použít rozhraní OpenXR API.

Třída HolographicSpace je váš portál do holografického světa. Řídí imerzivní vykreslování, poskytuje data kamery a poskytuje přístup k rozhraním API pro prostorové uvažování. Vytvoříte ho pro CoreWindow vaší aplikace pro UPW nebo HWND aplikace Win32.

Nastavení holografického prostoru

Vytvoření objektu holografického prostoru je prvním krokem při vytváření Windows Mixed Reality aplikace. Tradiční aplikace pro Windows se vykreslují do řetězce prohození Direct3D vytvořeného pro základní okno zobrazení aplikace. Tento řetězec prohození se zobrazí na tabuli v holografickém uživatelském rozhraní. Pokud chcete, aby zobrazení aplikace bylo spíše holografické než 2D, vytvořte holografický prostor pro její základní okno místo řetězu prohození. Prezentace holografických snímků vytvořených tímto holografickým prostorem přemísťuje aplikaci do režimu vykreslování na celé obrazovce.

Pro aplikaci pro UPWpočínaje šablonou aplikace Holographic DirectX 11 (Universal Windows) vyhledejte tento kód v metodě SetWindow v AppView.cpp:

m_holographicSpace = HolographicSpace::CreateForCoreWindow(window);

Pokud vytváříte aplikaci Win32počínaje ukázkou BasicHologram Win32, podívejte se na příklad HWND v části App::CreateWindowAndHolographicSpace . Pak ho můžete převést na imerzivní HWND vytvořením přidruženého HolographicSpace:

void App::CreateWindowAndHolographicSpace(HINSTANCE hInstance, int nCmdShow)
{
    // Store the instance handle in our class variable.
    m_hInst = hInstance;

    // Create the window for the HolographicSpace.
    hWnd = CreateWindowW(
        m_szWindowClass, 
        m_szTitle,
        WS_VISIBLE,
        CW_USEDEFAULT, 
        0, 
        CW_USEDEFAULT, 
        0, 
        nullptr, 
        nullptr, 
        hInstance, 
        nullptr);

    if (!hWnd)
    {
        winrt::check_hresult(E_FAIL);
    }

    {
        // Use WinRT factory to create the holographic space.
        using namespace winrt::Windows::Graphics::Holographic;
        winrt::com_ptr<IHolographicSpaceInterop> holographicSpaceInterop =
            winrt::get_activation_factory<HolographicSpace, IHolographicSpaceInterop>();
        winrt::com_ptr<ABI::Windows::Graphics::Holographic::IHolographicSpace> spHolographicSpace;
        winrt::check_hresult(holographicSpaceInterop->CreateForWindow(
            hWnd, __uuidof(ABI::Windows::Graphics::Holographic::IHolographicSpace),
            winrt::put_abi(spHolographicSpace)));

        if (!spHolographicSpace)
        {
            winrt::check_hresult(E_FAIL);
        }

        // Store the holographic space.
        m_holographicSpace = spHolographicSpace.as<HolographicSpace>();
    }

    // The DeviceResources class uses the preferred DXGI adapter ID from the holographic
    // space (when available) to create a Direct3D device. The HolographicSpace
    // uses this ID3D11Device to create and manage device-based resources such as
    // swap chains.
    m_deviceResources->SetHolographicSpace(m_holographicSpace);

    // The main class uses the holographic space for updates and rendering.
    m_main->SetHolographicSpace(hWnd, m_holographicSpace);

    // Show the window. This will activate the holographic view and switch focus
    // to the app in Windows Mixed Reality.
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
}

Jakmile získáte Prostor HolographicSpace pro UWP CoreWindow nebo Win32 HWND, může HolographicSpace pracovat s holografickými kamerami, vytvářet souřadnicové systémy a provádět holografické vykreslování. Aktuální holografický prostor se používá na více místech v šabloně Rozhraní DirectX:

  • Třída DeviceResources potřebuje získat nějaké informace z objektu HolographicSpace k vytvoření zařízení Direct3D. Toto je ID adaptéru DXGI přidružené k holografickému zobrazení. Třída HolographicSpace používá zařízení Direct3D 11 vaší aplikace k vytváření a správě prostředků založených na zařízení, jako jsou back buffers pro každou holografickou kameru. Pokud vás zajímá, co tato funkce dělá pod pokličkou, najdete ji v části DeviceResources.cpp.
  • Funkce DeviceResources::InitializeUsingHolographicSpace ukazuje, jak získat adaptér vyhledáním LUID a jak zvolit výchozí adaptér, pokud není zadán žádný upřednostňovaný adaptér.
  • Hlavní třída aplikace používá holografický prostor z AppView::SetWindow nebo App::CreateWindowAndHolographicSpace pro aktualizace a vykreslování.

Poznámka

Zatímco níže uvedené části zmiňují názvy funkcí ze šablony, jako je AppView::SetWindow , které předpokládají, že jste začali ze šablony holografické aplikace pro UPW, fragmenty kódu, které uvidíte, budou platit stejně pro aplikace pro UPW a Win32.

Dále se podíváme na proces nastavení, za který je sada SetHolographicSpace zodpovědná ve třídě AppMain.

Přihlášení k odběru událostí kamery, vytváření a odebírání prostředků kamery

Holografický obsah vaší aplikace se nachází v holografickém prostoru a zobrazuje se prostřednictvím jedné nebo několika holografických kamer, které představují různé pohledy na scénu. Teď, když máte holografický prostor, můžete přijímat data pro holografické kamery.

Vaše aplikace musí reagovat na události CameraAdded vytvořením všech prostředků, které jsou specifické pro danou kameru. Příkladem takového prostředku je zobrazení cílového vykreslení zpětné vyrovnávací paměti. Tento kód uvidíte ve funkci DeviceResources::SetHolographicSpace , kterou volá AppView::SetWindow , než aplikace vytvoří holografické rámce:

m_cameraAddedToken = m_holographicSpace.CameraAdded(
    std::bind(&AppMain::OnCameraAdded, this, _1, _2));

Vaše aplikace také musí reagovat na události CameraRemoved uvolněním prostředků vytvořených pro danou kameru.

Z DeviceResources::SetHolographicSpace:

m_cameraRemovedToken = m_holographicSpace.CameraRemoved(
    std::bind(&AppMain::OnCameraRemoved, this, _1, _2));

Obslužné rutiny událostí musí dokončit určitou práci, aby holografické vykreslování fungovalo hladce a aby vaše aplikace vůbec vykreslovat. Přečtěte si kód a komentáře k podrobnostem: Ve své hlavní třídě můžete vyhledat OnCameraAdded a OnCameraRemoved, abyste pochopili, jak deviceResources zpracovává mapu m_cameraResources.

Právě teď se zaměřujeme na AppMain a nastavení, které dělá, aby vaše aplikace věděla o holografických fotoaparátech. S ohledem na to je důležité vzít v úvahu následující dva požadavky:

  1. U obslužné rutiny události CameraAdded může aplikace asynchronně pracovat na dokončení vytváření prostředků a načítání prostředků pro novou holografickou kameru. Aplikace, které k dokončení této práce zaberou více než jeden rámec, by měly požádat o odklad a dokončit ho po asynchronním načtení. Úlohu PPL lze použít k asynchronní práci. Aplikace musí zajistit, aby byla připravená k vykreslení na kameru hned, když opustí obslužnou rutinu události nebo když dokončí odložení. Ukončení obslužné rutiny události nebo dokončení odložení oznámí systému, že vaše aplikace je nyní připravena přijímat holografické snímky s danou kamerou.

  2. Když aplikace obdrží událost CameraRemoved , musí uvolnit všechny odkazy na back buffer a okamžitě ukončit funkci. To zahrnuje zobrazení cíle vykreslení a všechny další prostředky, které mohou obsahovat odkaz na IDXGIResource. Aplikace musí také zajistit, aby zpětná vyrovnávací paměť nebyla připojena jako cíl vykreslování, jak je znázorněno v části CameraResources::ReleaseResourcesForBackBuffer. Aby bylo možné věci urychlit, může vaše aplikace uvolnit zadní vyrovnávací paměť a pak spustit úlohu, která asynchronně dokončí všechny ostatní práce s odstraněním obrazu kamery. Šablona holografické aplikace obsahuje úlohu PPL, kterou můžete k tomuto účelu použít.

Poznámka

Pokud chcete zjistit, kdy se na snímku objeví přidaná nebo odebraná kamera, použijte vlastnosti HolographicFrameAddedCameras a RemovedCameras .

Vytvoření referenčního rámce pro holografický obsah

Obsah vaší aplikace musí být umístěn v prostorovém souřadnicovém systému , aby se vykresloval v HolographicSpace. Systém poskytuje dva primární referenční rámce, které můžete použít k vytvoření souřadnicového systému pro hologramy.

Ve Windows Holographic existují dva druhy referenčních rámců: referenční rámce připojené k zařízení a referenční rámce, které zůstávají při pohybu zařízení v uživatelském prostředí nehybné. Šablona holografické aplikace používá ve výchozím nastavení statický referenční rámec. toto je jeden z nejjednodušších způsobů, jak vykreslit světem uzamčené hologramy.

Statické referenční rámy jsou navrženy tak, aby stabilizují polohu v blízkosti aktuálního umístění zařízení. To znamená, že souřadnice dále od zařízení se můžou mírně posunovat vzhledem k prostředí uživatele, protože se zařízení dozví více o prostoru kolem zařízení. Existují dva způsoby, jak vytvořit statický referenční rámec: získat souřadnicový systém z prostorové fáze nebo použít výchozí SpatialLocator. Pokud vytváříte Windows Mixed Reality aplikaci pro imerzivní náhlavní soupravy, doporučeným výchozím bodem je prostorová fáze. Prostorová fáze také poskytuje informace o možnostech imerzivní náhlavní soupravy, kterou hráč nosí. Tady si ukážeme, jak používat výchozí SpatialLocator.

Prostorový lokátor představuje Windows Mixed Reality zařízení a sleduje pohyb zařízení a poskytuje souřadnicové systémy, které lze pochopit vzhledem k jeho umístění.

Z AppMain::OnHolographicDisplayIsAvailableChanged:

spatialLocator = SpatialLocator::GetDefault();

Při spuštění aplikace vytvořte nehybný referenční rámec. To je obdobou definování systému souřadnic světa, kdy je počátek umístěn na pozici zařízení při spuštění aplikace. Tento referenční rámec se se zařízením nepohybuje.

Z AppMain::SetHolographicSpace:

m_stationaryReferenceFrame =
    m_spatialLocator.CreateStationaryFrameOfReferenceAtCurrentLocation();

Všechny referenční rámce jsou zarovnané na gravitaci, což znamená, že osa y směřuje "nahoru" ve vztahu k prostředí uživatele. Vzhledem k tomu, že Systém Windows používá souřadnicové systémy "pravé ruky", směr osy –z se shoduje se směrem dopředu, kterým je zařízení při vytvoření referenčního rámce.

Poznámka

Pokud vaše aplikace vyžaduje přesné umístění jednotlivých hologramů, použijte SpatialAnchor k ukotvení jednotlivých hologramů na pozici v reálném světě. Prostorovou kotvu použijte například v případě, že uživatel označí bod, který má být zajímavý. Pozice ukotvení se neodklánějí, ale je možné je upravit. Když je kotva ve výchozím nastavení upravena, po provedení opravy zmírní její umístění na další několik snímků. V závislosti na vaší aplikaci můžete chtít úpravu zpracovat jiným způsobem (např. tím, že ji odložíte, dokud hologram nebude vidět). RawCoordinateSystem vlastnost a RawCoordinateSystemAdjusted události umožňují tato přizpůsobení.

Reakce na změněné události lokalizovatelnosti

Vykreslování hologramů s uzamčeným světem vyžaduje, aby se zařízení samo nachytá ve světě. To nemusí být vždy možné kvůli podmínkám prostředí, a pokud ano, může uživatel očekávat vizuální indikaci přerušení sledování. Tato vizuální indikace musí být vykreslována pomocí referenčních rámců připojených k zařízení, místo aby byly nehybné pro svět.

Vaše aplikace může požádat o oznámení, pokud je sledování z jakéhokoli důvodu přerušeno. Zaregistrujte se k události LocatabilityChanged, abyste zjistili, kdy se změní schopnost zařízení lokalizovat se ve světě. Z AppMain::SetHolographicSpace:

m_locatabilityChangedToken = m_spatialLocator.LocatabilityChanged(
    std::bind(&HolographicApp6Main::OnLocatabilityChanged, this, _1, _2));

Tuto událost pak použijte k určení, kdy hologramy nelze vykreslit ve statickém prostředí.

Viz také