HolographicSpace beszerzése

Megjegyzés

Ez a cikk az örökölt WinRT natív API-kkal kapcsolatos. Új natív alkalmazásprojektekhez az OpenXR API használatát javasoljuk.

A HolographicSpace osztály a portál a holografikus világba. A modern renderelést vezérli, kameraadatokat biztosít, és hozzáférést biztosít a térbeli érvelési API-khoz. Egyet az UWP-alkalmazás CoreWindow vagy a Win32-alkalmazás HWND-jének létrehozásához fog létrehozni.

A holografikus tér beállítása

A holografikus térobjektum létrehozása az első lépés a Windows Mixed Reality alkalmazás létrehozásához. A hagyományos Windows-alkalmazások az alkalmazásnézet alapvető ablakához létrehozott Direct3D felcserélési láncba jelennek meg. Ez a felcserélési lánc egy lappal jelenik meg a holografikus felhasználói felületen. Ha 2D-s tábla helyett holografikus nézetet szeretne megjeleníteni az alkalmazás számára, hozzon létre egy holografikus helyet a fő ablakához a felcserélési lánc helyett. A holografikus tér által létrehozott holografikus keretek bemutatása teljes képernyős megjelenítési módba helyezi az alkalmazást.

A Holographic DirectX 11 Alkalmazás (Univerzális Windows) sablonból indulóUWP-alkalmazások esetén keresse meg ezt a kódot az AppView.cpp SetWindow metódusában:

m_holographicSpace = HolographicSpace::CreateForCoreWindow(window);

Ha a BasicHologram Win32-mintából kiindulva hoz létre Win32-alkalmazást, tekintse meg az App::CreateWindowAndHolographicSpace című témakört egy HWND-példáért. Ezután egy társított HolographicSpace létrehozásával modern HWND-vé alakíthatja át:

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);
}

Miután beszerezte a HolographicSpace-t az UWP CoreWindow vagy a Win32 HWND számára, a HolographicSpace képes holografikus kamerák kezelésére, koordinátarendszerek létrehozására és holografikus renderelésre. Az aktuális holografikus tér több helyen is használható a DirectX-sablonban:

  • A DeviceResources osztálynak adatokat kell lekérnie a HolographicSpace objektumból a Direct3D-eszköz létrehozásához. Ez a holografikus kijelzőhöz társított DXGI-adapter azonosítója. A HolographicSpace osztály az alkalmazás Direct3D 11-eszközével hoz létre és kezel eszközalapú erőforrásokat, például az egyes holografikus fényképezőgépek háttérpuffereit. Ha szeretné látni, hogy ez a függvény mit csinál a motorháztető alatt, a DeviceResources.cpp fájlban találja meg.
  • A DeviceResources::InitializeUsingHolographicSpace függvény bemutatja, hogyan szerezheti be az adaptert a LUID alapján– és hogyan választhat alapértelmezett adaptert, ha nincs megadva előnyben részesített adapter.
  • Az alkalmazás fő osztálya az AppView::SetWindow vagy az App::CreateWindowAndHolographicSpace holografikus területét használja a frissítésekhez és a rendereléshez.

Megjegyzés

Bár az alábbi szakaszok a sablonban szereplő függvényneveket említik, például az AppView::SetWindow függvényeket, amelyek feltételezik, hogy a holografikus UWP-alkalmazássablonból indult, a megjelenő kódrészletek az UWP- és Win32-alkalmazásokra egyaránt érvényesek lesznek.

A következő lépésben bemutatjuk azt a beállítási folyamatot, amelyért a SetHolographicSpace felel az AppMain osztályban.

Feliratkozás kameraeseményekre, kameraerőforrások létrehozása és eltávolítása

Az alkalmazás holografikus tartalma a holografikus térben található, és egy vagy több holografikus kamerán keresztül tekinthető meg, amelyek a jelenet különböző perspektíváit képviselik. Most, hogy rendelkezik a holografikus térrel, adatokat kaphat a holografikus kamerákról.

