HolographicSpace を取得するGetting a HolographicSpace

HolographicSpaceクラスは、holographic 世界のポータルです。The HolographicSpace class is your portal into the holographic world. これは、イマーシブレンダリングを制御し、カメラデータを提供し、空間の推論 Api にアクセスできるようにします。It controls immersive rendering, provides camera data, and provides access to spatial reasoning APIs. UWP アプリのCorewindowまたは Win32 アプリの HWND 用に作成します。You will create one for your UWP app's CoreWindow or your Win32 app's HWND.

Holographic space を設定するSet up the holographic space

Holographic space オブジェクトの作成は、Windows Mixed Reality アプリを作成するための最初の手順です。Creating the holographic space object is the first step in making your Windows Mixed Reality app. 従来の Windows アプリは、アプリケーションビューのコアウィンドウ用に作成された Direct3D スワップチェーンにレンダリングします。Traditional Windows apps render to a Direct3D swap chain created for the core window of their application view. このスワップチェーンは、holographic UI のスレートに表示されます。This swap chain is displayed to a slate in the holographic UI. アプリケーションが2D スレートではなく holographic を表示するようにするには、スワップチェーンではなく、コアウィンドウの holographic 領域を作成します。To make your application view holographic rather than a 2D slate, create a holographic space for its core window instead of a swap chain. この holographic space によって作成された holographic フレームを表示すると、アプリが全画面表示モードになります。Presenting holographic frames that are created by this holographic space puts your app into full-screen rendering mode.

Holographic DirectX 11 アプリ (ユニバーサル Windows) テンプレートから開始するUWP アプリの場合は、appview .cpp のsetwindowメソッドで次のコードを探します。For a UWP app starting from the Holographic DirectX 11 App (Universal Windows) template, look for this code in the SetWindow method in AppView.cpp:

m_holographicSpace = HolographicSpace::CreateForCoreWindow(window);

Basichologram win32 サンプルから始まる win32 アプリの場合は、 app:: CreateWindowAndHolographicSpaceで HWND を作成し、関連付けられたHolographicSpaceを作成することによって、その hwnd に変換する方法の例を確認してください。For a Win32 app starting from the BasicHologram Win32 sample, look at App::CreateWindowAndHolographicSpace for an example of how to create an HWND and then convert it into an immersive HWND by creating an associated 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);
}

UWP CoreWindow または Win32 HWND の HolographicSpace を取得したので、この HolographicSpace を使用して holographic カメラの処理、座標系の作成、および holographic レンダリングを行います。Now that you've obtained a HolographicSpace for either your UWP CoreWindow or Win32 HWND, you'll use that HolographicSpace to handle holographic cameras, create coordinate systems and do holographic rendering. 現在の holographic space は、DirectX テンプレート内の複数の場所で使用されます。The current holographic space is used in multiple places in the DirectX template:

  • DeviceResourcesクラスは、Direct3D デバイスを作成するために、HolographicSpace オブジェクトからいくつかの情報を取得する必要があります。The DeviceResources class needs to get some information from the HolographicSpace object in order to create the Direct3D device. これは、holographic ディスプレイに関連付けられている DXGI アダプター ID です。This is the DXGI adapter ID associated with the holographic display. HolographicSpaceクラスは、アプリの Direct3D 11 デバイスを使用して、デバイスベースのリソース (各 holographic カメラのバックバッファーなど) を作成し、管理します。The HolographicSpace class uses your app's Direct3D 11 device to create and manage device-based resources, such as the back buffers for each holographic camera. この関数が内部で何を行っているかについては、DeviceResources にあります。If you're interested in seeing what this function does under the hood, you'll find it in DeviceResources.cpp.
  • 関数DeviceResources:: InitializeUsingHolographicSpaceは、LUID を検索してアダプターを取得する方法と、優先アダプターが指定されていない場合に既定のアダプターを選択する方法を示しています。The function DeviceResources::InitializeUsingHolographicSpace demonstrates how to obtain the adapter by looking up the LUID – and how to choose a default adapter when no preferred adapter is specified.
  • アプリのメインクラスは、更新とレンダリングのためにAppview:: SetWindowまたはApp:: CreateWindowAndHolographicSpaceの holographic 空間を使用します。The app's main class uses the holographic space from AppView::SetWindow or App::CreateWindowAndHolographicSpace for updates and rendering.

