HolographicSpace Alma

Not

Bu makale eski WinRT yerel API'leriyle ilgilidir. Yeni yerel uygulama projeleri için OpenXR API'sini kullanmanızı öneririz.

HolographicSpace sınıfı, holografik dünyaya giriş portalınızdır. Çevreleyici işlemeyi denetler, kamera verileri sağlar ve uzamsal akıl yürütme API'lerine erişim sağlar. UWP uygulamanızın CoreWindow veya Win32 uygulamanızın HWND'si için bir tane oluşturacaksınız.

Holografik alanı ayarlama

Holografik boşluk nesnesini oluşturmak, Windows Mixed Reality uygulamanızı oluşturmanın ilk adımıdır. Geleneksel Windows uygulamaları, uygulama görünümlerinin çekirdek penceresi için oluşturulan bir Direct3D takas zincirine işlenir. Bu değiştirme zinciri holografik kullanıcı arabirimindeki bir sayfaya görüntülenir. Uygulama görünümünüzü 2B bir sayfa yerine holografik yapmak için değiştirme zinciri yerine çekirdek penceresi için holografik bir alan oluşturun. Bu holografik alan tarafından oluşturulan holografik çerçevelerin sunulması, uygulamanızı tam ekran işleme moduna geçirir.

Holographic DirectX 11 Uygulaması (Evrensel Windows) şablonundan başlayan bir UWP uygulaması için AppView.cpp dosyasındaki SetWindow yönteminde şu kodu arayın:

m_holographicSpace = HolographicSpace::CreateForCoreWindow(window);

BasicHologram Win32 örneğinden başlayarak bir Win32 uygulaması oluşturuyorsanız, HWND örneği için App::CreateWindowAndHolographicSpace'e bakın. Ardından ilişkili bir HolographicSpace oluşturarak bunu tam kapsamlı bir HWND'ye dönüştürebilirsiniz:

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 veya Win32 HWND için bir HolographicSpace elde ettikten sonra HolographicSpace holografik kameraları işleyebilir, koordinat sistemleri oluşturabilir ve holografik işleme gerçekleştirebilir. Geçerli holografik alan DirectX şablonunda birden çok yerde kullanılır:

  • DeviceResources sınıfının Direct3D cihazını oluşturmak için HolographicSpace nesnesinden bazı bilgiler alması gerekir. Bu, holografik ekranla ilişkili DXGI bağdaştırıcı kimliğidir. HolographicSpace sınıfı, her holografik kamera için arka arabellekler gibi cihaz tabanlı kaynaklar oluşturmak ve yönetmek için uygulamanızın Direct3D 11 cihazını kullanır. Bu işlevin arka planda ne yaptığını görmek istiyorsanız deviceResources.cpp dosyasında bulabilirsiniz.
  • DeviceResources::InitializeUsingHolographicSpace işlevi, LUID'ye bakarak bağdaştırıcının nasıl alındığını ve tercih edilen bağdaştırıcı belirtilmediğinde varsayılan bağdaştırıcının nasıl seçileceğini gösterir.
  • Uygulamanın ana sınıfı, güncelleştirmeler ve işleme için AppView::SetWindow veya App::CreateWindowAndHolographicSpace holografik alanını kullanır.

Not

Aşağıdaki bölümlerde, holografik UWP uygulama şablonundan başladığınız varsayılan AppView::SetWindow gibi şablondaki işlev adlarından bahsedilse de, gördüğünüz kod parçacıkları UWP ve Win32 uygulamalarına eşit şekilde uygulanır.

Ardından, SetHolographicSpace'in AppMain sınıfında sorumlu olduğu kurulum işlemine göz atacağız.

Kamera olaylarına abone olma, kamera kaynakları oluşturma ve kaldırma

Uygulamanızın holografik içeriği holografik alanında bulunur ve sahnedeki farklı perspektifleri temsil eden bir veya daha fazla holografik kameradan görüntülenir. Artık holografik alana sahip olduğunuz için holografik kameralar için veri alabilirsiniz.