Az alkalmazásnak válaszolnia kell a CameraAdded eseményekre az adott kamerára jellemző erőforrások létrehozásával. Ilyen erőforrás például a háttérpuffer renderelési célnézete. Ezt a kódot az AppView::SetWindow által meghívott DeviceResources::SetHolographicSpace függvényben láthatja, mielőtt az alkalmazás holografikus kereteket hoz létre:

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

Az alkalmazásnak válaszolnia kell a CameraRemoved eseményekre is, ha felszabadítja az adott kamerához létrehozott erőforrásokat.

From DeviceResources::SetHolographicSpace:

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

Az eseménykezelőknek el kell végeznie néhány munkát, hogy a holografikus renderelés zökkenőmentesen folyjon, és az alkalmazás egyáltalán rendereljen. Olvassa el a kódot és a megjegyzéseket a részletekért: a fő osztályban az OnCameraAdded és az OnCameraRemoved kifejezésre kattintva megtudhatja, hogyan kezeli a DeviceResources a m_cameraResources térképet.

Jelenleg az AppMain-ra és annak beállítására összpontosítunk, hogy az alkalmazás tudjon a holografikus kamerákról. Ezt szem előtt tartva fontos figyelembe venni a következő két követelményt:

  1. A CameraAdded eseménykezelő esetében az alkalmazás aszinkron módon dolgozhat az erőforrások létrehozásának és az új holografikus kamera eszközeinek betöltésének befejezésén. Azok az alkalmazások, amelyek egynél több keretet vesznek igénybe a munka elvégzéséhez, halasztást kell kérniük, és az aszinkron betöltés után be kell fejezni a halasztást. A PPL-feladat aszinkron munka elvégzésére használható. Az alkalmazásnak gondoskodnia kell arról, hogy azonnal megjelenítse a kamerát, amikor kilép az eseménykezelőből, vagy amikor befejezi a halasztást. Ha kilép az eseménykezelőből vagy befejezi a halasztást, az azt jelzi a rendszernek, hogy az alkalmazás készen áll a holografikus keretek fogadására a kamerával együtt.

  2. Amikor az alkalmazás CameraRemoved eseményt kap, fel kell szabadítania a háttérpufferre mutató összes hivatkozást, és azonnal ki kell lépnie a függvényből. Ide tartoznak a renderelési célnézetek és minden más erőforrás, amely az IDXGIResource-ra mutató hivatkozást tartalmazhat. Az alkalmazásnak azt is biztosítania kell, hogy a háttérpuffer ne legyen renderelési célként csatolva, ahogy az a CameraResources::ReleaseResourcesForBackBuffer című témakörben látható. A sebesség felgyorsítása érdekében az alkalmazás felszabadíthatja a háttérpuffert, majd elindíthat egy feladatot, hogy aszinkron módon végezze el a kamera egyéb leállási feladatait. A holografikus alkalmazássablon tartalmaz egy PPL-feladatot, amelyet erre a célra használhat.

Megjegyzés

Ha meg szeretné állapítani, hogy mikor jelenik meg egy hozzáadott vagy eltávolított kamera a kereten, használja a HolographicFrameAddedCameras és a RemovedCameras tulajdonságokat.

Referenciakeret létrehozása a holografikus tartalomhoz

Az alkalmazás tartalmát egy térbeli koordináta-rendszerben kell elhelyezni, hogy a HolographicSpace-ben jelenjen meg. A rendszer két elsődleges referenciakeretet biztosít, amelyekkel koordinátarendszert hozhat létre a hologramokhoz.

A Windows Holographic rendszerben kétféle referenciakeret létezik: az eszközhöz csatolt referenciakeretek, és olyan referenciakeretek, amelyek helyhez kötöttek maradnak, amikor az eszköz áthalad a felhasználó környezetén. A holografikus alkalmazássablon alapértelmezés szerint egy helyhez kötött referenciakeretet használ; ez az egyik legegyszerűbb módja a világzárolt hologramok megjelenítésének.