注意

以下のセクションでは、holographic UWP アプリテンプレートから開始したことを前提として、 Appview:: SetWindowのようなテンプレートの関数名について説明していますが、表示されるコードスニペットは、uwp アプリと Win32 アプリ間でも同様に適用されます。While the sections below mention function names from the template like AppView::SetWindow that assume that you started from the holographic UWP app template, the code snippets you see will apply equally across UWP and Win32 apps.

次に、 SetHolographicSpaceが appmain クラスで担当するセットアッププロセスについて説明します。Next, we'll dive into the setup process that SetHolographicSpace is responsible for in the AppMain class.

カメライベントのサブスクライブ、カメラリソースの作成と削除Subscribe to camera events, create and remove camera resources

アプリの holographic コンテンツは holographic 空間に存在し、シーンのさまざまなパースペクティブを表す1つ以上の holographic カメラによって表示されます。Your app's holographic content lives in its holographic space, and is viewed through one or more holographic cameras which represent different perspectives on the scene. Holographic 領域が完成したので、holographic カメラのデータを受け取ることができます。Now that you have the holographic space, you can receive data for holographic cameras.

アプリは、バックバッファーレンダーターゲットビューのように、そのカメラに固有のリソースを作成することによってCameraAddedイベントに応答する必要があります。Your app needs to respond to CameraAdded events by creating any resources that are specific to that camera, like your back buffer render target view. このコードは、アプリが holographic フレームを作成する前にAppview:: SetWindowによって呼び出されるDeviceResources:: SetHolographicSpace関数で確認できます。You can see this code in the DeviceResources::SetHolographicSpace function, called by AppView::SetWindow before the app creates any holographic frames:

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

また、アプリは、そのカメラ用に作成されたリソースを解放することによって、 CameraRemovedイベントに応答する必要があります。Your app also needs to respond to CameraRemoved events by releasing resources that were created for that camera.

DeviceResources:: SetHolographicSpaceから:From DeviceResources::SetHolographicSpace:

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

イベントハンドラーは、holographic レンダリングを滑らかにするために何らかの作業を完了する必要があります。これにより、アプリがまったくレンダリングできるようになります。The event handlers must complete some work in order to keep holographic rendering flowing smoothly, and so that your app is able to render at all. 詳細については、コードとコメントを参照してください。 main クラスでOnCameraAddedOnCameraRemovedを検索すると、 DeviceResourcesによってm_cameraResourcesマップがどのように処理されるかを理解できます。Read the code and comments for the details: you can look for OnCameraAdded and OnCameraRemoved in your main class to understand how the m_cameraResources map is handled by DeviceResources.

