Поделиться через


Получение HolographicSpace

Примечание.

Эта статья относится к устаревшим собственным API WinRT. Для новых проектов собственных приложений рекомендуется использовать API OpenXR.

Класс HolographicSpace — это портал в голографическом мире. Он управляет иммерсивной отрисовкой, предоставляет данные камеры и предоставляет доступ к API пространственных причин. Вы создадите его для приложения UWP CoreWindow или HWND приложения Win32.

Настройка голографического пространства

Создание голографического объекта пространства — это первый шаг в создании приложения windows Смешанная реальность. Традиционные приложения Windows отображаются в цепочке буферов Direct3D, созданной для основного окна представления приложения. Эта цепочка буферов отображается на листе в голографическом пользовательском интерфейсе. Чтобы сделать представление приложения голографическим, а не 2D-листом, создайте голографическое пространство для его основного окна вместо цепочки буферов. Представление голографических кадров, созданных этим голографическим пространством, помещает приложение в полноэкранный режим отрисовки.

Для приложения UWP, начиная с шаблона Holographic DirectX 11 App (universal Windows), найдите этот код в методе SetWindow в AppView.cpp:

m_holographicSpace = HolographicSpace::CreateForCoreWindow(window);

Если вы создаете приложение Win32, начиная с примера BasicHologram Win32, просмотрите приложение::CreateWindowAndHolographicSpace для примера HWND. Затем его можно преобразовать в иммерсивный HWND, создав связанное HolographicSpace:

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

Получив HolographicSpace для UWP CoreWindow или Win32 HWND, HolographicSpace может обрабатывать голографические камеры, создавать системы координат и выполнять голографическую отрисовку. Текущее голографическое пространство используется в нескольких местах в шаблоне DirectX:

  • Класс DeviceResources должен получить некоторые сведения из объекта HolographicSpace для создания устройства Direct3D. Это идентификатор адаптера DXGI, связанный с голографическим дисплеем. Класс HolographicSpace использует устройство Direct3D 11 приложения для создания ресурсов на основе устройств и управления ими, таких как буферы задней части для каждой голографической камеры. Если вы заинтересованы в том, что эта функция делает под капотом, вы найдете его в DeviceResources.cpp.
  • Функция DeviceResources::InitializeUsingHolographicSpace демонстрирует, как получить адаптер путем поиска LUID и как выбрать адаптер по умолчанию, если не указан предпочтительный адаптер.
  • Основной класс приложения использует голографическое пространство из AppView::SetWindow или App::CreateWindowAndHolographicSpace для обновлений и отрисовки.

Примечание.

В разделах ниже перечислены имена функций из шаблона, например AppView::SetWindow , которые предполагают, что вы начали работу с шаблона приложения голографической UWP, фрагменты кода, которые вы видите, будут применяться одинаково между приложениями UWP и Win32.

Далее мы рассмотрим процесс установки, за который SetHolographicSpace отвечает в классе AppMain.

Подписка на события камеры, создание и удаление ресурсов камеры

Голографическое содержимое приложения живет в голографическом пространстве и просматривается с помощью одной или нескольких голографических камер, представляющих различные перспективы на сцене. Теперь, когда у вас есть голографическое пространство, вы можете получать данные для голографических камер.

Приложение должно реагировать на события CameraAdded , создавая все ресурсы, относящиеся к этой камере. Примером такого ресурса является представление целевого объекта отрисовки обратного буфера. Этот код можно увидеть в функции DeviceResources::SetHolographicSpace , вызываемой AppView::SetWindow , прежде чем приложение создает все голографические кадры:

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

Приложение также должно реагировать на события "Удалена камера", освобождая ресурсы, созданные для этой камеры.

Из DeviceResources::SetHolographicSpace:

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

Обработчики событий должны выполнять некоторые действия, чтобы обеспечить плавность потоковой отрисовки голографической отрисовки и отрисовки приложения. Ознакомьтесь с кодом и комментариями к деталям: вы можете искать OnCameraAdded и OnCameraRemoved в основном классе, чтобы понять, как карта m_cameraResources обрабатывается DeviceResources.

