Sdílet prostřednictvím


Získání HolographicSpace

Poznámka:

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

Třída HolographicSpace je vaším portálem do holografického světa. Řídí imerzivní vykreslování, poskytuje data z fotoaparátu a poskytuje přístup k rozhraním API prostorového odůvodnění. Vytvoříte ji pro CoreWindow vaší aplikace pro UPW nebo HWND vaší aplikace Win32.

Nastavení holografického prostoru

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

Pro aplikaci pro UPW počí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 Win32 od ukázky BasicHologram Win32, podívejte se na příklad HWND na App::CreateWindowAndHolographicSpace. Potom 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 HolographicSpace pro UWP CoreWindow nebo Win32 HWND, holographicSpace dokáže zpracovávat holografické kamery, 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ě DirectX:

  • Třída DeviceResources potřebuje získat některé informace z objektu HolographicSpace k vytvoření zařízení Direct3D. Toto je ID adaptéru DXGI přidružené k holografickému displeji. 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ích, jako jsou vyrovnávací paměti pro každou holografickou kameru. Pokud vás zajímá, co tato funkce dělá pod kapotou, najdete ji v 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ásledující oddíly zmíní názvy funkcí ze šablony, jako je AppView::SetWindow , které předpokládají, že jste začali ze šablony holografické aplikace UPW, fragmenty kódu, které vidíte, budou platit rovnoměrně napříč aplikacemi pro UPW a Win32.

Dále se podíváme na proces nastavení, který SetHolographicSpace zodpovídá za třídu AppMain.

Přihlášení k odběru událostí fotoaparátu, vytvoření a odebrání prostředků fotoaparátu

Holografický obsah vaší aplikace se nachází v holografickém prostoru a zobrazuje se prostřednictvím jedné nebo více holografických fotoaparátů, které představují různé perspektivy na scéně. 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 prostředků specifických pro danou kameru. Příkladem takového prostředku je zobrazení cíle vykreslení vyrovnávací paměti zpět. Tento kód můžete zobrazit ve funkci DeviceResources::SetHolographicSpace , kterou volal AppView::SetWindow , než aplikace vytvoří všechny holografické rámce:

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

Vaše aplikace také potřebuje 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í probíhalo hladce a vaše aplikace vykresluje vůbec. Přečtěte si kód a komentáře k podrobnostem: V hlavní třídě můžete vyhledat OnCameraAdded a OnCameraRemoved, abyste pochopili, jak m_cameraResources mapu zpracovává DeviceResources.

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

  1. U obslužné rutiny události CameraAdded může aplikace asynchronně dokončit vytváření prostředků a načítání prostředků pro novou holografickou kameru. Aplikace, které k dokončení této práce přebírají více než jeden rámec, by měly požadovat odložení a dokončit odložení po asynchronním načtení. K asynchronní práci lze použít úlohu PPL. Aplikace musí zajistit, aby byla připravená k vykreslení do této kamery hned po ukončení obslužné rutiny události nebo po dokončení odložení. Ukončení obslužné rutiny události nebo dokončení odložení informuje systém, že vaše aplikace je teď připravená přijímat holografické snímky s danou kamerou.

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

Poznámka:

Pokud chcete určit, kdy se přidaná nebo odebraná kamera zobrazuje na snímku, použijte vlastnosti HolographicFrame AddedCameras 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í rámce odkazu, 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 procházení zařízení v uživatelském prostředí statické. Šablona holografické aplikace používá ve výchozím nastavení statický referenční rámec; toto je jeden z nejjednodušších způsobů vykreslení světem uzamčených hologramů.

Statické referenční rámy jsou navrženy tak, aby stabilizovat pozice 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ě lišit vzhledem k prostředí uživatele, protože se zařízení dozví více o prostoru kolem něj. Existují dva způsoby, jak vytvořit statický rámec odkazu: získat souřadnicový systém z prostorové fáze nebo použít výchozí SpatialLocator. Pokud vytváříte aplikaci Windows Mixed Reality pro imerzivní náhlavní soupravy, doporučeným výchozím bodem je prostorová fáze. Prostorová fáze také poskytuje informace o schopnostech imerzivní náhlavní soupravy opotřebované přehrávačem. Tady si ukážeme, jak použít výchozí prostorový lokátor.

Prostorový lokátor představuje zařízení s Windows Mixed Reality a sleduje pohyb zařízení a poskytuje souřadnicové systémy, kterým lze porozumět vzhledem k jeho poloze.

Z AppMain::OnHolographicDisplayIsAvailableChanged:

spatialLocator = SpatialLocator::GetDefault();

Jakmile se aplikace spustí, vytvořte statický referenční rámec jednou. To je analogické k definování světového souřadnicového systému s původem umístěným na pozici zařízení při spuštění aplikace. Tento referenční rámec se nepřesune se zařízením.

Z AppMain::SetHolographicSpace:

m_stationaryReferenceFrame =
    m_spatialLocator.CreateStationaryFrameOfReferenceAtCurrentLocation();

Všechny referenční rámce jsou zarovnané závažností, což znamená, že osa y odkazuje "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, ke kterému zařízení dochází při vytvář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ě. Například použijte prostorovou ukotvení, když uživatel označuje bod, který má být zvláštním zájmem. Pozice ukotvení se nedají posunovat, ale lze je upravit. Ve výchozím nastavení se při úpravě ukotvení zjednoduší jeho umístění nad dalšími několika snímky po dokončení opravy. V závislosti na vaší aplikaci můžete chtít úpravu zpracovat jiným způsobem (např. odložením, dokud nebude hologram mimo zobrazení). RawCoordinateSystem vlastnost a RawCoordinateSystemAdjusted události umožňují tato přizpůsobení.

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

Vykreslování světem uzamčených hologramů vyžaduje, aby se zařízení na světě našli. To nemusí být vždy možné z důvodu podmínek prostředí, a pokud ano, uživatel může očekávat vizuální označení přerušení sledování. Tato vizuální indikace se musí vykreslit pomocí referenčních snímků připojených k zařízení, a nikoli jako statických na světě.

Aplikace může požádat o oznámení, pokud je sledování přerušeno z jakéhokoli důvodu. Zaregistrujte se pro událost LocatabilityChanged, abyste zjistili, kdy se schopnost zařízení ve světě změnit. 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 na světě.

Viz také