ここでは、AppMain と、アプリが holographic カメラについて認識できるようにするためのセットアップに焦点を合わせています。Right now, we're focused on AppMain and the setup that it does to enable your app to know about holographic cameras. この点を考慮して、次の2つの要件を確認することが重要です。With this in mind, it's important to take note of the following two requirements:

  1. CameraAddedイベントハンドラーでは、アプリを非同期に処理して、新しい holographic カメラのリソースの作成とアセットの読み込みを完了できます。For the CameraAdded event handler, the app can work asynchronously to finish creating resources and loading assets for the new holographic camera. この作業を完了するために複数のフレームを使用するアプリは、遅延を要求し、非同期読み込みの後に遅延を完了する必要があります。PPL タスクは、非同期処理を実行するために使用できます。Apps that take more than one frame to complete this work should request a deferral, and complete the deferral after loading asynchronously; a PPL task can be used to do asynchronous work. アプリは、イベントハンドラーが終了したとき、または遅延が完了したときに、そのカメラにすぐにレンダリングできるようにする必要があります。Your app must ensure that it's ready to render to that camera right away when it exits the event handler, or when it completes the deferral. イベントハンドラーを終了するか、遅延を完了すると、そのカメラを含む holographic フレームを受信する準備ができたことがシステムに通知されます。Exiting the event handler or completing the deferral tells the system that your app is now ready to receive holographic frames with that camera included.

  2. アプリは、 CameraRemovedイベントを受け取ると、バックバッファーへのすべての参照を解放し、関数をすぐに終了する必要があります。When the app receives a CameraRemoved event, it must release all references to the back buffer and exit the function right away. これには、レンダーターゲットビューや、 Idxgiresourceへの参照を保持する他のリソースが含まれます。This includes render target views, and any other resource that might hold a reference to the IDXGIResource. また、 CameraResources:: ReleaseResourcesForBackBufferに示されているように、アプリは、バックバッファーがレンダーターゲットとしてアタッチされていないことを確認する必要があります。The app must also ensure that the back buffer is not attached as a render target, as shown in CameraResources::ReleaseResourcesForBackBuffer. 処理速度を向上させるために、アプリはバックバッファーを解放し、タスクを起動して、そのカメラを破棄するために必要な他の作業を非同期に完了させることができます。To help speed things along, your app can release the back buffer and then launch a task to asynchronously complete any other work that is necessary to tear down that camera. Holographic アプリテンプレートには、この目的で使用できる PPL タスクが含まれています。The holographic app template includes a PPL task that you can use for this purpose.

注意

追加または削除されたカメラがフレームにどのように表示されるかを確認するには、 HolographicFrame addedcamerasプロパティとremovedcamerasプロパティを使用します。If you want to determine when an added or removed camera shows up on the frame, use the HolographicFrame AddedCameras and RemovedCameras properties.

Holographic コンテンツの参照のフレームを作成するCreate a frame of reference for your holographic content

HolographicSpace にレンダリングするには、アプリのコンテンツが空間座標系に配置されている必要があります。Your app's content must be positioned in a spatial coordinate system to be rendered in the HolographicSpace. システムには、ホログラムの座標系を確立するために使用できる2つの主要な参照フレームが用意されています。The system provides two primary frames of reference which you can use to establish a coordinate system for your holograms.

Windows Holographic には、デバイスに接続されている参照フレームと、デバイスがユーザーの環境を移動するときに静止している参照フレームの2種類があります。There are two kinds of reference frames in Windows Holographic: reference frames attached to the device, and reference frames that remain stationary as the device moves through the user's environment. Holographic アプリテンプレートでは、既定で静止参照フレームが使用されます。これは、世界中にロックされているホログラムをレンダリングする最も簡単な方法の1つです。The holographic app template uses a stationary reference frame by default; this is one of the simplest ways to render world-locked holograms.

静止参照フレームは、デバイスの現在の場所の近くに位置を安定させるように設計されています。Stationary reference frames are designed to stabilize positions near the device's current location. これは、デバイスの周囲の領域の詳細を学習するため、デバイスからさらに多くの座標がユーザーの環境に対して若干ずれられることを意味します。This means that coordinates further from the device are allowed to drift slightly with respect to the user's environment as the device learns more about the space around it. 静止した参照フレームを作成するには、空間ステージから座標系を取得する方法と、既定のSpatialLocatorを使用する方法の2つがあります。There are two ways to create a stationary frame of reference: acquire the coordinate system from the spatial stage, or use the default SpatialLocator. イマーシブヘッドセット用の Windows Mixed Reality アプリを作成する場合、推奨される開始点は空間ステージです。これには、プレーヤーによって摩耗されたイマーシブヘッドセットの機能に関する情報も表示されます。If you are creating a Windows Mixed Reality app for immersive headsets, the recommended starting point is the spatial stage, which also provides information about the capabilities of the immersive headset worn by the player. ここでは、既定のSpatialLocatorの使用方法について説明します。Here, we show how to use the default SpatialLocator.

