Abrufen eines HolographicSpace-Objekts

Hinweis

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

Die HolographicSpace-Klasse ist Ihr Portal in die holografische Welt. Es steuert das immersive Rendering, stellt Kameradaten bereit und ermöglicht den Zugriff auf räumliche Schlussfolgerungs-APIs. Sie erstellen einen für den CoreWindow Ihrer UWP-App oder für den HWND Ihrer Win32-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-Swapkette gerendert, die für das Kernfenster ihrer Anwendungsansicht erstellt wurde. Diese Swapchain wird auf der holografischen Benutzeroberfläche als Schiefer angezeigt. Damit Ihre Anwendung holografisch statt 2D-Schiefer angezeigt wird, erstellen Sie anstelle einer Swapchain einen holografischen Raum für das Kernfenster. Durch die Darstellung holografischer Frames, die von diesem holografischen Raum erstellt werden, wird Ihre App in den Vollbildmodus versetzt.

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

m_holographicSpace = HolographicSpace::CreateForCoreWindow(window);

Wenn Sie eine Win32-Apperstellen, die mit dem Win32-Beispiel basicHologram beginnt, sehen Sie sich App::CreateWindowAndHolographicSpace für ein HWND-Beispiel an. Sie können es dann in einen immersiven HWND konvertieren, indem Sie einen zugeordneten 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 einen HolographicSpace für Ihren UWP CoreWindow oder Win32 HWND erhalten haben, kann holographicSpace holografische Kameras verarbeiten, Koordinatensysteme erstellen und holografisches Rendering durchführen. Der aktuelle holografische Raum wird in der DirectX-Vorlage an mehreren Stellen 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 Backpuffer für jede holografische Kamera. Wenn Sie sich ansehen möchten, was diese Funktion unter der Haube tut, finden Sie sie in DeviceResources.cpp.
  • Die Funktion DeviceResources::InitializeUsingHolographicSpace veranschaulicht, wie Sie den Adapter abrufen, indem Sie die LUID suchen – und wie Sie einen Standardadapter auswählen, wenn kein bevorzugter Adapter angegeben ist.
  • Die Standard-Klasse der App verwendet den holografischen Raum von AppView::SetWindow oder App::CreateWindowAndHolographicSpace für Updates und Renderings.

Hinweis

Die folgenden Abschnitte Erwähnung Funktionsnamen aus der Vorlage wie AppView::SetWindow, die davon ausgehen, dass Sie mit der holografischen UWP-App-Vorlage gestartet haben, gelten die Codeausschnitte, die Sie sehen, gleichermaßen für UWP- und Win32-Apps.

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

Abonnieren von Kameraereignissen, Erstellen und Entfernen von Kameraressourcen

Die holografischen Inhalte Ihrer App befinden sich im holografischen Raum und werden über eine oder mehrere holografische Kameras angezeigt, die unterschiedliche Perspektiven auf die 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 sie alle Ressourcen erstellt, die für diese Kamera spezifisch sind. Ein Beispiel für eine solche Ressource ist die Renderzielansicht des Backpuffers. Sie können diesen Code in der Funktion DeviceResources::SetHolographicSpace sehen, 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.

Aus DeviceResources::SetHolographicSpace:

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

Die Ereignishandler müssen einige Arbeit erledigen, damit holografisches Rendering reibungslos läuft und Ihre App überhaupt gerendert wird. Lesen Sie den Code und kommentare für die Details: Sie können in Ihrer Standard-Klasse nach OnCameraAdded und OnCameraRemoved suchen, um zu verstehen, wie die m_cameraResources-Karte von DeviceResources behandelt wird.

Im Moment konzentrieren wir uns auf AppMain und die Einrichtung, die es tut, damit Ihre App mehr über holografische Kameras erfahren kann. In diesem Sinne ist es wichtig, die folgenden beiden Anforderungen zu beachten:

  1. Für den CameraAdded-Ereignishandler kann die App asynchron arbeiten, um das Erstellen von Ressourcen und das Laden von Ressourcen für die neue holografische Kamera abzuschließen. Apps, die mehr als einen Frame für diese Arbeit in Anspruch nehmen, sollten eine Zurückstellung anfordern und die Zurückstellung nach dem asynchronen Laden abschließen. Eine PPL-Aufgabe kann verwendet werden, um asynchrone Arbeiten 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 Rückpuffer freigeben und die Funktion sofort beenden. Dies umfasst Renderzielsichten und alle anderen Ressourcen, die möglicherweise einen Verweis auf die IDXGIResource enthalten. Die App muss außerdem sicherstellen, dass der Rückpuffer nicht als Renderziel angefügt ist, wie in CameraResources::ReleaseResourcesForBackBuffer gezeigt. Um die Dinge zu beschleunigen, kann Ihre App den Rückpuffer freigeben und dann einen Task starten, um alle anderen Abrissarbeiten für die Kamera asynchron abzuschließen. Die holografische App-Vorlage 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 im Frame angezeigt wird, verwenden Sie die Eigenschaften HolographicFrameAddedCameras und RemovedCameras .

Erstellen eines Referenzrahmens für holografische Inhalte

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

Es gibt zwei Arten von Referenzrahmen in Windows Holographic: Referenzrahmen, die an das Gerät angefügt sind, und Referenzframes, die stationär bleiben, wenn sich das Gerät durch die Umgebung des Benutzers bewegt. Die holografische App-Vorlage verwendet standardmäßig einen stationären Referenzrahmen. Dies ist eine der einfachsten Möglichkeiten, weltgebundene Hologramme zu rendern.

Stationäre Referenzrahmen sind so konzipiert, dass sie Positionen in der Nähe des aktuellen Standorts des Geräts stabilisieren. Dies bedeutet, dass Koordinaten, die weiter vom Gerät entfernt sind, relativ zur Umgebung des Benutzers leicht abdriften können, da das Gerät mehr über den Raum um es herum lernt. Es gibt zwei Möglichkeiten, einen stationären Bezugsrahmen zu erstellen: Abrufen des Koordinatensystems aus der Raumphase 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 Raumbühne gibt auch Informationen über die Funktionen des immersiven Headsets, das vom Spieler getragen wird. Hier wird gezeigt, wie Der SpatialLocator-Standard verwendet wird.

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

Von AppMain::OnHolographicDisplayIsAvailableChanged:

spatialLocator = SpatialLocator::GetDefault();

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

Aus AppMain::SetHolographicSpace:

m_stationaryReferenceFrame =
    m_spatialLocator.CreateStationaryFrameOfReferenceAtCurrentLocation();

Alle Referenzrahmen sind schwerkraftseitig 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ärtsrichtung" zusammen, die das Gerät beim Erstellen des Referenzrahmens zeigt.

Hinweis

Wenn Ihre App eine präzise Platzierung einzelner Hologramme erfordert, verwenden Sie ein SpatialAnchor , um das einzelne Hologramm an einer Position in der realen Welt zu verankern. Verwenden Sie beispielsweise einen Raumanker, wenn der Benutzer einen Punkt angibt, der von besonderem Interesse sein soll. Ankerpositionen driften nicht ab, können aber eingestellt werden. Wenn ein Anker angepasst wird, erleichtert er standardmäßig seine Position über die nächsten frames, nachdem die Korrektur erfolgt ist. Je nach Anwendung können Sie die Anpassung in diesem Fall auf andere Weise behandeln (z. B. durch Zurückstellen, bis das Hologramm außer Sicht ist). Die RawCoordinateSystem-Eigenschaft und rawCoordinateSystemAdjusted-Ereignisse ermöglichen diese Anpassungen.

Reagieren auf geänderte Ereignisse für die Locatability

Das Rendern von weltgebundenen Hologrammen erfordert, dass sich das Gerät in der Welt befindet. Dies ist aufgrund von Umgebungsbedingungen möglicherweise nicht immer möglich, und wenn ja, kann der Benutzer einen visuellen Hinweis auf die Unterbrechung der Nachverfolgung erwarten. Diese visuelle Anzeige muss mithilfe von Referenzrahmen gerendert werden, die an das Gerät angefügt sind, anstatt auf der Welt stationär zu sein.

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 die Fähigkeit des Geräts, sich selbst in der Welt zu finden, ändert. Aus 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 stationär in der Welt gerendert werden können.

Weitere Informationen