Uygulamanızın kameraya özgü kaynaklar oluşturarak CameraAdded olaylarına yanıt vermesi gerekir. Bu tür bir kaynağa örnek olarak arka arabellek işleme hedef görünümünüz gösteriliyor. Bu kodu, uygulama herhangi bir holografik çerçeve oluşturmadan önce AppView::SetWindow tarafından çağrılan DeviceResources::SetHolographicSpace işlevinde görebilirsiniz:

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

Uygulamanızın ayrıca kamera için oluşturulan kaynakları yayınlayarak CameraRemoved olaylarına yanıt vermesi gerekir.

DeviceResources::SetHolographicSpace'ten:

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

Olay işleyicileri, holografik işlemenin sorunsuz bir şekilde akmasını ve uygulamanızın işlenmesini sağlamak için bazı çalışmaları tamamlamalıdır. Ayrıntılar için kodu ve açıklamaları okuyun: m_cameraResources eşlemesinin DeviceResources tarafından nasıl işlendiğini anlamak için ana sınıfınızda OnCameraAdded ve OnCameraRemoved'i arayabilirsiniz.

Şu anda AppMain'e ve uygulamanızın holografik kameralar hakkında bilgi edinmesi için yaptığı kuruluma odaklandık. Bunu göz önünde bulundurarak, aşağıdaki iki gereksinimi not almak önemlidir:

  1. CameraAdded olay işleyicisi için uygulama zaman uyumsuz olarak çalışarak yeni holografik kamera için kaynak oluşturmayı ve varlıkları yüklemeyi tamamlayabilir. Bu işi tamamlamak için birden fazla çerçeve alan uygulamalar erteleme isteğinde bulunmalıdır ve zaman uyumsuz olarak yüklendikten sonra ertelemeyi tamamlamalıdır. PpL görevi zaman uyumsuz çalışma yapmak için kullanılabilir. Uygulamanızın olay işleyiciden çıktığında veya ertelemeyi tamamladığında kameraya hemen işlemeye hazır olduğundan emin olması gerekir. Olay işleyiciden çıkmak veya ertelemeyi tamamlamak sisteme uygulamanızın artık söz konusu kamerayla birlikte holografik çerçeveler almaya hazır olduğunu bildirir.

  2. Uygulama bir CameraRemoved olayı aldığında, arka arabelleğe yapılan tüm başvuruları serbest bırakmalı ve işlevden hemen çıkmalıdır. Bu işleme hedef görünümlerini ve IDXGIResource'a başvuru içerebilecek diğer tüm kaynakları içerir. Uygulama, CameraResources::ReleaseResourcesForBackBuffer'da gösterildiği gibi arka arabelleğinde işleme hedefi olarak eklenmediğinden de emin olmalıdır. İşlemleri hızlandırmaya yardımcı olmak için uygulamanız arka arabelleği serbest bırakabilir ve ardından kamera için diğer tüm yırtılma çalışmalarını zaman uyumsuz olarak tamamlamak üzere bir görev başlatabilir. Holografik uygulama şablonu, bu amaçla kullanabileceğiniz bir PPL görevi içerir.

Not

Eklenen veya kaldırılan bir kameranın çerçevede ne zaman gösterileceğini belirlemek istiyorsanız HolographicFrameAddedCameras ve RemovedCameras özelliklerini kullanın.

Holografik içeriğiniz için bir başvuru çerçevesi oluşturma

Uygulamanızın içeriği HolographicSpace'te işlenecek uzamsal koordinat sisteminde konumlandırılmalıdır. Sistem, hologramlarınız için bir koordinat sistemi oluşturmak için kullanabileceğiniz iki birincil başvuru çerçevesi sağlar.

Windows Holographic'te iki tür başvuru çerçevesi vardır: cihaza bağlı başvuru çerçeveleri ve cihaz kullanıcının ortamında ilerledikçe sabit kalan başvuru çerçeveleri. Holografik uygulama şablonu varsayılan olarak sabit bir başvuru çerçevesi kullanır; bu, dünya kilitli hologramları işlemenin en basit yollarından biridir.