空間ロケーターは、Windows Mixed Reality デバイスを表し、デバイスの動きを追跡し、位置に対して相対的に理解できる座標系を提供します。The spatial locator represents the Windows Mixed Reality device, and tracks the motion of the device and provides coordinate systems that can be understood relative to its location.

Appmain:: OnHolographicDisplayIsAvailableChangedから:From AppMain::OnHolographicDisplayIsAvailableChanged:

spatialLocator = SpatialLocator::GetDefault();

アプリが起動されたときに、静止参照フレームを1回作成します。Create the stationary reference frame once when the app is launched. これは、アプリが起動されたときに原点がデバイスの位置に配置された、ワールド座標系を定義することに似ています。This is analogous to defining a world coordinate system, with the origin placed at the device's position when the app is launched. この参照フレームはデバイスと共に移動しません。This reference frame doesn't move with the device.

Appmain:: SetHolographicSpaceから:From AppMain::SetHolographicSpace:

m_stationaryReferenceFrame =
    m_spatialLocator.CreateStationaryFrameOfReferenceAtCurrentLocation();

すべての参照フレームは重力に沿っています。つまり、y 軸はユーザーの環境に対して "up" を指します。All reference frames are gravity aligned, meaning that the y axis points "up" with respect to the user's environment. Windows では "右手" 座標系が使用されるため、– z 軸の方向は、参照フレームの作成時にデバイスが接続している "前方" 方向と一致します。Since Windows uses "right-handed" coordinate systems, the direction of the –z axis coincides with the "forward" direction the device is facing when the reference frame is created.

注意

アプリが個々のホログラムを正確に配置する必要がある場合は、 SpatialAnchorを使用して、個々のホログラムを実際の世界の位置に固定します。When your app requires precise placement of individual holograms, use a SpatialAnchor to anchor the individual hologram to a position in the real world. たとえば、ユーザーが特別な関心のあるポイントを示す場合は、空間アンカーを使用します。For example, use a spatial anchor when the user indicates a point to be of special interest. アンカー位置はずれませんが、調整することができます。Anchor positions do not drift, but they can be adjusted. 既定では、アンカーが調整されると、修正が行われた後、その位置が次の複数のフレームに配置されるようになります。By default, when an anchor is adjusted, it eases its position into place over the next several frames after the correction has occurred. アプリケーションによっては、これが発生したときに、別の方法で調整を処理することが必要になる場合があります (たとえば、ホログラムが非表示になるまでは、このように遅延させます)。Depending on your application, when this occurs you may want to handle the adjustment in a different manner (e.g. by deferring it until the hologram is out of view). これらのカスタマイズは、 RawCoordinateSystemプロパティとRawCoordinateSystemAdjustedイベントによって有効になります。The RawCoordinateSystem property and RawCoordinateSystemAdjusted events enable these customizations.

Locatability 変更イベントへの応答Respond to locatability changed events

世界中にロックされているホログラムをレンダリングするには、デバイスが世界中で検出できるようにする必要があります。Rendering world-locked holograms requires the device to be able to locate itself in the world. これは、環境の状態が原因で常に発生するとは限りません。その場合、ユーザーは追跡の中断を視覚的に示すことが期待される可能性があります。This may not always be possible due to environmental conditions, and if so, the user may expect a visual indication of the tracking interruption. この視覚的な表示は、デバイスに接続されている参照フレームを使用して、世界に固定するのではなく、レンダリングする必要があります。This visual indication must be rendered using reference frames attached to the device, instead of stationary to the world.

アプリは、何らかの理由で追跡が中断された場合に、通知を受け取るように要求できます。You app can request to be notified if tracking is interrupted for any reason. Locatの変更後のイベントに登録して、デバイスが世界中に配置されているかどうかを検出します。Register for the LocatabilityChanged event to detect when the device's ability to locate itself in the world changes. Appmain:: SetHolographicSpace から:From AppMain::SetHolographicSpace:

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

次に、このイベントを使用して、ホログラムを世界にどのようにレンダリングするかを決定します。Then use this event to determine when holograms cannot be rendered stationary to the world.

参照See also