A helyhez kötött referenciakeretek úgy vannak kialakítva, hogy stabilizálják az eszköz aktuális helyének közelében lévő helyzeteket. Ez azt jelenti, hogy az eszköztől távolabbi koordináták kissé eltérhetnek a felhasználó környezetétől, mivel az eszköz többet tud meg a körülötte lévő térről. Helyhez kötött referenciakeretet kétféleképpen hozhat létre: a koordinátarendszert a térbeli szakaszból szerezheti be, vagy használhatja az alapértelmezett SpatialLocatort. Ha Windows Mixed Reality alkalmazást hoz létre modern headsetekhez, az ajánlott kiindulási pont a térbeli szakasz. A térbeli szakasz a játékos által viselt modern headset képességeiről is nyújt információkat. Itt bemutatjuk, hogyan használhatja az alapértelmezett SpatialLocatort.

A térbeli lokátor az Windows Mixed Reality eszközt jelöli, nyomon követi az eszköz mozgását, és olyan koordinátarendszereket biztosít, amelyek a helyhez viszonyítva értelmezhetők.

Az AppMain::OnHolographicDisplayIsAvailableChanged fájlból:

spatialLocator = SpatialLocator::GetDefault();

Az alkalmazás indításakor egyszer hozza létre a helyhez kötött referenciakeretet. Ez hasonló egy világkoordináta-rendszer meghatározásához, amelynek forrása az alkalmazás indításakor az eszköz helyére kerül. Ez a referenciakeret nem mozog az eszközzel.

Az AppMain::SetHolographicSpace fájlból:

m_stationaryReferenceFrame =
    m_spatialLocator.CreateStationaryFrameOfReferenceAtCurrentLocation();

Minden referenciakeret gravitációval van igazítva, ami azt jelenti, hogy az y tengely a felhasználó környezetéhez képest "felfelé" mutat. Mivel a Windows "jobbkezes" koordinátarendszereket használ, a –z tengely iránya egybeesik azzal az "előre" iránysal, amellyel az eszköz a referenciakeret létrehozásakor szembesül.

Megjegyzés

Ha az alkalmazás az egyes hologramok pontos elhelyezését igényli, a SpatialAnchor használatával rögzítheti az egyes hologramokat a valós helyzethez. Használjon például egy térbeli horgonyt, ha a felhasználó egy különleges érdeklődésre számot tartó pontot jelez. A horgonypozíciók nem sodródnak, de módosíthatók. Alapértelmezés szerint a horgony beállításakor a következő néhány képkocka helyére kerül a korrekció után. Az alkalmazástól függően előfordulhat, hogy a módosítást más módon szeretné kezelni (például halasztja, amíg a hologram nem látható). A RawCoordinateSystem tulajdonság és a RawCoordinateSystemAdjusted események lehetővé teszik ezeket a testreszabásokat.

Válasz a helyváltoztatás módosult eseményeire

A világra zárolt hologramok rendereléséhez az eszköznek meg kell találnia magát a világban. Előfordulhat, hogy ez a környezeti feltételek miatt nem mindig lehetséges, és ha igen, a felhasználó vizuálisan jelezheti a nyomon követés megszakadását. Ezt a vizuális jelzést az eszközhöz csatolt referenciakeretekkel kell megjeleníteni a világhoz való helyhez kötött helyett.

Az alkalmazás kérheti, hogy értesítést kapjon, ha a nyomon követés valamilyen okból megszakad. Regisztráljon a LocatabilityChanged eseményre, hogy észlelje, ha az eszköz képes megtalálni magát a világban. Az AppMain::SetHolographicSpace fájlból:

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

Ezután ezt az eseményt használva állapítsa meg, hogy a hologramok mikor nem jeleníthetők meg helyhez kötötten a világ számára.

Lásd még