Obtención de HolographicSpace

Nota

Este artículo está relacionado con las API nativas heredadas de WinRT. En el caso de 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 coreWindow de tu aplicación para UWP o para el 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 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 UWPa 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 Win32a partir del ejemplo BasicHologram Win32, consulta App::CreateWindowAndHolographicSpace para obtener un ejemplo de HWND. Después, puede convertirla 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 hayas obtenido un HolographicSpace para UWP CoreWindow o Win32 HWND, HolographicSpace puede controlar las 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, la 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 las aplicaciones para UWP y Win32.

A continuación, profundizaremos en el proceso de instalación de que SetHolographicSpace es responsable de en 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 las 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 los 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 deviceResources controla el mapa de m_cameraResources.

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 tardan más de un fotograma en 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 de reserva y salir de la función inmediatamente. Esto incluye 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 fin.

Nota

Si quieres determinar cuándo aparece una cámara agregada o eliminada en el marco, usa las propiedades HolographicFrameAddedCameras 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 representarse en holographicSpace. El sistema proporciona dos fotogramas principales de referencia, que puedes 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 estáticos 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.

Las tramas de referencia fijas están diseñadas para estabilizar las posiciones cerca de la ubicación actual del dispositivo. Esto significa que las coordenadas más allá del dispositivo pueden desplazarse ligeramente en relación con el entorno del usuario, ya que el dispositivo aprende más sobre el espacio que lo rodea. Hay dos maneras de crear un marco fijo de referencia: adquirir el sistema de coordenadas de la fase espacial o usar el 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 funciones del casco envolvente usado 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();

Crea el marco de referencia estacionario una vez cuando se inicia 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 "hacia 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" a la que se enfrenta el dispositivo 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 del 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 desee 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.

Responder a eventos modificados de locabilidad

La representación de hologramas bloqueados por el mundo requiere que el dispositivo se ubique en el mundo. Esto puede no ser siempre posible debido a las condiciones del entorno 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 estáticos para el mundo.

La aplicación puede solicitar recibir notificaciones si se interrumpe el seguimiento 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 no se pueden representar hologramas estacionarios en el mundo.

Consulte también