Membuat hologram Anda tetap di tempat, bergerak bersama Anda, atau dalam beberapa kasus posisi diri mereka relatif terhadap hologram lain adalah bagian besar dari membuat aplikasi Mixed Reality. Artikel ini akan membawa Anda melalui solusi yang direkomendasikan menggunakan Alat Penguncian Dunia, tetapi kami juga akan membahas pengaturan jangkar spasial secara manual dalam proyek Unity Anda. Sebelum kita melompat ke kode apa pun, penting untuk memahami bagaimana Unity menangani ruang koordinat dan jangkar di mesinnya sendiri.
Sistem koordinat skala dunia
Saat ini, saat menulis game, aplikasi visualisasi data, atau aplikasi realitas virtual, pendekatan umumnya adalah membangun satu sistem koordinat dunia absolut yang dapat dipetakan kembali oleh semua koordinat lainnya. Di lingkungan tersebut, Anda selalu dapat menemukan transformasi stabil yang mendefinisikan hubungan antara dua objek di dunia tersebut. Jika Anda tidak memindahkan objek tersebut, transformasi relatifnya akan selalu tetap sama. Sistem koordinat global semacam ini mudah dipahami ketika merender dunia virtual murni di mana Anda mengetahui semua geometri terlebih dahulu. Aplikasi VR skala kamar saat ini biasanya membangun sistem koordinat skala kamar absolut semacam ini dengan asalnya di lantai.
Sebaliknya, perangkat realitas campuran yang tidak tertambat seperti HoloLens memiliki pemahaman dinamis berbasis sensor tentang dunia, terus menyesuaikan pengetahuannya dari waktu ke waktu lingkungan pengguna saat mereka berjalan banyak meter di seluruh lantai bangunan. Dalam pengalaman skala dunia, jika Anda menempatkan semua hologram Anda dalam sistem koordinat kaku yang naif, hologram tersebut akan berakhir melayang dari waktu ke waktu, baik berdasarkan dunia atau relatif satu sama lain.
Misalnya, headset saat ini mungkin percaya dua lokasi di dunia terpisah 4 meter, dan kemudian memperbaiki pemahaman itu, mempelajari bahwa lokasi sebenarnya terpisah 3,9 meter. Jika hologram tersebut awalnya ditempatkan terpisah 4 meter dalam satu sistem koordinat yang kaku, salah satunya kemudian akan selalu muncul 0,1 meter dari dunia nyata.
Anda dapat menempatkan jangkar spasial secara manual di Unity untuk mempertahankan posisi hologram di dunia fisik saat pengguna bergerak. Namun, ini mengorbankan konsistensi diri dalam dunia virtual. Jangkar yang berbeda terus bergerak dalam kaitannya satu sama lain, dan juga bergerak melalui ruang koordinat global. Dalam skenario ini, tugas sederhana seperti tata letak menjadi sulit. Simulasi fisika juga bisa bermasalah.
World Locking Tools (WLT) memberi Anda yang terbaik dari kedua dunia, menstabilkan sistem koordinat yang kaku tunggal menggunakan pasokan internal jangkar spasial yang tersebar di seluruh adegan virtual saat pengguna bergerak. WLT menganalisis koordinat kamera dan jangkar spasial tersebut setiap bingkai. Alih-alih mengubah koordinat segala sesuatu di dunia untuk mengimbangi koreksi dalam koordinat kepala pengguna, WLT hanya memperbaiki koordinat kepala sebagai gantinya.
Pilih pendekatan penguncian dunia Anda
Jika memungkinkan, gunakan Alat Penguncian Dunia untuk posisi hologram.
Alat Penguncian Dunia menyediakan sistem koordinat stabil yang meminimalkan inkonsistensi yang terlihat antara penanda dunia virtual dan nyata. Alat Penguncian Dunia mengunci seluruh adegan dengan kumpulan jangkar bersama, daripada mengunci setiap grup objek dengan jangkar individual grup sendiri.
Alat Penguncian Dunia secara otomatis menangani pembuatan internal dan manajemen jangkar spasial. Anda tidak perlu berinteraksi dengan ARAnchorManager atau WorldAnchor untuk menjaga hologram Anda tetap terkunci di dunia.
Untuk Unity 2019/2020 menggunakan OpenXR atau Plugin Windows XR, gunakan ARAnchorManager.
Untuk versi Unity atau proyek WSA yang lebih lama, gunakan WorldAnchor.
Untuk mulai menggunakan World Locking Tools, unduh Mixed Reality Feature Tool. Untuk mempelajari selengkapnya tentang dasar-dasarnya, lihat halaman dokumentasi Alat Penguncian Dunia utama untuk tautan ke Gambaran Umum, Mulai Cepat, dan topik berguna lainnya.
Saat proyek Anda siap dijalankan, jalankan utilitas konfigurasi adegan dari Mixed Reality > World Locking Tools:
Penting
Utilitas Konfigurasi adegan dapat dijalankan ulang kapan saja. Misalnya, harus dijalankan ulang jika target AR telah diubah dari Warisan ke XR SDK. Jika adegan sudah dikonfigurasi dengan benar, menjalankan utilitas tidak berpengaruh.
Visualizer
Selama pengembangan dini, menambahkan visualizer dapat membantu untuk memastikan WLT disiapkan dan berfungsi dengan baik. Mereka dapat dihapus untuk performa produksi, atau jika karena alasan apa pun tidak lagi diperlukan, menggunakan utilitas Hapus visualizer. Detail selengkapnya tentang visualizer dapat ditemukan dalam dokumentasi Alat.
Plugin Mixed Reality OpenXR menyediakan fungsionalitas jangkar dasar melalui implementasi ARAnchorManager ARFoundation Unity. Untuk mempelajari dasar-dasar tentang ARAnchors di ARFoundation, kunjungi Panduan ARFoundation untuk AR Anchor Manager.
Namespace:UnityEngine.XR.WSA Jenis:WorldAnchor
Teknik utamanya adalah membuat jangkar spasial untuk mengunci kluster hologram tepatnya di tempat di dunia fisik, tidak peduli seberapa jauh pengguna telah menjelajah, dan kemudian menemukan hologram tersebut lagi di sesi selanjutnya.
Dalam versi Unity yang lebih lama, Anda membuat jangkar spasial dengan menambahkan komponen WorldAnchor Unity ke GameObject.
Menambahkan Jangkar Dunia
Untuk menambahkan jangkar dunia, panggil AddComponent<WorldAnchor>() objek game dengan transformasi yang ingin Anda jangkar di dunia nyata.
Objek game ini sekarang berlabuh ke lokasinya saat ini di dunia fisik. Anda mungkin melihat koordinat dunia Unity-nya sedikit menyesuaikan dari waktu ke waktu untuk memastikan keselarasan fisik. Lihat memuat jangkar dunia untuk menemukan lokasi berlabuh ini lagi dalam sesi aplikasi di masa mendatang.
Menghapus Jangkar Dunia
Jika Anda tidak lagi ingin GameObject terkunci ke lokasi dunia fisik dan tidak berniat memindahkannya bingkai ini, panggil Destroy komponen World Anchor.
Destroy(gameObject.GetComponent<WorldAnchor>());
Jika Anda ingin memindahkan GameObject bingkai ini, panggil DestroyImmediate sebagai gantinya.
Jangkar Dunia mungkin tidak dapat di-locatable di dunia fisik pada titik waktu tertentu. Unity kemudian tidak akan memperbarui transformasi objek berlabuh. Situasi ini juga dapat terjadi saat aplikasi sedang berjalan. Kegagalan untuk menangani perubahan ketercarian menyebabkan objek tidak muncul di lokasi fisik yang benar di dunia.
Untuk diberi tahu tentang perubahan ketercarian:
Berlangganan ke OnTrackingChanged acara. Peristiwa OnTrackingChanged ini dipanggil setiap kali jangkar spasial yang mendasarinya berubah antara keadaan dapat di-locatable atau tidak dapat di-locatable.
private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
// This simply activates/deactivates this object and all children when tracking changes
self.gameObject.SetActiveRecursively(located);
}
Jika jangkar segera ditemukan, isLocated properti jangkar diatur ke true saat AddComponent<WorldAnchor>() kembali. Oleh karena itu, OnTrackingChanged peristiwa tidak dipicu. Pola yang lebih bersih adalah memanggil OnTrackingChanged handler dengan status awal IsLocated setelah melampirkan jangkar.
Jangkar spasial menghemat hologram di ruang dunia nyata di antara sesi aplikasi. Setelah disimpan di toko jangkar HoloLens, jangkar spasial dapat ditemukan dan dimuat dalam sesi yang berbeda dan merupakan fallback yang ideal ketika tidak ada konektivitas internet.
Penting
Jangkar lokal disimpan di perangkat, sementara Azure Spatial Anchors disimpan di cloud. Anda dapat memiliki jangkar lokal dan Azure dalam proyek yang sama tanpa konflik. Untuk informasi selengkapnya tentang mengintegrasikan layanan cloud Azure untuk menyimpan jangkar Anda, lihat Azure Spatial Anchors.
Secara default, Alat Penguncian Dunia memulihkan sistem koordinat Unity relatif terhadap dunia fisik di seluruh sesi pada perangkat yang mendukung persistensi jangkar spasial lokal. Agar hologram muncul di tempat yang sama di dunia fisik setelah berhenti dan menjalankan ulang aplikasi, aplikasi hanya perlu memulihkan pose yang sama ke hologram.
Jika aplikasi membutuhkan kontrol yang lebih baik, Anda dapat menonaktifkan Simpan Otomatis dan Muat Otomatis di inspektur, dan mengelola persistensi dari skrip. Untuk informasi selengkapnya, lihat Mempertahankan sistem koordinat spasial.
World Locking Tools hanya mendukung persistensi jangkar lokal pada perangkat HoloLens. Untuk perangkat Android, iOS, dan HoloLens, integrasikan dengan Azure Spatial Anchors untuk mendukung kegigihan dan berbagi ruang koordinat di seluruh sesi dan perangkat. Untuk informasi selengkapnya dan sampel menggunakan Alat Penguncian Dunia dengan Azure Spatial Anchors, lihat World Locking Tools (WLT) yang dikombinasikan dengan Azure Spatial Anchors (ASA).
API yang XRAnchorStore disebut memungkinkan jangkar untuk dipertahankan di antara sesi. XRAnchorStore adalah representasi jangkar yang disimpan pada perangkat. Anda dapat mempertahankan jangkar dari ARAnchors di adegan Unity, memuat jangkar dari penyimpanan ke dalam , atau menghapus jangkar baru ARAnchorsdari penyimpanan.
Catatan
Anda menyimpan dan memuat jangkar ini pada perangkat yang sama. Jangkar lintas perangkat didukung melalui Azure Spatial Anchors.
Namaspace
Untuk Unity 2020 dan OpenXR:
using Microsoft.MixedReality.ARSubsystems.XRAnchorStore
atau Unity 2019/2020 + Plugin Windows XR:
using UnityEngine.XR.WindowsMR.XRAnchorStore
Metode Publik
{
// A list of all persisted anchors, which can be loaded.
public IReadOnlyList<string> PersistedAnchorNames { get; }
// Clear all persisted anchors
public void Clear();
// Load a single persisted anchor by name. The ARAnchorManager will create this new anchor and report it in
// the ARAnchorManager.anchorsChanged event. The TrackableId returned here is the same TrackableId the
// ARAnchor will have when it is instantiated.
public TrackableId LoadAnchor(string name);
// Attempts to persist an existing ARAnchor with the given TrackableId to the local store. Returns true if
// the storage is successful, false otherwise.
public bool TryPersistAnchor(TrackableId id, string name);
// Removes a single persisted anchor from the anchor store. This will not affect any ARAnchors in the Unity
// scene, only the anchors in storage.
public void UnpersistAnchor(string name);
}
Mendapatkan referensi penyimpanan jangkar
Untuk memuat XRAnchorStore dengan Unity 2020 dan OpenXR, gunakan metode ekstensi pada XRAnchorSubsystem, subsistem ARAnchorManager:
public static Task<XRAnchorStore> LoadAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem)
Untuk memuat XRAnchorStore dengan Unity 2019/2020 dan Plugin Windows XR, gunakan metode ekstensi pada XRReferencePointSubsystem (Unity 2019) atau XRAnchorSubsystem (Unity 2020), subsistem ARReferencePointManager/ARAnchorManager:
// Unity 2019 + Windows XR Plugin
public static Task<XRAnchorStore> TryGetAnchorStoreAsync(this XRReferencePointSubsystem anchorSubsystem);
// Unity 2020 + Windows XR Plugin
public static Task<XRAnchorStore> TryGetAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem);
Memuat penyimpanan jangkar
Untuk memuat penyimpanan jangkar di Unity 2020 dan OpenXR, akses dari subsistem ARAnchorManager sebagai berikut:
WorldAnchorStore menciptakan pengalaman holografik di mana hologram tetap berada di posisi dunia nyata tertentu di seluruh instans aplikasi. Pengguna dapat menyematkan hologram individual di mana pun mereka inginkan, dan menemukannya nanti di tempat yang sama melalui sesi aplikasi.
Memungkinkan WorldAnchorStore Anda mempertahankan lokasi jangkar dunia di seluruh sesi. Untuk mempertahankan hologram di seluruh sesi, lacak GameObjects secara terpisah yang menggunakan jangkar dunia tertentu. Anda dapat membuat akar GameObject dengan jangkar dunia, dan jangkar hologram anak dengan itu dengan offset posisi lokal.
Untuk memuat hologram dari sesi sebelumnya:
WorldAnchorStoreDapatkan .
Muat data aplikasi jangkar dunia, yang memberi Anda ID jangkar dunia.
Muat jangkar dunia dengan ID-nya.
Untuk menyimpan hologram untuk sesi mendatang:
WorldAnchorStoreDapatkan .
Simpan jangkar dunia, menentukan ID.
Simpan data aplikasi yang terkait dengan jangkar dunia bersama dengan ID.
Dapatkan WorldAnchorStore
Simpan referensi ke WorldAnchorStore, sehingga Anda tahu kapan siap untuk melakukan operasi. Karena panggilan ini asinkron, segera setelah aplikasi dimulai, Anda dapat memanggil:
WorldAnchorStore.GetAsync(StoreLoaded);
StoreLoaded adalah handler ketika WorldAnchorStore selesai memuat:
Anda sekarang memiliki referensi ke WorldAnchorStore, yang dapat Anda gunakan untuk menyimpan dan memuat jangkar dunia tertentu.
Selamatkan jangkar dunia
Untuk menyelamatkan jangkar dunia, beri nama jangkar dunia dan berikan pada WorldAnchorStore yang kau punya sebelumnya. Jika Anda mencoba menyimpan dua jangkar ke string yang sama, store.Save mengembalikan false. Hapus penyimpanan sebelumnya sebelum menyimpan yang baru.
private void SaveGame()
{
// Save data about holograms that this world anchor positions
if (!this.savedRoot) // Only save the root once
{
this.savedRoot = this.store.Save("rootGameObject", anchor);
Assert(this.savedRoot);
}
}
Memuat jangkar dunia
Untuk memuat jangkar dunia:
private void LoadGame()
{
// Saved data about holograms that this world anchor positions:
this.savedRoot = this.store.Load("rootGameObject", rootGameObject);
if (!this.savedRoot)
{
// Game root not saved. Re-place objects or start over.
}
}
Anda juga dapat menggunakan store.Delete() untuk menghapus jangkar yang sebelumnya Anda simpan, dan store.Clear() untuk menghapus semua data yang disimpan sebelumnya.
Menghitung jangkar yang ada
Untuk mencantumkan jangkar tersimpan, panggil GetAllIds.
string[] ids = this.store.GetAllIds();
for (int index = 0; index < ids.Length; index++)
{
Debug.Log(ids[index]);
}
Mempertahankan hologram untuk beberapa perangkat
Anda dapat menggunakan Azure Spatial Anchors untuk membuat jangkar cloud tahan lama dari jangkar dunia lokal. Aplikasi Anda dapat menemukan jangkar cloud di beberapa perangkat HoloLens, iOS, dan Android, bahkan jika perangkat tidak bersama-sama pada saat yang sama. Karena jangkar cloud persisten, beberapa perangkat dapat melihat konten yang dirender relatif terhadap jangkar tersebut di lokasi fisik yang sama dari waktu ke waktu.