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 アプリの 1 つは作成CoreWindowまたは Win32 アプリケーションの HWND。You will create one for your UWP app's CoreWindow or your Win32 app's HWND.

Holographic の領域を設定します。Set up the holographic space

Windows Mixed Reality アプリを作成する最初の手順は、holographic 領域オブジェクトを作成します。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 領域によって作成される holographic のフレームを表示します。Presenting holographic frames that are created by this holographic space puts your app into full-screen rendering mode.

UWP アプリから始まる、 Holographic DirectX 11 アプリ (ユニバーサル Windows) テンプレートでこのコードを探して、 SetWindowAppView.cpp メソッド: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);

Win32 アプリから始まる、 BasicHologram Win32 サンプル、見てApp::CreateWindowAndHolographicSpace用、HWND を作成し、関連付けを作成して没入型の HWND に変換する方法の例HolographicSpace: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 を入手できた holographic のカメラの処理、座標系を作成および holographic のレンダリングを行うその HolographicSpace を使用します。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 領域は、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クラスでは、アプリの direct3d11 のデバイスを使用して作成し、各 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.cpp で検索します。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.
  • アプリのメイン クラスから holographic の領域を使用してAppView::SetWindowまたはApp::CreateWindowAndHolographicSpaceの更新プログラムとレンダリングします。The app's main class uses the holographic space from AppView::SetWindow or App::CreateWindowAndHolographicSpace for updates and rendering.

注意

以下のセクションには、テンプレートの関数名が言うまでもなどAppView::SetWindow holographic の UWP アプリ テンプレートから開始することは、表示のコード スニペットは、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. このコードを確認できます、 DeviceResources::SetHolographicSpaceによって呼び出される関数AppView::SetWindowアプリは、すべての holographic フレームを作成する前に。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. コードと詳細については、コメントを読めない: 探すことができますOnCameraAddedOnCameraRemovedを理解するのには、メイン クラスにする方法、 m_cameraResourcesマップは、によって処理されるDeviceResourcesします。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 AddedCamerasRemovedCamerasプロパティ。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 アプリ テンプレートでは、既定では、静止した基準枠を使用します。これは、世界ロック ホログラムを表示するために最も簡単な方法のいずれかです。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. 静止した基準枠を作成する 2 つの方法があります: から座標系を取得、空間ステージ、既定値を使用して、またはSpatialLocatorします。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 軸を指していることを意味します。All reference frames are gravity aligned, meaning that the y axis points "up" with respect to the user's environment. Windows では、「右手」座標系を使用するため、z 軸の方向は、参照フレームが作成されるときに、デバイスが直面している"forward"方向と一致します。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. 検出する LocatabilityChanged イベント自体を世界中の変更で検索するデバイスの機能に登録します。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