Ottenere gli ologrammi per rimanere al posto, spostarsi con l'utente 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 mondiale, ma verranno anche illustrati manualmente la configurazione degli ancoraggi spaziali nei progetti Unity. Prima di passare a qualsiasi codice, è importante comprendere come Unity gestisce lo spazio di 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 mondiale assoluto a cui tutte le altre coordinate possono eseguire in modo affidabile il mapping. In tale ambiente è sempre possibile trovare una trasformazione stabile che definisce una relazione tra due oggetti in tale mondo. Se questi oggetti non sono stati spostati, le trasformazioni relative rimangono sempre uguali. Questo tipo di sistema di coordinate globale è facile da ottenere correttamente quando si esegue il rendering di un mondo puramente virtuale in cui si conosce tutta la geometria in anticipo. Le app VR su scala sala oggi stabiliscono in genere questo tipo di sistema di coordinate su scala camera assoluta con la sua origine sul pavimento.
Al contrario, un dispositivo di realtà mista non gestito, ad esempio HoloLens, ha una comprensione dinamica basata su sensore del mondo, modificando continuamente la sua conoscenza 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 rigide naïve, tali ologrammi finirebbero per derivare nel tempo, in base al mondo o rispetto all'uno all'altro.
Ad esempio, il visore può attualmente credere che due posizioni del mondo siano a 4 metri di distanza, e poi perfezionare tale comprensione, imparare che le posizioni sono effettivamente 3,9 metri a parte. Se questi ologrammi erano stati inizialmente posizionati 4 metri a parte in un unico sistema di coordinate rigide, uno di loro apparirebbe sempre 0,1 metri fuori dal mondo reale.
È possibile posizionare manualmente ancoraggi spaziali in Unity per mantenere la posizione di un ologramma nel mondo fisico quando l'utente è mobile. Tuttavia, questo sacrifica l'autosistenza all'interno del mondo virtuale. Gli ancoraggi diversi si spostano costantemente in relazione 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 fisica può anche essere problematica.
World Locking Tools (WLT) ti ottiene il meglio di entrambi i mondi, stabilizzando un singolo sistema di coordinate rigide usando un'offerta interna di ancoraggi spaziali distribuiti in tutta la scena virtuale mentre l'utente si sposta intorno. WLT analizza le coordinate della fotocamera e quelle ancoraggi spaziali ogni fotogramma. Invece di modificare le coordinate di tutto il mondo per compensare le correzioni nelle coordinate della testa dell'utente, WLT corregge le coordinate della testa.
World Locking Tools offre 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, anziché bloccare ogni gruppo di oggetti con l'ancoraggio individuale del gruppo.
World Locking Tools gestisce automaticamente la creazione interna e la gestione degli ancoraggi spaziali. Non è necessario interagire con ARAnchorManager o WorldAnchor per mantenere bloccati gli ologrammi.
Per Unity 2019/2020 usando OpenXR o il plug-in Windows XR, usare ARAnchorManager.
Per le versioni precedenti di Unity o i progetti WSA, usare WorldAnchor.
Per iniziare a usare gli strumenti di blocco mondiale, scaricare lo strumento di funzionalità Realtà mista. Per altre informazioni sulle nozioni di base, vedere la pagina principale degli strumenti di blocco mondiale per i collegamenti a Panoramica, Guida introduttiva e altri argomenti utili.
Quando il progetto è pronto per andare, 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 eseguito nuovamente 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 garantire che WLT sia configurato e funzionante correttamente. Possono essere rimossi per le prestazioni di produzione o se per qualsiasi motivo non sono più necessari, usando l'utilità Rimuovi visualizzatori. Altre informazioni sui visualizzatori sono disponibili nella documentazione degli 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
Nelle versioni precedenti di Unity si crea un ancoraggio spaziale aggiungendo il componente WorldAnchor Unity a un GameObject.
Aggiungere un ancoraggio mondiale
Per aggiungere un ancoraggio mondiale, chiamare AddComponent<WorldAnchor>() l'oggetto gioco con la trasformazione che si vuole ancorare nel mondo reale.
Questo oggetto gioco è ora ancorato alla sua posizione corrente nel mondo fisico. È possibile che le coordinate del mondo unity vengano modificate leggermente nel tempo per garantire l'allineamento fisico. Vedere caricare un ancoraggio mondiale per trovare nuovamente questa posizione ancorata in una sessione di app futura.
Rimuovere un ancoraggio mondiale
Se non si vuole più che il GameObject blocco in una posizione fisica del mondo e non si intenda spostare questa cornice, chiamare Destroy il componente Ancoraggio mondiale.
Destroy(gameObject.GetComponent<WorldAnchor>());
Se si vuole spostare il GameObject frame, chiamare DestroyImmediate invece.
Un ancoraggio mondiale potrebbe non essere locabile nel mondo fisico in un momento. Unity non aggiornerà quindi la trasformazione dell'oggetto ancorato. Questa situazione può verificarsi anche durante l'esecuzione di un'app. L'errore di gestire la modifica nella localizzazione causa la mancata visualizzazione dell'oggetto nella posizione fisica corretta nel mondo.
Per ricevere una notifica sulle modifiche alla localizzazione:
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>() restituisce. Pertanto, l'evento OnTrackingChanged non viene attivato. Un modello più pulito consiste nel chiamare il gestore con lo OnTrackingChanged stato iniziale IsLocated dopo aver collegato un ancoraggio.
Gli ancoraggi spaziali salvano gli ologrammi nello spazio reale tra le sessioni dell'applicazione. Una volta salvato nell'archivio ancoraggi HoloLens, gli ancoraggi spaziali possono essere trovati e caricati in sessioni diverse e sono un fallback ideale quando non esiste 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 disporre di 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 mondiale ripristinano il sistema di coordinate di Unity rispetto al mondo fisico tra le sessioni nei dispositivi che supportano la persistenza degli ancoraggi spaziali locali. Per avere un ologramma visualizzato nello stesso posto nel mondo fisico dopo aver terminato e riordinato l'applicazione, l'applicazione deve ripristinare la stessa posa all'ologramma.
Se l'applicazione richiede un controllo più corretto, è possibile disabilitare Il salvataggio automatico e il caricamento automatico nel controllo e gestire la persistenza da uno script. Per altre informazioni, vedere Rendere persistenti i sistemi di coordinate spaziali.
World Locking Tools supporta la persistenza di ancoraggio locale solo nei dispositivi HoloLens. Per i dispositivi Android, iOS e HoloLens, integrare 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 usando gli strumenti di blocco mondiale con ancoraggi nello spazio di Azure, vedere Strumenti di blocco globale (WLT) combinati con ancoraggi nello spazio di Azure (ASA).
Un'API denominata consente XRAnchorStore di rendere persistenti gli ancoraggi tra le sessioni. È XRAnchorStore una rappresentazione degli ancoraggi salvati in un dispositivo. È possibile rendere persistenti gli ancoraggi dalla ARAnchors scena Unity, caricare ancoraggi dall'archiviazione in nuovi ARAnchorsancoraggi o eliminare ancoraggi dall'archiviazione.
Nota
Si salvano e caricano questi ancoraggi nello stesso dispositivo. Gli ancoraggi tra dispositivi sono supportati tramite Ancoraggi nello spazio di Azure.
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 ancoraggio
Per caricare XRAnchorStore con Unity 2020 e OpenXR, usare il metodo di estensione nel sistema XRAnchorSubsystem, il sottosistema di un 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 nel sistema XRReferencePointSubsystem (Unity 2019) o XRAnchorSubsystem (Unity 2020), il sottosistema di un 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 ancoraggi
Per caricare un archivio ancoraggi in Unity 2020 e OpenXR, accedervi dal sottosistema ARAnchorManager come indicato di seguito:
Per visualizzare un esempio completo di ancoraggi persistenti o non persistenti, vedere ancoraggi -> Ancoraggi di esempio GameObject e AnchorsSample.cs nello script [Realtà mista OpenXR Plugin Sample](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 Class:WorldAnchorStore
WorldAnchorStore crea esperienze olografiche in cui gli ologrammi rimangono in posizioni reali specifiche tra istanze dell'applicazione. Gli utenti possono aggiungere singoli ologrammi ovunque desiderino e trovarli più avanti nello stesso punto nelle sessioni dell'app.
Consente WorldAnchorStore di mantenere la posizione degli ancoraggi del mondo tra sessioni. Per rendere persistenti gli ologrammi tra le sessioni, tenere traccia separata di GameObjects che usa un particolare ancoraggio mondiale. È possibile creare una radice con un GameObject ancoraggio del mondo 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 mondiale, che fornisce l'ID dell'ancoraggio mondiale.
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 mondiale, specificando un ID.
Salvare i dati dell'app correlati all'ancoraggio mondiale 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 di mondo specifici.
Salvare un ancoraggio mondiale
Per salvare un ancoraggio mondiale, assegnare un nome all'ancoraggio WorldAnchorStore del mondo e passarlo prima. Se si tenta di salvare due ancoraggi nella stessa stringa, store.Save restituisce false. Eliminare il salvataggio precedente prima di salvare uno 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 mondiale
Per caricare un ancoraggio mondiale:
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() rimuovere tutti i dati salvati in precedenza.
Enumerare ancoraggi esistenti
Per elencare 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 in 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 rendering del contenuto rispetto a tale ancoraggio nella stessa posizione fisica nel tempo.
Passaggi successivi
Condividere uno spazio di coordinate bloccato al mondo: