Compartir a través de


Obtención de HolographicSpace

Nota:

En este artículo se relaciona con las API nativas heredadas de WinRT. Para los nuevos proyectos de aplicaciones nativas, se recomienda usar la API de OpenXR.

La clase HolographicSpace es el portal en el mundo holográfico. Controla la representación inmersiva, proporciona datos de cámara y proporciona acceso a las API de razonamiento espacial. Crearás uno para el HWND de tu aplicación para UWP CoreWindow o la HWND de la aplicación Win32.

Configuración del espacio holográfico

La creación del objeto de espacio holográfico es el primer paso para crear la aplicación de Windows Mixed Reality. Las aplicaciones tradicionales de Windows se representan en una cadena de intercambio de Direct3D creada para la ventana principal de su vista de aplicación. Esta cadena de intercambio se muestra en una pizarra en la interfaz de usuario holográfica. Para que la vista de la aplicación sea holográfica en lugar de una pizarra 2D, cree un espacio holográfico para su ventana principal en lugar de una cadena de intercambio. La presentación de fotogramas holográficos creados por este espacio holográfico coloca la aplicación en modo de representación de pantalla completa.

Para una aplicación para UWP a partir de la plantilla Aplicación Holographic DirectX 11 (Windows universal), busque este código en el método SetWindow en AppView.cpp:

m_holographicSpace = HolographicSpace::CreateForCoreWindow(window);

Si vas a compilar una aplicación Win32 a partir del ejemplo BasicHologram Win32, consulta App::CreateWindowAndHolographicSpace para ver un ejemplo de HWND. A continuación, puede convertirlo en un HWND inmersivo mediante la creación de un holographicSpace asociado:

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

Una vez que haya obtenido un HolographicSpace para UWP CoreWindow o Win32 HWND, HolographicSpace puede controlar cámaras holográficas, crear sistemas de coordenadas y realizar la representación holográfica. El espacio holográfico actual se usa en varios lugares de la plantilla de DirectX:

  • La clase DeviceResources debe obtener información del objeto HolographicSpace para crear el dispositivo Direct3D. Este es el identificador del adaptador DXGI asociado a la pantalla holográfica. La clase HolographicSpace usa el dispositivo Direct3D 11 de la aplicación para crear y administrar recursos basados en dispositivos, como los búferes de reserva para cada cámara holográfica. Si está interesado en ver lo que hace esta función en segundo plano, lo encontrará en DeviceResources.cpp.
  • La función DeviceResources::InitializeUsingHolographicSpace muestra cómo obtener el adaptador buscando el LUID y cómo elegir un adaptador predeterminado cuando no se especifica ningún adaptador preferido.
  • La clase principal de la aplicación usa el espacio holográfico de AppView::SetWindow o App::CreateWindowAndHolographicSpace para las actualizaciones y la representación.

Nota:

Aunque en las secciones siguientes se mencionan nombres de función de la plantilla como AppView::SetWindow que supone que ha iniciado desde la plantilla de aplicación para UWP holográfica, los fragmentos de código que ve se aplicarán igualmente entre aplicaciones para UWP y Win32.

A continuación, profundizaremos en el proceso de configuración del que SetHolographicSpace es responsable de la clase AppMain.

Suscribirse a eventos de cámara, crear y quitar recursos de cámara

El contenido holográfico de la aplicación reside en su espacio holográfico y se ve a través de una o varias cámaras holográficas, que representan diferentes perspectivas en la escena. Ahora que tiene el espacio holográfico, puede recibir datos para cámaras holográficas.

La aplicación debe responder a los eventos CameraAdded mediante la creación de recursos específicos de esa cámara. Un ejemplo de este recurso es la vista de destino de representación del búfer de reserva. Puede ver este código en la función DeviceResources::SetHolographicSpace , a la que llama AppView::SetWindow antes de que la aplicación cree marcos holográficos:

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

La aplicación también debe responder a los eventos CameraRemoved liberando recursos creados para esa cámara.

Desde DeviceResources::SetHolographicSpace:

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

Los controladores de eventos deben completar algún trabajo para que la representación holográfica fluya sin problemas y la representación de la aplicación en absoluto. Lea el código y los comentarios para obtener los detalles: puede buscar OnCameraAdded y OnCameraRemoved en la clase principal para comprender cómo se controla el mapa de m_cameraResources mediante DeviceResources.

