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:
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.
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.