Obter um HolographicSpace

Nota

Este artigo está relacionado com as APIs nativas do WinRT legadas. Para novos projetos de aplicações nativas, recomendamos que utilize a API OpenXR.

A classe HolographicSpace é o seu portal no mundo holográfico. Controla a composição envolvente, fornece dados da câmara e fornece acesso a APIs de raciocínio espacial. Irá criar um para o CoreWindow da sua aplicação UWP ou para o HWND da sua aplicação Win32.

Configurar o espaço holográfico

Criar o objeto de espaço holográfico é o primeiro passo para tornar a sua aplicação Windows Mixed Reality. As aplicações tradicionais do Windows são compostas por uma cadeia de troca Direct3D criada para a janela principal da vista de aplicação. Esta cadeia de troca é apresentada numa lista na IU holográfica. Para tornar a sua vista de aplicação holográfica em vez de uma ardósia 2D, crie um espaço holográfico para a janela principal em vez de uma cadeia de troca. Apresentar molduras holográficas criadas por este espaço holográfico coloca a sua aplicação no modo de composição em ecrã inteiro.

Para uma aplicação UWPa partir do modelo da Aplicação Holographic DirectX 11 (Universal Windows), procure este código no método SetWindow em AppView.cpp:

m_holographicSpace = HolographicSpace::CreateForCoreWindow(window);

Se estiver a criar uma aplicação Win32a partir do exemplo BasicHologram Win32, consulte App::CreateWindowAndHolographicSpace para obter um exemplo de HWND. Em seguida, pode convertê-lo num HWND envolvente ao criar um HolographicSpace associado:

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

Depois de obter um HolographicSpace para o seu UWP CoreWindow ou Win32 HWND, o HolographicSpace pode processar câmaras holográficas, criar sistemas de coordenadas e fazer composição holográfica. O espaço holográfico atual é utilizado em vários locais no modelo DirectX:

  • A classe DeviceResources precisa de obter algumas informações do objeto HolographicSpace para criar o dispositivo Direct3D. Este é o ID do adaptador DXGI associado ao ecrã holográfico. A classe HolographicSpace utiliza o dispositivo Direct3D 11 da sua aplicação para criar e gerir recursos baseados em dispositivos, como as memórias intermédias posteriores para cada câmara holográfica. Se estiver interessado em ver o que esta função faz no bastidor, irá encontrá-la em DeviceResources.cpp.
  • A função DeviceResources::InitializeUsingHolographicSpace demonstra como obter o adaptador ao procurar o LUID e como escolher um adaptador predefinido quando não é especificado nenhum adaptador preferencial.
  • A classe principal da aplicação utiliza o espaço holográfico de AppView::SetWindow ou App::CreateWindowAndHolographicSpace para atualizações e composição.

Nota

Enquanto as secções abaixo mencionam nomes de funções do modelo como AppView::SetWindow que assumem que começou a partir do modelo de aplicação holográfico UWP, os fragmentos de código que vê serão aplicados igualmente nas aplicações UWP e Win32.

Em seguida, vamos analisar o processo de configuração pelo qual SetHolographicSpace é responsável na classe AppMain.

Subscrever eventos de câmara, criar e remover recursos da câmara

O conteúdo holográfico da sua aplicação reside no seu espaço holográfico e é visualizado através de uma ou mais câmaras holográficas, que representam diferentes perspetivas no local. Agora que tem o espaço holográfico, pode receber dados para câmaras holográficas.

A sua aplicação tem de responder a eventos CameraAdded ao criar quaisquer recursos específicos para essa câmara. Um exemplo de tal recurso é a vista de destino de composição da memória intermédia traseira. Pode ver este código na função DeviceResources::SetHolographicSpace , chamada por AppView::SetWindow antes de a aplicação criar molduras holográficas:

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

A sua aplicação também precisa de responder aos eventos CameraRemoved ao lançar recursos que foram criados para essa câmara.

A partir de DeviceResources::SetHolographicSpace:

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

Os processadores de eventos têm de concluir algum trabalho para manter a composição holográfica a fluir sem problemas e a composição da aplicação. Leia o código e os comentários para obter os detalhes: pode procurar OnCameraAdded e OnCameraRemoved na sua classe principal para compreender como o mapa de m_cameraResources é processado pelo DeviceResources.

Neste momento, estamos focados no AppMain e na configuração que faz para permitir que a sua aplicação saiba mais sobre câmaras holográficas. Com isto em mente, é importante tomar nota dos dois requisitos seguintes:

  1. Para o processador de eventos CameraAdded , a aplicação pode funcionar de forma assíncrona para concluir a criação de recursos e o carregamento de recursos para a nova câmara holográfica. As aplicações que demoram mais do que um fotograma para concluir este trabalho devem pedir um adiamento e concluir o adiamento depois de carregar de forma assíncrona. Uma tarefa PPL pode ser utilizada para realizar um trabalho assíncrono. A sua aplicação tem de garantir que está pronta para ser composta imediatamente para essa câmara quando sair do processador de eventos ou quando concluir o diferimento. Sair do processador de eventos ou concluir o diferimento indica ao sistema que a sua aplicação está agora pronta para receber fotogramas holográficos com essa câmara incluída.

  2. Quando a aplicação recebe um evento CameraRemoved , tem de lançar todas as referências à memória intermédia posterior e sair imediatamente da função. Isto inclui vistas de destino de composição e qualquer outro recurso que possa conter uma referência ao IDXGIResource. A aplicação também tem de garantir que a memória intermédia posterior não está anexada como um destino de composição, conforme mostrado em CameraResources::ReleaseResourcesForBackBuffer. Para ajudar a acelerar o processo, a sua aplicação pode libertar a memória intermédia posterior e, em seguida, iniciar uma tarefa para concluir assíncronamente qualquer outro trabalho de demolição para a câmara. O modelo de aplicação holográfica inclui uma tarefa PPL que pode utilizar para esta finalidade.

