Aracılığıyla paylaş


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 Karma Gerçeklik 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 takas zinciri holografik kullanıcı arabiriminde bir sayfaya görüntülenir. Uygulamanızın 2B bir sayfa yerine holografik görünümünü oluşturmak için, çekirdek penceresi için takas zinciri yerine 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'deki 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şkilendirilmiş 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 neler yaptığını görmek istiyorsanız, DeviceResources.cpp'de bulabilirsiniz.
  • DeviceResources::InitializeUsingHolographicSpace işlevi, LUID'ye bakarak bağdaştırıcının nasıl alındığını ve tercih edilen bir 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, AppMain sınıfında SetHolographicSpace'in sorumlu olduğu kurulum işlemini inceleyeceğiz.

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 kamera aracılığıyla 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'den:

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

Olay işleyicilerinin holografik işlemenin sorunsuz bir şekilde akmasını ve uygulamanızın işlemesini sağlamak için bazı çalışmaları tamamlaması gerekir. 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, yeni holografik kamera için kaynak oluşturmayı ve varlıkları yüklemeyi tamamlamak için zaman uyumsuz olarak çalışabilir. Bu işi tamamlamak için birden fazla çerçeve alan uygulamalar erteleme istemeli ve zaman uyumsuz olarak yükledikten sonra ertelemeyi tamamlamalıdır. PpL görevi zaman uyumsuz iş yapmak için kullanılabilir. Uygulamanız olay işleyiciden çıktığında veya ertelemeyi tamamladığında kameraya hemen işlemeye hazır olduğundan emin olmalıdır. 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. İşlerin hızlanmasına yardımcı olmak için uygulamanız arka arabelleği serbest bırakabilir ve ardından kamera için diğer tüm ayrıştırma ç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öründüğünü belirlemek istiyorsanız HolographicFrame AddedCameras 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şlenmek üzere 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 referans ç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 edindiğinden, cihazdan daha fazla koordinatları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 kulaklıklar için bir Windows Karma Gerçeklik uygulaması oluşturuyorsanız, önerilen başlangıç noktası uzamsal aşamadır. Uzamsal aşama ayrıca oyuncunun 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 Karma Gerçeklik cihazını temsil eder ve cihazın hareketini izler ve konumuna göre anlaşılabilen koordinat sistemleri sağlar.

From AppMain::OnHolographicDisplayIsAvailableChanged:

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'den:

m_stationaryReferenceFrame =
    m_spatialLocator.CreateStationaryFrameOfReferenceAtCurrentLocation();

Tüm referans çerçeveleri yer çekimiyle 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ışıyor.

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 tutturucu 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 mümkünse, kullanıcı izleme kesintisinin görsel bir göstergesini bekleyebilir. Bu görsel gösterge, dünyaya sabit yerine cihaza bağlı başvuru çerçeveleri kullanılarak işlenmelidir.

uygulamanız herhangi bir nedenle izlemenin kesintiye uğraması durumunda bilgilendirilme isteğinde bulunabilir. Cihazın kendisini dünyada ne zaman bulabilmesinin değiştiğini algılamak için LocatabilityChanged olayına kaydolun. AppMain::SetHolographicSpace'den :

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.