Ottenere gli ologrammi per rimanere sul posto, spostarsi con te o in alcuni casi posizionarsi rispetto ad altri ologrammi è una parte importante della creazione di applicazioni Realtà mista. Questo articolo illustra la soluzione consigliata usando gli strumenti di blocco globale, ma verrà illustrata anche la configurazione manuale degli ancoraggi nello spazio nei progetti Unity. Prima di passare a qualsiasi codice, è importante comprendere in che modo Unity gestisce lo spazio delle coordinate e gli ancoraggi nel proprio motore.
Sistemi di coordinate su scala mondiale
Oggi, quando si scrivono giochi, app di visualizzazione dei dati o app di realtà virtuale, l'approccio tipico consiste nel stabilire un sistema di coordinate globale assoluto in cui tutte le altre coordinate possono mappare in modo affidabile. In tale ambiente è sempre possibile trovare una trasformazione stabile che definisce una relazione tra due oggetti in tale mondo. Se tali oggetti non sono stati spostati, le trasformazioni relative rimarranno sempre invariate. Questo tipo di sistema di coordinate globale è facile da ottenere quando si esegue il rendering di un mondo puramente virtuale in cui si conosce tutta la geometria in anticipo. Le app VR su scala locale oggi stabiliscono in genere questo tipo di sistema di coordinate assoluto a scala di stanza con la sua origine sul pavimento.
Al contrario, un dispositivo di realtà mista senzathering, ad esempio HoloLens, ha una comprensione dinamica basata sui sensori del mondo, modificando continuamente le proprie conoscenze nel tempo dell'ambiente circostante dell'utente mentre camminano molti metri su un intero piano di un edificio. In un'esperienza su scala mondiale, se si inseriscono tutti gli ologrammi in un sistema di coordinate rigido ingenuo, questi ologrammi finirebbero per derivare nel tempo, in base al mondo o rispetto l'uno all'altro.
Ad esempio, il visore VR potrebbe attualmente credere che due posizioni del mondo siano a 4 metri di distanza, e poi perfezionare quella comprensione, imparando che le posizioni sono di fatto a 3,9 metri di distanza. Se questi ologrammi fossero stati inizialmente posizionati a 4 metri di distanza in un unico sistema di coordinate rigido, uno di essi apparirebbe sempre 0,1 metri dal mondo reale.
È possibile posizionare manualmente gli ancoraggi nello spazio in Unity per mantenere la posizione di un ologramma nel mondo fisico quando l'utente è mobile. Tuttavia, questo sacrifica l'auto-coerenza all'interno del mondo virtuale. Gli ancoraggi diversi si spostano costantemente l'uno rispetto all'altro e si spostano anche attraverso lo spazio di coordinate globale. In questo scenario, le attività semplici come il layout diventano difficili. La simulazione della fisica può anche essere problematica.
World Locking Tools (WLT) ti consente di ottenere il meglio di entrambi i mondi, stabilizzando un unico sistema di coordinate rigido usando un'offerta interna di ancoraggi spaziali distribuiti in tutta la scena virtuale mentre l'utente si muove intorno. WLT analizza le coordinate della fotocamera e gli ancoraggi nello spazio di ogni fotogramma. Invece di modificare le coordinate di tutto il mondo per compensare le correzioni nelle coordinate della testa dell'utente, WLT corregge semplicemente le coordinate della testa.
Scegliere l'approccio di blocco globale
Se possibile, usare Gli strumenti di blocco globale per il posizionamento dell'ologramma.
World Locking Tools fornisce un sistema di coordinate stabile che riduce al minimo le incoerenze visibili tra marcatori virtuali e reali. World Locking Tools blocca l'intera scena con un pool condiviso di ancoraggi, invece di bloccare ogni gruppo di oggetti con il proprio ancoraggio individuale del gruppo.
Gli strumenti di blocco globale gestiscono automaticamente la creazione e la gestione interna degli ancoraggi nello spazio. Non è necessario interagire con ARAnchorManager o WorldAnchor per mantenere bloccati gli ologrammi.
Per Unity 2019/2020 usando OpenXR o il plug-in XR di Windows, usare ARAnchorManager.
Per le versioni precedenti di Unity o i progetti WSA, usare WorldAnchor.
Per iniziare a usare gli strumenti di blocco globale, scaricare lo strumento di Realtà mista funzionalità. Per altre informazioni sulle nozioni di base, vedere la pagina principale della documentazione relativa agli strumenti di blocco globale per i collegamenti a Panoramica, Avvio rapido e altri argomenti utili.
Quando il progetto è pronto per l'esecuzione, eseguire l'utilità configura scena da Realtà mista > World Locking Tools:
Importante
L'utilità Configura scena può essere rieseguita in qualsiasi momento. Ad esempio, deve essere rieseguita se la destinazione AR è stata modificata da Legacy a XR SDK. Se la scena è già configurata correttamente, l'esecuzione dell'utilità non ha alcun effetto.
Visualizzatori
Durante lo sviluppo iniziale, l'aggiunta di visualizzatori può essere utile per assicurarsi che WLT sia configurato e funzioni correttamente. Possono essere rimossi per le prestazioni di produzione o se per qualsiasi motivo non sono più necessari, usando l'utilità Rimuovi visualizzatori. Per altre informazioni sui visualizzatori, vedere la documentazione relativa agli strumenti.
Il plug-in OpenXR Realtà mista fornisce funzionalità di ancoraggio di base tramite un'implementazione di ARFoundation ARAnchorManager di Unity. Per informazioni sulle nozioni di base su ARAnchors in ARFoundation, visitare il manuale ARFoundation per AR Anchor Manager.
Spazio dei nomi:UnityEngine.XR.WSA Tipo:WorldAnchor
Una tecnica chiave consiste nel creare un ancoraggio spaziale per bloccare un cluster di ologrammi esattamente sul posto nel mondo fisico, indipendentemente dalla distanza in cui l'utente ha eseguito il roaming e quindi trovare di nuovo tali ologrammi nelle sessioni successive.
Nelle versioni precedenti di Unity si crea un ancoraggio nello spazio aggiungendo il componente Unity WorldAnchor a un GameObject.
Aggiungere un ancoraggio globale
Per aggiungere un ancoraggio al mondo, chiamare AddComponent<WorldAnchor>() sull'oggetto gioco con la trasformazione che vuoi ancorare nel mondo reale.
Questo oggetto gioco è ora ancorato alla posizione corrente nel mondo fisico. È possibile che le coordinate del mondo unity vengano modificate leggermente nel tempo per garantire l'allineamento fisico. Vedi Caricare un ancoraggio globale per trovare di nuovo questa posizione ancorata in una sessione di app futura.
Rimuovere un ancoraggio globale
Se non vuoi più che il GameObject bloccato in una posizione fisica del mondo e non intendi spostarlo, chiama Destroy il componente Ancoraggio globale.
Destroy(gameObject.GetComponent<WorldAnchor>());
Se si desidera spostare il GameObject frame, chiamare DestroyImmediate invece.
Un Ancoraggio globale potrebbe non essere incabile nel mondo fisico in un momento specifico. Unity non aggiornerà quindi la trasformazione dell'oggetto ancorato. Questa situazione può verificarsi anche durante l'esecuzione di un'app. Se non si gestisce la modifica nella individuabilità, l'oggetto non viene visualizzato nella posizione fisica corretta nel mondo.
Per ricevere una notifica sulle modifiche alla individuabilità:
Sottoscrivere l'evento OnTrackingChanged . L'evento OnTrackingChanged viene chiamato ogni volta che l'ancoraggio spaziale sottostante cambia tra uno stato di essere locatable o non essere locabile.
private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
// This simply activates/deactivates this object and all children when tracking changes
self.gameObject.SetActiveRecursively(located);
}
Se gli ancoraggi si trovano immediatamente, la isLocated proprietà dell'ancoraggio viene impostata su true quando AddComponent<WorldAnchor>() viene restituito. Di conseguenza, l'evento OnTrackingChanged non viene attivato. Un modello più pulito consiste nel chiamare il OnTrackingChanged gestore con lo stato iniziale IsLocated dopo aver collegato un ancoraggio.
Gli ancoraggi nello spazio consentono di salvare gli ologrammi nello spazio reale tra le sessioni dell'applicazione. Una volta salvato nell'archivio di ancoraggi HoloLens, gli ancoraggi nello spazio possono essere trovati e caricati in sessioni diverse e sono un fallback ideale quando non è disponibile connettività Internet.
Importante
Gli ancoraggi locali vengono archiviati nel dispositivo, mentre i dati relativi ad Ancoraggi nello spazio di Azure vengono archiviati nel cloud. È possibile avere ancoraggi locali e di Azure nello stesso progetto senza conflitti. Per altre informazioni sull'integrazione dei servizi cloud di Azure per archiviare gli ancoraggi, vedere Ancoraggi nello spazio di Azure.
Per impostazione predefinita, gli strumenti di blocco globale ripristinano il sistema di coordinate di Unity rispetto al mondo fisico tra le sessioni nei dispositivi che supportano la persistenza degli ancoraggi nello spazio locale. Per fare in modo che un ologramma venga visualizzato nella stessa posizione nel mondo fisico dopo la chiusura e la ripetizione dell'applicazione, l'applicazione deve solo ripristinare la stessa posizione all'ologramma.
Se l'applicazione richiede un controllo più corretto, è possibile disabilitare salvataggio automatico e caricamento automatico nel controllo e gestire la persistenza da uno script. Per altre informazioni, vedere Rendere persistenti i sistemi di coordinate spaziali.
Gli strumenti di blocco globale supportano la persistenza dell'ancoraggio locale solo nei dispositivi HoloLens. Per i dispositivi Android, iOS e HoloLens, integrarsi con Ancoraggi nello spazio di Azure per supportare la persistenza e la condivisione di spazi di coordinate tra sessioni e dispositivi. Per altre informazioni ed esempi sull'uso degli strumenti di blocco globale con Ancoraggi nello spazio di Azure, vedere World Locking Tools (WLT) combinato con Ancoraggi nello spazio di Azure.
Un'API denominata consente di XRAnchorStore rendere persistenti gli ancoraggi tra le sessioni. XRAnchorStore è una rappresentazione degli ancoraggi salvati in un dispositivo. È possibile rendere persistenti gli ancoraggi da ARAnchors nella scena unity, caricare ancoraggi dall'archiviazione in nuovi ARAnchorsancoraggi o eliminare ancoraggi dall'archiviazione.
Nota
È possibile salvare e caricare questi ancoraggi nello stesso dispositivo. Gli ancoraggi tra dispositivi sono supportati tramite Ancoraggi nello spazio di Azure.
Namespaces (Spazi dei nomi)
Per Unity 2020 e OpenXR:
using Microsoft.MixedReality.ARSubsystems.XRAnchorStore
o Unity 2019/2020 + Plug-in Windows XR:
using UnityEngine.XR.WindowsMR.XRAnchorStore
Metodi pubblici
{
// 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);
}
Ottenere un riferimento all'archivio di ancoraggi
Per caricare XRAnchorStore con Unity 2020 e OpenXR, usare il metodo di estensione nel sistema XRAnchorSubsystem, il sottosistema di arAnchorManager:
public static Task<XRAnchorStore> LoadAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem)
Per caricare XRAnchorStore con Unity 2019/2020 e il plug-in Windows XR, usare il metodo di estensione in XRReferencePointSubsystem (Unity 2019) o XRAnchorSubsystem (Unity 2020), il sottosistema di 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);
Caricare un archivio di ancoraggi
Per caricare un archivio di ancoraggi in Unity 2020 e OpenXR, accedervi dal sottosistema di ARAnchorManager come indicato di seguito:
Per un esempio completo di ancoraggi persistenti/non persistenti, vedere ancoraggi -> Ancoraggi - GameObject di esempio e AnchorsSample.cs script nella [scena di esempio di plug-in OpenXR Realtà mista]():https://github.com/microsoft/OpenXR-Unity-MixedReality-Samples
Per la persistenza dell'ologramma nelle versioni precedenti di Unity o nei progetti WSA, usare WorldAnchor.
Spazio dei nomi:UnityEngine.XR.WSA.Persistence Classe:WorldAnchorStore
WorldAnchorStore crea esperienze olografiche in cui gli ologrammi rimangono in posizioni reali specifiche in istanze dell'applicazione. Gli utenti possono aggiungere singoli ologrammi ovunque desiderino e trovarli più avanti nello stesso punto nelle sessioni dell'app.
WorldAnchorStore Consente di rendere persistente la posizione degli ancoraggi all'interno delle sessioni. Per rendere persistenti gli ologrammi tra le sessioni, tenere traccia separata di GameObjects che usano un particolare ancoraggio del mondo. È possibile creare una GameObject radice con un ancoraggio globale e ancorare gli ologrammi figlio con un offset di posizione locale.
Per caricare gli ologrammi dalle sessioni precedenti:
Ottenere l'oggetto WorldAnchorStore.
Caricare i dati dell'app di ancoraggio globale, che fornisce l'ID dell'ancoraggio globale.
Caricare l'ancoraggio del mondo in base al relativo ID.
Per salvare gli ologrammi per le sessioni future:
Ottenere l'oggetto WorldAnchorStore.
Salvare un ancoraggio globale, specificando un ID.
Salvare i dati dell'app correlati all'ancoraggio globale insieme all'ID.
Ottenere WorldAnchorStore
Mantenere un riferimento a WorldAnchorStore, in modo da sapere quando è pronto per eseguire un'operazione. Poiché questa chiamata è asincrona, non appena l'app viene avviata, è possibile chiamare:
WorldAnchorStore.GetAsync(StoreLoaded);
StoreLoaded è il gestore al termine del WorldAnchorStore caricamento:
È ora disponibile un riferimento a WorldAnchorStore, che è possibile usare per salvare e caricare ancoraggi del mondo specifici.
Salvare un ancoraggio globale
Per salvare un ancoraggio del mondo, denominare l'ancoraggio del mondo e passarlo nell'elemento WorldAnchorStore precedente. Se si tenta di salvare due ancoraggi nella stessa stringa, store.Save restituisce false. Eliminare il salvataggio precedente prima di salvarlo nuovo.
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);
}
}
Caricare un ancoraggio globale
Per caricare un ancoraggio globale:
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.
}
}
È anche possibile usare store.Delete() per rimuovere un ancoraggio salvato in precedenza e store.Clear() per rimuovere tutti i dati salvati in precedenza.
Enumerare gli ancoraggi esistenti
Per elencare gli ancoraggi archiviati, chiamare GetAllIds.
string[] ids = this.store.GetAllIds();
for (int index = 0; index < ids.Length; index++)
{
Debug.Log(ids[index]);
}
Rendere persistenti gli ologrammi per più dispositivi
È possibile usare Ancoraggi nello spazio di Azure per creare un ancoraggio cloud durevole da un ancoraggio del mondo locale. L'app può individuare l'ancoraggio cloud tra più dispositivi HoloLens, iOS e Android, anche se i dispositivi non sono insieme contemporaneamente. Poiché gli ancoraggi cloud sono persistenti, più dispositivi possono visualizzare il contenuto di cui è stato eseguito il rendering rispetto a tale ancoraggio nella stessa posizione fisica nel tempo.
Passaggi successivi
Condividere uno spazio di coordinate bloccato al mondo: