Freigeben über


Abrufen eines HolographicSpace-Objekts

Hinweis

Dieser Artikel bezieht sich auf die älteren winRT nativen APIs. Für neue native App-Projekte empfehlen wir die Verwendung der OpenXR-API.

Die HolographicSpace-Klasse ist Ihr Portal in der holografischen Welt. Es steuert das immersive Rendering, stellt Kameradaten bereit und bietet Zugriff auf räumliche Grunderstellungs-APIs. Sie erstellen eines für die CoreWindow - oder Win32-App-HWND Ihrer UWP-App.

Einrichten des holografischen Raums

Das Erstellen des holografischen Raumobjekts ist der erste Schritt bei der Erstellung Ihrer Windows Mixed Reality-App. Herkömmliche Windows-Apps werden in einer Direct3D-Swapchain gerendert, die für das Kernfenster ihrer Anwendungsansicht erstellt wurde. Diese Swapchain wird auf einer Schiefer in der holografischen Benutzeroberfläche angezeigt. Erstellen Sie einen holografischen Raum für das Kernfenster anstelle einer Swapchain, um ihre Anwendungsansicht holografische Statt einer 2D-Schieferansicht zu erstellen. Wenn Sie holografische Frames präsentieren, die von diesem holografischen Raum erstellt werden, wird Ihre App in den Modus für das Rendering im Vollbildmodus versetzt.

Suchen Sie für eine UWP-App ab der Vorlage "Holographic DirectX 11-App (Universelle Windows-App)" in der SetWindow-Methode in AppView.cpp nach diesem Code:

m_holographicSpace = HolographicSpace::CreateForCoreWindow(window);

Wenn Sie ab dem BasicHologram Win32-Beispiel eine Win32-App erstellen, schauen Sie sich "App::CreateWindowAndHolographicSpace" für ein HWND-Beispiel an. Sie können es dann in einen immersiven HWND konvertieren, indem Sie ein zugeordnetes HolographicSpace erstellen:

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

Nachdem Sie ein HolographicSpace für Ihr UWP CoreWindow oder Win32 HWND erhalten haben, kann holographicSpace holografische Kameras verarbeiten, Koordinatensysteme erstellen und holografisches Rendering durchführen. Der aktuelle holografische Raum wird an mehreren Stellen in der DirectX-Vorlage verwendet:

  • Die DeviceResources-Klasse muss einige Informationen aus dem HolographicSpace-Objekt abrufen, um das Direct3D-Gerät zu erstellen. Dies ist die DXGI-Adapter-ID, die der holografischen Anzeige zugeordnet ist. Die HolographicSpace-Klasse verwendet das Direct3D 11-Gerät Ihrer App, um gerätebasierte Ressourcen zu erstellen und zu verwalten, z. B. die Hintergrundpuffer für jede holografische Kamera. Wenn Sie wissen möchten, was diese Funktion unter der Haube tut, finden Sie sie in DeviceResources.cpp.
  • Die Funktion DeviceResources::InitializeUsingHolographicSpace veranschaulicht, wie der Adapter durch Nachschlagen der LUID erhalten wird und wie Sie einen Standardadapter auswählen, wenn kein bevorzugter Adapter angegeben wird.
  • Die Hauptklasse der App verwendet den holografischen Raum aus AppView::SetWindow oder App::CreateWindowAndHolographicSpace für Updates und Rendering.

Hinweis

Während in den folgenden Abschnitten Funktionsnamen aus der Vorlage wie AppView::SetWindow erwähnt werden, die davon ausgehen, dass Sie mit der holografischen UWP-App-Vorlage begonnen haben, gelten die codeausschnitte, die Sie sehen, gleichmäßig für UWP- und Win32-Apps.

Als Nächstes werden wir uns mit dem Setupprozess befasst, für den SetHolographicSpace in der AppMain-Klasse verantwortlich ist.

Abonnieren von Kameraereignissen, Erstellen und Entfernen von Kameraressourcen

