Bagikan melalui


Mendapatkan HolographicSpace

Catatan

Artikel ini berkaitan dengan API asli WinRT warisan. Untuk proyek aplikasi asli baru, sebaiknya gunakan OpenXR API.

Kelas HolographicSpace adalah portal Anda ke dunia holografik. Ini mengontrol penyajian imersif, menyediakan data kamera, dan menyediakan akses ke API penalaran spasial. Anda akan membuatnya untuk CoreWindow aplikasi UWP atau HWND aplikasi Win32 Anda.

Menyiapkan ruang holografik

Membuat objek ruang holografik adalah langkah pertama dalam membuat aplikasi Windows Mixed Reality Anda. Aplikasi Windows tradisional dirender ke rantai pertukaran Direct3D yang dibuat untuk jendela inti tampilan aplikasi mereka. Rantai pertukaran ini ditampilkan ke slate di UI holografik. Untuk membuat aplikasi Anda melihat holografik daripada slate 2D, buat ruang holografik untuk jendela intinya alih-alih rantai pertukaran. Menyajikan bingkai holografik yang dibuat oleh ruang holografik ini menempatkan aplikasi Anda ke dalam mode penyajian layar penuh.

Untuk aplikasi UWP mulai dari templat Holographic DirectX 11 App (Universal Windows), cari kode ini dalam metode SetWindow di AppView.cpp:

m_holographicSpace = HolographicSpace::CreateForCoreWindow(window);

Jika Anda membuat aplikasi Win32 mulai dari sampel BasicHologram Win32, lihat App::CreateWindowAndHolographicSpace untuk contoh HWND. Anda kemudian dapat mengonversinya menjadi HWND imersif dengan membuat HolographicSpace terkait:

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

Setelah Anda mendapatkan HolographicSpace untuk UWP CoreWindow atau Win32 HWND, HolographicSpace dapat menangani kamera holografik, membuat sistem koordinat, dan melakukan penyajian holografik. Ruang holografik saat ini digunakan di beberapa tempat di templat DirectX:

  • Kelas DeviceResources perlu mendapatkan beberapa informasi dari objek HolographicSpace untuk membuat perangkat Direct3D. Ini adalah ID adaptor DXGI yang terkait dengan tampilan holografik. Kelas HolographicSpace menggunakan perangkat Direct3D 11 aplikasi Anda untuk membuat dan mengelola sumber daya berbasis perangkat, seperti buffer belakang untuk setiap kamera holografik. Jika Anda tertarik untuk melihat fungsi ini di bawah tenda, Anda akan menemukannya di DeviceResources.cpp.
  • Fungsi DeviceResources::InitializeUsingHolographicSpace menunjukkan cara mendapatkan adaptor dengan mencari LUID - dan cara memilih adaptor default ketika tidak ada adaptor pilihan yang ditentukan.
  • Kelas utama aplikasi menggunakan ruang holografik dari AppView::SetWindow atau App::CreateWindowAndHolographicSpace untuk pembaruan dan penyajian.

Catatan

Meskipun bagian di bawah ini menyebutkan nama fungsi dari templat seperti AppView::SetWindow yang mengasumsikan bahwa Anda memulai dari templat aplikasi UWP holografik, cuplikan kode yang Anda lihat akan berlaku sama di seluruh aplikasi UWP dan Win32.

Selanjutnya, kita akan menyelami proses penyiapan yang bertanggung jawab untuk SetHolographicSpace di kelas AppMain.

Berlangganan peristiwa kamera, membuat, dan menghapus sumber daya kamera

Konten holografik aplikasi Anda berada di ruang holografiknya, dan dilihat melalui satu atau beberapa kamera holografik, yang mewakili perspektif yang berbeda di tempat kejadian. Sekarang setelah Anda memiliki ruang holografik, Anda dapat menerima data untuk kamera holografik.

Aplikasi Anda perlu merespons peristiwa CameraAdded dengan membuat sumber daya apa pun yang khusus untuk kamera tersebut. Contoh sumber daya tersebut adalah tampilan target render buffer belakang Anda. Anda dapat melihat kode ini di fungsi DeviceResources::SetHolographicSpace , yang dipanggil oleh AppView::SetWindow sebelum aplikasi membuat bingkai holografik apa pun:

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

Aplikasi Anda juga perlu merespons peristiwa CameraRemoved dengan merilis sumber daya yang dibuat untuk kamera tersebut.

Dari DeviceResources::SetHolographicSpace:

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

Penanganan aktivitas harus menyelesaikan beberapa pekerjaan agar penyajian holografik tetap mengalir dengan lancar, dan penyajian aplikasi Anda sama sekali. Baca kode dan komentar untuk detailnya: Anda dapat mencari OnCameraAdded dan OnCameraRemoved di kelas utama Anda untuk memahami bagaimana peta m_cameraResources ditangani oleh DeviceResources.