Sabit referans çerçeveleri, cihazın geçerli konumuna yakın konumları dengelemek için tasarlanmıştır. Bu, cihazın etrafındaki alan hakkında daha fazla bilgi edindikçe cihazın koordinatlarının kullanıcının ortamına göre biraz kayabileceği anlamına gelir. Sabit bir başvuru çerçevesi oluşturmanın iki yolu vardır: uzamsal aşamadan koordinat sistemini alma veya varsayılan SpatialLocator'ı kullanma. Çevreleyici mikrofonlu kulaklıklar için Windows Mixed Reality bir uygulama oluşturuyorsanız, önerilen başlangıç noktası uzamsal aşamadır. Uzamsal aşama ayrıca oynatıcının taktığı çevreleyici mikrofonlu kulaklığın özellikleri hakkında da bilgi sağlar. Burada varsayılan SpatialLocator'ın nasıl kullanılacağını göstereceğiz.

Uzamsal bulucu Windows Mixed Reality cihazı temsil eder ve cihazın hareketini izler ve konumuna göre anlaşılabilen koordinat sistemleri sağlar.

AppMain::OnHolographicDisplayIsAvailableChanged'den:

spatialLocator = SpatialLocator::GetDefault();

Uygulama başlatıldığında sabit başvuru çerçevesini bir kez oluşturun. Bu, uygulama başlatıldığında kaynağı cihazın konumuna yerleştirilmiş bir dünya koordinat sistemi tanımlamaya benzer. Bu başvuru çerçevesi cihazla birlikte taşınmaz.

AppMain::SetHolographicSpace'ten:

m_stationaryReferenceFrame =
    m_spatialLocator.CreateStationaryFrameOfReferenceAtCurrentLocation();

Tüm referans çerçeveleri yerçekimine göre hizalanır, yani y ekseni kullanıcının ortamına göre "yukarı" işaret eder. Windows "sağ elle kullanılan" koordinat sistemlerini kullandığından, –z ekseninin yönü, referans çerçevesi oluşturulduğunda cihazın "ileri" yönüyle çakışır.

Not

Uygulamanız tek tek hologramların tam olarak yerleştirilmesini gerektirdiğinde, tek hologramı gerçek dünyadaki bir konuma sabitlemek için SpatialAnchor kullanın. Örneğin, kullanıcı özel ilgi çekici bir nokta belirttiğinde uzamsal bir yer işareti kullanın. Çapa konumları kaymaz, ancak ayarlanabilir. Varsayılan olarak, bir yer işareti ayarlandığında, düzeltme yapıldıktan sonra sonraki birkaç karede konumunu kolaylaştırır. Uygulamanıza bağlı olarak, bu durum oluştuğunda ayarlamayı farklı bir şekilde işlemek isteyebilirsiniz (örneğin hologram görüntüden çıkana kadar erteleyerek). RawCoordinateSystem özelliği ve RawCoordinateSystemAdjusted olayları bu özelleştirmeleri etkinleştirir.

Locatability changed olaylarına yanıt verme

Dünya kilitli hologramları işlemek için cihazın kendisini dünyada bulması gerekir. Ortam koşulları nedeniyle bu her zaman mümkün olmayabilir ve bu durumda kullanıcı izleme kesintisinin görsel bir göstergesini bekleyebilir. Bu görsel göstergenin, dünyaya sabit yerine cihaza bağlı başvuru çerçeveleri kullanılarak işlenmesi gerekir.

herhangi bir nedenle izleme kesintiye uğrarsa uygulamanız bildirim almak isteyebilir. Cihazın kendisini dünyada bulma yeteneğinin ne zaman değiştiğini algılamak için LocatabilityChanged olayına kaydolun. AppMain::SetHolographicSpace'ten:

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

Ardından hologramların ne zaman dünyaya sabit olarak işlenemeyeceğini belirlemek için bu olayı kullanın.

Ayrıca bkz.