Der holografische Inhalt Ihrer App befindet sich im holografischen Raum und wird durch eine oder mehrere holografische Kameras angezeigt, die unterschiedliche Perspektiven auf der Szene darstellen. Nachdem Sie nun über den holografischen Raum verfügen, können Sie Daten für holografische Kameras empfangen.

Ihre App muss auf CameraAdded-Ereignisse reagieren, indem alle Ressourcen erstellt werden, die für diese Kamera spezifisch sind. Ein Beispiel für eine solche Ressource ist die Hintergrundpuffer-Renderzielansicht. Dieser Code wird in der DeviceResources::SetHolographicSpace-Funktion angezeigt, die von AppView::SetWindow aufgerufen wird, bevor die App holografische Frames erstellt:

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

Ihre App muss auch auf CameraRemoved-Ereignisse reagieren, indem Ressourcen freigegeben werden, die für diese Kamera erstellt wurden.

Von DeviceResources::SetHolographicSpace:

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

Die Ereignishandler müssen einige Aufgaben ausführen, um das holografische Rendering reibungslos zu halten, und das Rendern der App überhaupt. Lesen Sie den Code und die Kommentare zu den Details: Sie können nach OnCameraAdded und OnCameraRemoved in Ihrer Hauptklasse suchen, um zu verstehen, wie die m_cameraResources Karte von DeviceResources behandelt wird.

Im Moment konzentrieren wir uns auf AppMain und das Setup, das es tut, damit Ihre App über holografische Kameras informiert. Dabei ist es wichtig, die folgenden beiden Anforderungen zu beachten:

  1. Für den CameraAdded-Ereignishandler kann die App asynchron arbeiten, um die Erstellung von Ressourcen und das Laden von Ressourcen für die neue holografische Kamera abzuschließen. Apps, die mehr als einen Frame verwenden, um diese Arbeit abzuschließen, sollten eine Verzögerung anfordern und die Verzögerung nach dem asynchronen Laden abschließen. Eine PPL-Aufgabe kann verwendet werden, um asynchrone Arbeit zu erledigen. Ihre App muss sicherstellen, dass sie sofort auf diese Kamera gerendert werden kann, wenn sie den Ereignishandler beendet oder die Verzögerung abgeschlossen hat. Wenn Sie den Ereignishandler beenden oder die Verzögerung abschließen, wird dem System mitgeteilt, dass Ihre App jetzt bereit ist, holografische Frames mit dieser kamera zu empfangen.

  2. Wenn die App ein CameraRemoved-Ereignis empfängt , muss sie alle Verweise auf den Hintergrundpuffer freigeben und die Funktion sofort beenden. Dazu gehören Renderzielansichten und alle anderen Ressourcen, die einen Verweis auf die IDXGIResource enthalten können. Die App muss auch sicherstellen, dass der Hintergrundpuffer nicht als Renderziel angefügt ist, wie in "CameraResources::ReleaseResourcesForBackBuffer" dargestellt. Um Dies zu beschleunigen, kann Ihre App den Hintergrundpuffer freigeben und dann eine Aufgabe starten, um alle anderen Abrissarbeiten für die Kamera asynchron abzuschließen. Die Vorlage für holografische Apps enthält eine PPL-Aufgabe, die Sie für diesen Zweck verwenden können.

Hinweis

Wenn Sie ermitteln möchten, wann eine hinzugefügte oder entfernte Kamera auf dem Frame angezeigt wird, verwenden Sie die Eigenschaften HolographicFrame AddedCameras und RemovedCameras .

Erstellen eines Referenzrahmens für holografische Inhalte

Der Inhalt Ihrer App muss in einem räumlichen Koordinatensystem positioniert werden, das im HolographicSpace gerendert werden soll. Das System stellt zwei primäre Referenzframes bereit, mit denen Sie ein Koordinatensystem für Ihre Hologramme einrichten können.

Es gibt zwei Arten von Referenzframes in Windows Holographic: Referenzframes, die an das Gerät angefügt sind, und Referenzframes, die bleiben, während das Gerät in der Umgebung des Benutzers bewegt wird. Die Vorlage für holografische Apps verwendet standardmäßig einen stationären Referenzrahmen; Dies ist eine der einfachsten Methoden zum Rendern von weltgesperrten Hologrammen.