Сейчас мы сосредоточены на AppMain и настройке, которая позволяет приложению узнать о голографических камерах. Учитывая это, важно учитывать следующие два требования:

  1. Для обработчика событий CameraAdded приложение может работать асинхронно, чтобы завершить создание ресурсов и загрузку ресурсов для новой голографической камеры. Приложения, которые занимают несколько кадров для выполнения этой работы, должны запрашивать отсрочку и завершать отсрочку после асинхронной загрузки. Задачу PPL можно использовать для асинхронной работы. Приложение должно убедиться, что оно готово к отображению этой камеры сразу после выхода обработчика событий или завершения отсрочки. Выход из обработчика событий или завершение отсрочки сообщает системе, что ваше приложение теперь готово для получения голографических кадров с этой камерой.

  2. Когда приложение получает событие "Удалена камера", оно должно сразу освободить все ссылки на буфер назад и выйти из функции. К ним относятся целевые представления отрисовки и любой другой ресурс, который может содержать ссылку на IDXGIResource. Приложение также должно убедиться, что задний буфер не присоединен в качестве целевого объекта отрисовки, как показано в CameraResources::ReleaseResourcesForBackBuffer. Чтобы ускорить работу, приложение может освободить задний буфер, а затем запустить задачу, чтобы асинхронно завершить любую другую работу по удалению камеры. Шаблон голографического приложения включает задачу PPL, которую можно использовать для этой цели.

Примечание.

Если вы хотите определить, когда добавленная или удаленная камера отображается в кадре, используйте свойства HolographicFrame AddedCameras и RemovedCameras.

Создание рамки ссылки для голографического содержимого

Содержимое приложения должно находиться в пространственной системе координат, которую необходимо отобразить в HolographicSpace. Система предоставляет два основных кадра ссылок, которые можно использовать для установления системы координат для голограмм.

Существует два типа ссылочных кадров в Windows Holographic: ссылочные кадры, подключенные к устройству, и эталонные кадры, которые остаются неподвижными, так как устройство перемещается через среду пользователя. В шаблоне голографического приложения по умолчанию используется неустанный ссылочный кадр; это один из самых простых способов отрисовки заблокированных в мире голограмм.

Стационарные эталонные кадры предназначены для стабилизации позиций рядом с текущим расположением устройства. Это означает, что координаты дальше от устройства могут немного сдвигаться относительно среды пользователя, так как устройство узнает больше о пространстве вокруг него. Существует два способа создания стационарного кадра ссылки: получение системы координат из пространственного этапа или использование пространственного указателя по умолчанию. Если вы создаете приложение windows Смешанная реальность для иммерсивных гарнитур, рекомендуемая отправная точка — это пространственный этап. Пространственный этап также предоставляет сведения о возможностях иммерсивной гарнитуры, которая носится проигрывателем. Здесь показано, как использовать пространственный указатель по умолчанию.

Пространственный указатель представляет устройство Windows Смешанная реальность и отслеживает движение устройства и предоставляет системы координат, которые можно понять относительно его расположения.

Из AppMain::OnHolographicDisplayIsAvailableChanged:

spatialLocator = SpatialLocator::GetDefault();

Создайте неустанный эталонный кадр один раз при запуске приложения. Это аналогично определению системы координат мира с источником, помещенным на позицию устройства при запуске приложения. Этот эталонный кадр не перемещается с устройством.

Из AppMain::SetHolographicSpace:

m_stationaryReferenceFrame =
    m_spatialLocator.CreateStationaryFrameOfReferenceAtCurrentLocation();

Все эталонные кадры выровнены по тяжести, то есть точки оси y "вверх" в отношении среды пользователя. Так как Windows использует системы координат правой руки, направление оси –z совпадает с направлением вперед, которое устройство сталкивается при создании эталонного кадра.

Примечание.

Если приложению требуется точное размещение отдельных голограмм, используйте ПространственныйAnchor для привязки отдельной голограммы к позиции в реальном мире. Например, используйте пространственные привязки, когда пользователь указывает, что точка имеет особый интерес. Позиции привязки не смещения, но их можно настроить. По умолчанию при настройке привязки она упрощает его положение в месте над следующими несколькими кадрами после того, как произошла коррекция. В зависимости от приложения, когда это происходит, может потребоваться выполнить корректировку по-другому (например, откладывая ее до тех пор, пока голограмма не будет отображаться). Свойство RawCoordinateSystem и события RawCoordinateSystemAdjusted позволяют настраивать эти настройки.

Реагирование на события изменения доступности

Отрисовка заблокированных голограмм требует от устройства найти себя в мире. Это может быть не всегда возможно из-за условий окружающей среды, и если да, пользователь может ожидать визуального признака прерывания отслеживания. Это визуальное указание должно быть отрисовывается с помощью ссылочных кадров, подключенных к устройству, а не на стационарном устройстве.

Ваше приложение может запросить уведомление, если отслеживание прерывается по какой-либо причине. Зарегистрируйте событие LocatabilityChanged, чтобы определить, когда способность устройства находить себя в мире изменяется. Из AppMain::SetHolographicSpace:

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

Затем используйте это событие, чтобы определить, когда голограммы не могут быть отрисованы в мире.

См. также