Saat ini, kami berfokus pada AppMain dan penyiapan yang dilakukannya untuk memungkinkan aplikasi Anda mengetahui tentang kamera holografik. Dengan mengingat hal ini, penting untuk mencatat dua persyaratan berikut:

  1. Untuk penanganan aktivitas CameraAdded, aplikasi dapat bekerja secara asinkron untuk menyelesaikan pembuatan sumber daya dan memuat aset untuk kamera holografik baru. Aplikasi yang membutuhkan lebih dari satu bingkai untuk menyelesaikan pekerjaan ini harus meminta penangguhan, dan menyelesaikan penangguhan setelah memuat secara asinkron. Tugas PPL dapat digunakan untuk melakukan pekerjaan asinkron. Aplikasi Anda harus memastikan bahwa aplikasi siap untuk segera dirender ke kamera tersebut saat keluar dari penanganan aktivitas, atau ketika selesai menunggak. Keluar dari penanganan aktivitas atau menyelesaikan penundaan memberi tahu sistem bahwa aplikasi Anda sekarang siap untuk menerima bingkai holografik dengan kamera tersebut disertakan.

  2. Ketika aplikasi menerima peristiwa CameraRemoved , aplikasi harus merilis semua referensi ke buffer belakang dan segera keluar dari fungsi. Ini termasuk merender tampilan target, dan sumber daya lain yang mungkin menyimpan referensi ke IDXGIResource. Aplikasi ini juga harus memastikan bahwa buffer belakang tidak dilampirkan sebagai target render, seperti yang ditunjukkan di CameraResources::ReleaseResourcesForBackBuffer. Untuk membantu mempercepat hal-hal, aplikasi Anda dapat merilis buffer belakang dan kemudian meluncurkan tugas untuk menyelesaikan pekerjaan lain yang dirobohkan secara asinkron untuk kamera. Templat aplikasi holografik menyertakan tugas PPL yang dapat Anda gunakan untuk tujuan ini.

Catatan

Jika Anda ingin menentukan kapan kamera yang ditambahkan atau dihapus muncul pada bingkai, gunakan properti HolographicFrame AddedCameras dan RemovedCameras .

Membuat bingkai referensi untuk konten holografik Anda

Konten aplikasi Anda harus diposisikan dalam sistem koordinat spasial untuk dirender di HolographicSpace. Sistem ini menyediakan dua bingkai referensi utama, yang dapat Anda gunakan untuk membuat sistem koordinat untuk hologram Anda.

Ada dua jenis bingkai referensi di Windows Holographic: bingkai referensi yang terpasang pada perangkat, dan bingkai referensi yang tetap stasioner saat perangkat bergerak melalui lingkungan pengguna. Templat aplikasi holografik menggunakan bingkai referensi stasioner secara default; ini adalah salah satu cara paling sederhana untuk merender hologram yang terkunci di dunia.

Bingkai referensi stasioner dirancang untuk menstabilkan posisi di dekat lokasi perangkat saat ini. Ini berarti bahwa koordinat lebih lanjut dari perangkat dapat menyimpang sedikit relatif terhadap lingkungan pengguna karena perangkat mempelajari lebih lanjut tentang ruang di sekitarnya. Ada dua cara untuk membuat bingkai referensi stasioner: memperoleh sistem koordinat dari tahap spasial, atau menggunakan SpatialLocator default. Jika Anda membuat aplikasi Windows Mixed Reality untuk headset imersif, titik awal yang direkomendasikan adalah tahap spasial. Tahap spasial juga memberikan informasi tentang kemampuan headset imersif yang dikenakan oleh pemain. Di sini, kami menunjukkan cara menggunakan SpatialLocator default.

Pencari spasial mewakili perangkat Windows Mixed Reality, dan melacak gerakan perangkat dan menyediakan sistem koordinat yang dapat dipahami relatif terhadap lokasinya.

Dari AppMain::OnHolographicDisplayIsAvailableChanged:

spatialLocator = SpatialLocator::GetDefault();

Buat bingkai referensi stasioner sekali saat aplikasi diluncurkan. Ini dianalogikan untuk menentukan sistem koordinat dunia, dengan asal ditempatkan pada posisi perangkat saat aplikasi diluncurkan. Bingkai referensi ini tidak berpindah dengan perangkat.

Dari AppMain::SetHolographicSpace:

m_stationaryReferenceFrame =
    m_spatialLocator.CreateStationaryFrameOfReferenceAtCurrentLocation();

Semua bingkai referensi selaras dengan gravitasi, yang berarti bahwa titik sumbu y "naik" sehubungan dengan lingkungan pengguna. Karena Windows menggunakan sistem koordinat "tangan kanan", arah sumbu –z bertepatan dengan arah "maju" yang dihadapi perangkat saat bingkai referensi dibuat.

Catatan

Saat aplikasi Anda memerlukan penempatan hologram individual yang tepat, gunakan SpatialAnchor untuk menjangkar hologram individu ke posisi di dunia nyata. Misalnya, gunakan jangkar spasial saat pengguna menunjukkan titik yang menarik. Posisi jangkar tidak menyimpang, tetapi dapat disesuaikan. Secara default, ketika jangkar disesuaikan, itu memudahkan posisinya ke tempat di atas beberapa bingkai berikutnya setelah koreksi terjadi. Tergantung pada aplikasi Anda, ketika ini terjadi, Anda mungkin ingin menangani penyesuaian dengan cara yang berbeda (misalnya dengan menugasinya sampai hologram tidak terlihat). Properti RawCoordinateSystem dan peristiwa RawCoordinateSystemAdjusted memungkinkan penyesuaian ini.

Menanggapi peristiwa yang diubah ketercarian

Merender hologram yang terkunci di dunia mengharuskan perangkat menemukan dirinya sendiri di dunia. Ini mungkin tidak selalu dimungkinkan karena kondisi lingkungan, dan jika demikian, pengguna mungkin mengharapkan indikasi visual dari gangguan pelacakan. Indikasi visual ini harus dirender menggunakan bingkai referensi yang terpasang pada perangkat, alih-alih stasioner ke dunia.

Aplikasi Anda dapat meminta untuk diberi tahu jika pelacakan terganggu karena alasan apa pun. Daftar untuk peristiwa LocatabilityChanged untuk mendeteksi kapan kemampuan perangkat untuk menemukan dirinya sendiri di dunia berubah. Dari AppMain::SetHolographicSpace:

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

Kemudian gunakan peristiwa ini untuk menentukan kapan hologram tidak dapat dirender secara stasioner ke dunia.

Lihat juga