Nota

Se quiser determinar quando é que uma câmara adicionada ou removida aparece na moldura, utilize as propriedades HolographicFrameAddedCameras e RemovedCameras .

Criar um quadro de referência para o conteúdo holográfico

Os conteúdos da sua aplicação têm de estar posicionados num sistema de coordenadas espaciais para serem compostos no HolographicSpace. O sistema fornece dois fotogramas principais de referência, que pode utilizar para estabelecer um sistema de coordenadas para os hologramas.

Existem dois tipos de fotogramas de referência no Windows Holographic: fotogramas de referência anexados ao dispositivo e molduras de referência que permanecem estacionárias à medida que o dispositivo se move pelo ambiente do utilizador. Por predefinição, o modelo de aplicação holográfica utiliza uma moldura de referência estacionária; esta é uma das formas mais simples de compor hologramas protegidos pelo mundo.

Os fotogramas de referência estacionária foram concebidos para estabilizar posições perto da localização atual do dispositivo. Isto significa que as coordenadas mais afastadas do dispositivo podem derivar ligeiramente em relação ao ambiente do utilizador à medida que o dispositivo aprende mais sobre o espaço à sua volta. Existem duas formas de criar um fotograma estacionário de referência: adquirir o sistema de coordenadas a partir da fase espacial ou utilizar o SpatialLocator predefinido. Se estiver a criar uma aplicação Windows Mixed Reality para auscultadores envolventes, o ponto de partida recomendado é a fase espacial. A fase espacial também fornece informações sobre as capacidades dos auscultadores envolventes utilizados pelo leitor. Aqui, mostramos como utilizar o SpatialLocator predefinido.

O localizador espacial representa o dispositivo Windows Mixed Reality e controla o movimento do dispositivo e fornece sistemas de coordenadas que podem ser compreendidos relativamente à sua localização.

De AppMain::OnHolographicDisplayIsAvailableChanged:

spatialLocator = SpatialLocator::GetDefault();

Crie o fotograma de referência estacionária uma vez quando a aplicação for iniciada. Isto é análogo à definição de um sistema de coordenadas mundiais, com a origem colocada na posição do dispositivo quando a aplicação é iniciada. Esta moldura de referência não é movida com o dispositivo.

A partir de AppMain::SetHolographicSpace:

m_stationaryReferenceFrame =
    m_spatialLocator.CreateStationaryFrameOfReferenceAtCurrentLocation();

Todas as molduras de referência estão alinhadas com a gravidade, o que significa que o eixo y aponta para "cima" em relação ao ambiente do utilizador. Uma vez que o Windows utiliza sistemas de coordenadas "destros", a direção do eixo –z coincide com a direção "para a frente" que o dispositivo está a enfrentar quando a moldura de referência é criada.

Nota

Quando a sua aplicação precisar de colocação precisa de hologramas individuais, utilize um SpatialAnchor para ancorar o holograma individual numa posição no mundo real. Por exemplo, utilize uma âncora espacial quando o utilizador indicar um ponto de interesse especial. As posições de âncora não desfasam, mas podem ser ajustadas. Por predefinição, quando uma âncora é ajustada, facilita a sua posição ao longo dos próximos vários frames após a correção ter ocorrido. Consoante a sua aplicação, quando isto ocorre, poderá querer processar o ajuste de uma forma diferente (por exemplo, diferindo-o até o holograma estar fora de vista). A propriedade RawCoordinateSystem e os eventos RawCoordinateSystemAdjusted permitem estas personalizações.

Responder a eventos alterados de localizabilidade

Compor hologramas protegidos pelo mundo requer que o dispositivo se localize no mundo. Isto pode nem sempre ser possível devido às condições ambientais e, em caso afirmativo, o utilizador poderá esperar uma indicação visual da interrupção do controlo. Esta indicação visual tem de ser composta através de fotogramas de referência anexados ao dispositivo, em vez de estacionário ao mundo.

A sua aplicação pode pedir para ser notificada se o controlo for interrompido por qualquer motivo. Registe-se no evento LocatabilityChanged para detetar quando a capacidade do dispositivo se localizar no mundo muda. A partir de AppMain::SetHolographicSpace:

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

Em seguida, utilize este evento para determinar quando é que os hologramas não podem ser compostos estacionários para o mundo.

Ver também