En este momento, nos centramos en AppMain y la configuración que hace para permitir que la aplicación conozca las cámaras holográficas. Teniendo esto en cuenta, es importante tener en cuenta los dos requisitos siguientes:

  1. Para el controlador de eventos CameraAdded , la aplicación puede funcionar de forma asincrónica para terminar de crear recursos y cargar recursos para la nueva cámara holográfica. Las aplicaciones que toman más de un marco para completar este trabajo deben solicitar un aplazamiento y completar el aplazamiento después de cargarse de forma asincrónica. Se puede usar una tarea PPL para realizar un trabajo asincrónico. La aplicación debe asegurarse de que está lista para representarse en esa cámara inmediatamente cuando sale del controlador de eventos o cuando finaliza el aplazamiento. Salir del controlador de eventos o completar el aplazamiento indica al sistema que la aplicación ya está lista para recibir fotogramas holográficos con esa cámara incluida.

  2. Cuando la aplicación recibe un evento CameraRemoved , debe liberar todas las referencias al búfer atrás y salir de la función inmediatamente. Esto incluye las vistas de destino de representación y cualquier otro recurso que pueda contener una referencia a IDXGIResource. La aplicación también debe asegurarse de que el búfer de reserva no está asociado como destino de representación, como se muestra en CameraResources::ReleaseResourcesForBackBuffer. Para ayudar a acelerar las cosas, la aplicación puede liberar el búfer atrás y, a continuación, iniciar una tarea para completar de forma asincrónica cualquier otro trabajo de desmontaje para la cámara. La plantilla de aplicación holográfica incluye una tarea PPL que puede usar para este propósito.

Nota:

Si desea determinar cuándo aparece una cámara agregada o quitada en el marco, use las propiedades HolographicFrame AddedCameras y RemovedCameras .

Crear un marco de referencia para el contenido holográfico

El contenido de la aplicación debe colocarse en un sistema de coordenadas espaciales para que se represente en HolographicSpace. El sistema proporciona dos fotogramas principales de referencia, que puede usar para establecer un sistema de coordenadas para los hologramas.

Hay dos tipos de marcos de referencia en Windows Holographic: marcos de referencia conectados al dispositivo y marcos de referencia que permanecen estacionarios a medida que el dispositivo se mueve a través del entorno del usuario. La plantilla de aplicación holográfica usa un marco de referencia estacionario de forma predeterminada; esta es una de las formas más sencillas de representar hologramas bloqueados por el mundo.

Los marcos de referencia estacionarios están diseñados para estabilizar las posiciones cerca de la ubicación actual del dispositivo. Esto significa que las coordenadas posteriores del dispositivo pueden desfase ligeramente en relación con el entorno del usuario, ya que el dispositivo aprende más sobre el espacio alrededor de él. Hay dos maneras de crear un marco de referencia estacionario: adquirir el sistema de coordenadas de la fase espacial o usar spatialLocator predeterminado. Si va a crear una aplicación de Windows Mixed Reality para cascos envolventes, el punto de partida recomendado es la fase espacial. La fase espacial también proporciona información sobre las funcionalidades de los cascos envolventes usados por el jugador. Aquí se muestra cómo usar spatialLocator predeterminado.

El localizador espacial representa el dispositivo Windows Mixed Reality y realiza un seguimiento del movimiento del dispositivo y proporciona sistemas de coordenadas que se pueden entender en relación con su ubicación.

Desde AppMain::OnHolographicDisplayIsAvailableChanged:

spatialLocator = SpatialLocator::GetDefault();

Cree el marco de referencia estacionario una vez cuando se inicie la aplicación. Esto es análogo a definir un sistema de coordenadas del mundo, con el origen colocado en la posición del dispositivo cuando se inicia la aplicación. Este marco de referencia no se mueve con el dispositivo.

Desde AppMain::SetHolographicSpace:

m_stationaryReferenceFrame =
    m_spatialLocator.CreateStationaryFrameOfReferenceAtCurrentLocation();

Todos los marcos de referencia están alineados por gravedad, lo que significa que el eje Y apunta "arriba" en relación con el entorno del usuario. Dado que Windows usa sistemas de coordenadas "a la derecha", la dirección del eje –z coincide con la dirección "hacia delante" que el dispositivo se enfrenta cuando se crea el marco de referencia.

Nota:

Cuando la aplicación requiere una colocación precisa de hologramas individuales, usa spatialAnchor para delimitar el holograma individual a una posición en el mundo real. Por ejemplo, use un delimitador espacial cuando el usuario indique un punto de interés especial. Las posiciones de delimitador no se desfasan, pero se pueden ajustar. De forma predeterminada, cuando se ajusta un delimitador, facilita su posición en su lugar en los siguientes fotogramas después de que se haya producido la corrección. Dependiendo de la aplicación, cuando esto ocurra, es posible que quiera controlar el ajuste de una manera diferente (por ejemplo, aplazando hasta que el holograma esté fuera de la vista). La propiedad RawCoordinateSystem y los eventos RawCoordinateSystemAdjusted permiten estas personalizaciones.

Respuesta a eventos modificados de locabilidad

La representación de hologramas bloqueados por el mundo requiere que el dispositivo se encuentre en el mundo. Esto puede no ser siempre posible debido a condiciones ambientales y, si es así, el usuario puede esperar una indicación visual de la interrupción del seguimiento. Esta indicación visual debe representarse mediante marcos de referencia conectados al dispositivo, en lugar de estacionarse en el mundo.

La aplicación puede solicitar recibir una notificación si el seguimiento se interrumpe por cualquier motivo. Regístrese para el evento LocatabilityChanged para detectar cuándo cambia la capacidad del dispositivo para ubicarse en el mundo. Desde AppMain::SetHolographicSpace:

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

A continuación, use este evento para determinar cuándo los hologramas no se pueden representar estacionarios en el mundo.

Consulte también