Stationäre Referenzframes sind für die Stabilisierung von Positionen in der Nähe der aktuellen Position des Geräts konzipiert. Dies bedeutet, dass koordinaten von dem Gerät leicht relativ zur Umgebung des Benutzers verdrift werden können, da das Gerät mehr über den Raum um sie herum lernt. Es gibt zwei Möglichkeiten zum Erstellen eines stationären Referenzrahmens: Abrufen des Koordinatensystems aus der räumlichen Phase oder Verwenden des Standardmäßigen SpatialLocator. Wenn Sie eine Windows Mixed Reality-App für immersive Headsets erstellen, ist der empfohlene Ausgangspunkt die räumliche Phase. Die räumliche Stufe bietet auch Informationen über die Funktionen des immersiven Headsets, das vom Spieler getragen wird. Hier erfahren Sie, wie Sie den Standardmäßigen SpatialLocator verwenden.

Der räumliche Locator stellt das Windows Mixed Reality-Gerät dar und verfolgt die Bewegung des Geräts und stellt Koordinatensysteme bereit, die relativ zu ihrer Position verstanden werden können.

Von AppMain::OnHolographicDisplayIsAvailableChanged:

spatialLocator = SpatialLocator::GetDefault();

Erstellen Sie den stationären Referenzframe einmal, wenn die App gestartet wird. Dies entspricht der Definition eines Weltkoordinatensystems, wobei der Ursprung an der Position des Geräts beim Starten der App platziert wird. Dieser Referenzframe wird nicht mit dem Gerät verschoben.

Von AppMain::SetHolographicSpace:

m_stationaryReferenceFrame =
    m_spatialLocator.CreateStationaryFrameOfReferenceAtCurrentLocation();

Alle Referenzframes sind schwerkraft ausgerichtet, was bedeutet, dass die Y-Achse in Bezug auf die Umgebung des Benutzers "nach oben" zeigt. Da Windows "rechtshändige" Koordinatensysteme verwendet, fällt die Richtung der –z-Achse mit der "Vorwärts"-Richtung zusammen, die das Gerät beim Erstellen des Referenzframes vorsieht.

Hinweis

Wenn Ihre App eine präzise Platzierung einzelner Hologramme erfordert, verwenden Sie einen SpatialAnchor , um das einzelne Hologramm an einer Position in der realen Welt zu verankern. Verwenden Sie z. B. einen räumlichen Anker, wenn der Benutzer angibt, dass ein Punkt von besonderem Interesse ist. Ankerpositionen driften nicht, können aber angepasst werden. Wenn ein Anker angepasst wird, wird die Position standardmäßig über die nächsten Frames nach dem Korrigieren vereinfacht. Je nach Anwendung möchten Sie die Anpassung ggf. anders behandeln (z. B. indem Sie sie zurückstellen, bis das Hologramm nicht sichtbar ist). Die RawCoordinateSystem-Eigenschaft und rawCoordinateSystemAdjusted-Ereignisse ermöglichen diese Anpassungen.

Reagieren auf verwertbarkeitsänderungsereignisse

Das Rendern von weltgesperrten Hologrammen erfordert, dass sich das Gerät in der Welt auffindet. Dies ist möglicherweise aufgrund von Umgebungsbedingungen nicht immer möglich, und wenn ja, erwartet der Benutzer möglicherweise einen visuellen Hinweis auf die Nachverfolgungsunterbrechung. Diese visuelle Anzeige muss mithilfe von Referenzframes gerendert werden, die an das Gerät angeschlossen sind, anstatt auf der Welt zu bleiben.

Ihre App kann eine Benachrichtigung anfordern, wenn die Nachverfolgung aus irgendeinem Grund unterbrochen wird. Registrieren Sie sich für das LocatabilityChanged-Ereignis, um zu erkennen, wann sich das Gerät in der Welt befindet. Von AppMain::SetHolographicSpace:

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

Verwenden Sie dann dieses Ereignis, um zu bestimmen, wann Hologramme nicht in der Welt gerendert werden können.

Weitere Informationen