Att få dina hologram att stanna kvar, flytta med dig eller i vissa fall placera sig i förhållande till andra hologram är en stor del av skapandet av Mixed Reality-program. Den här artikeln tar dig igenom vår rekommenderade lösning med hjälp av World Locking Tools, men vi går även igenom hur du konfigurerar rumsliga fästpunkter manuellt i dina Unity-projekt. Innan vi går in i någon kod är det viktigt att förstå hur Unity hanterar koordinatutrymme och fästpunkter i sin egen motor.
Koordinatsystem i världsskala
I dag, när du skriver spel, datavisualiseringsappar eller appar för virtuell verklighet, är den typiska metoden att upprätta ett absolut världskoordinatsystem som alla andra koordinater på ett tillförlitligt sätt kan mappas tillbaka till. I den miljön kan du alltid hitta en stabil transformering som definierar en relation mellan två objekt i den världen. Om du inte flyttade objekten förblir deras relativa transformeringar alltid desamma. Den här typen av globalt koordinatsystem är lätt att få rätt när du återger en rent virtuell värld där du känner till all geometri i förväg. VR-appar i rumsskala etablerar idag vanligtvis den här typen av absoluta koordinatsystem i rumsskala med sitt ursprung på golvet.
Däremot har en untethered mixed reality-enhet som HoloLens en dynamisk sensordriven förståelse av världen och justerar kontinuerligt sin kunskap över tid för användarens omgivning när de går många meter över en hel våning i en byggnad. Om du i världsskala placerar alla dina hologram i ett naivt stelt koordinatsystem skulle dessa hologram sluta glida över tid, antingen baserat på världen eller i förhållande till varandra.
Till exempel kan headsetet för närvarande tro att två platser i världen är 4 meter ifrån varandra, och sedan förfina den förståelsen och lära sig att platserna i själva verket är 3,9 meter ifrån varandra. Om dessa hologram ursprungligen hade placerats 4 meter från varandra i ett enda stelt koordinatsystem, skulle en av dem alltid visas 0,1 meter från den verkliga världen.
Du kan placera rumsliga fästpunkter manuellt i Unity för att behålla ett holograms position i den fysiska världen när användaren är mobil. Detta offrar dock självkonsekvensen i den virtuella världen. Olika fästpunkter rör sig ständigt i förhållande till varandra och rör sig också genom det globala koordinatutrymmet. I det här scenariot blir enkla uppgifter som layout svårt. Fysiksimulering kan också vara problematisk.
WLT (World Locking Tools ) ger dig det bästa av två världar och stabiliserar ett enda stelt koordinatsystem med hjälp av ett internt utbud av rumsliga fästpunkter spridda över hela den virtuella scenen när användaren rör sig runt. WLT analyserar koordinaterna för kameran och dessa spatiala fästpunkter varje bildruta. I stället för att ändra koordinaterna för allt i världen för att kompensera för korrigeringarna i koordinaterna för användarens huvud, korrigerar WLT bara huvudets koordinater i stället.
World Locking Tools tillhandahåller ett stabilt koordinatsystem som minimerar de synliga inkonsekvenserna mellan virtuella och verkliga markörer. World Locking Tools låser hela scenen med en delad pool med fästpunkter, i stället för att låsa varje grupp med objekt med gruppens egna individuella fästpunkt.
World Locking Tools hanterar automatiskt internt skapande och hantering av rumsliga fästpunkter. Du behöver inte interagera med ARAnchorManager eller WorldAnchor för att hålla dina hologram världslåsta.
Använd ARAnchorManager för Unity 2019/2020 med hjälp av OpenXR eller Windows XR-plugin-programmet.
För äldre Unity-versioner eller WSA-projekt använder du WorldAnchor.
Kom igång med World Locking Tools genom att ladda ned funktionsverktyget för Mixed Reality. Mer information om grunderna finns på den huvudsakliga dokumentationssidan för World Locking Tools för länkar till Översikt, Snabbstart och andra användbara ämnen.
När projektet är klart kör du verktyget konfigurera scen från Mixed Reality > World Locking Tools:
Viktigt!
Verktyget Konfigurera scen kan köras igen när som helst. Det bör till exempel köras igen om AR-målet har ändrats från Äldre till XR SDK. Om scenen redan är korrekt konfigurerad har det ingen effekt att köra verktyget.
Visualiserare
Under tidig utveckling kan det vara bra att lägga till visualiserare för att säkerställa att WLT är konfigurerat och fungerar korrekt. De kan tas bort för produktionsprestanda, eller om de av någon anledning inte längre behövs med verktyget Ta bort visualiserare. Mer information om visualiseringarna finns i verktygsdokumentationen.
Plugin-programmet Mixed Reality OpenXR tillhandahåller grundläggande ankarfunktioner genom en implementering av Unitys ARFoundation ARAnchorManager. Om du vill lära dig grunderna om ARAnchors i ARFoundation går du till ARFoundation Manual för AR Anchor Manager.
I äldre Unity-versioner skapar du en spatial fästpunkt genom att lägga till Komponenten WorldAnchor Unity i en GameObject.
Lägga till en världsankare
Om du vill lägga till ett världsankare anropar AddComponent<WorldAnchor>() du spelobjektet med den transformering som du vill förankra i den verkliga världen.
Det här spelobjektet är nu förankrat på sin nuvarande plats i den fysiska världen. Du kan se dess Unity-världskoordinater justeras något över tid för att säkerställa fysisk justering. Se läsa in en världsankare för att hitta den här förankrade platsen igen i en framtida appsession.
Ta bort en världsankare
Om du inte längre vill ha låst GameObject till en fysisk plats och inte tänker flytta den här ramen anropar Destroy du World Anchor-komponenten.
Destroy(gameObject.GetComponent<WorldAnchor>());
Om du vill flytta den GameObject här ramen anropar DestroyImmediate du i stället.
En Världsankare kanske inte är locatable i den fysiska världen vid en tidpunkt. Unity uppdaterar sedan inte transformering av det förankrade objektet. Den här situationen kan också inträffa när en app körs. Om det inte går att hantera ändringen i locatability visas objektet inte på rätt fysisk plats i världen.
Meddelas om ändringar i locatability:
Prenumerera på OnTrackingChanged händelsen. Händelsen OnTrackingChanged anropas när den underliggande rumsliga fästpunkten ändras mellan ett tillstånd av att vara locatable eller inte vara 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);
}
Om fästpunkterna finns omedelbart anges fästpunktsegenskapen isLocated till true när AddComponent<WorldAnchor>() den returneras. Därför OnTrackingChanged utlöses inte händelsen. Ett renare mönster är att anropa OnTrackingChanged hanteraren med det inledande IsLocated tillståndet efter att en fästpunkt har kopplats.
Spatiala fästpunkter sparar hologram i verkligt utrymme mellan programsessioner. När de har sparats i HoloLens-fästpunktsarkivet kan rumsliga fästpunkter hittas och läsas in i olika sessioner och är en idealisk reserv när det inte finns någon Internetanslutning.
Viktigt!
Lokala fästpunkter lagras på enheten, medan Azure Spatial Anchors lagras i molnet. Du kan ha lokala fästpunkter och Azure-fästpunkter i samma projekt utan konflikt. Mer information om hur du integrerar Azure-molntjänster för att lagra dina fästpunkter finns i Azure Spatial Anchors.
Som standard återställer World Locking Tools Unitys koordinatsystem i förhållande till den fysiska världen mellan sessioner på enheter som stöder beständighet av lokala rumsliga fästpunkter. Om du vill att ett hologram ska visas på samma plats i den fysiska världen efter att programmet har avslutats och körts på nytt behöver programmet bara återställa samma pose till hologrammet.
Om programmet behöver finare kontroll kan du inaktivera Spara automatiskt och läsa in automatiskt i inspektören och hantera beständighet från ett skript. Mer information finns i Spara rumsliga koordinatsystem.
World Locking Tools stöder endast lokal ankarpers på HoloLens-enheter. För Android-, iOS- och HoloLens-enheter kan du integrera med Azure Spatial Anchors för att stödja beständighet och delning av koordinatutrymmen mellan sessioner och enheter. Mer information och exempel med hjälp av World Locking Tools med Azure Spatial Anchors finns i World Locking Tools (WLT) kombinerat med Azure Spatial Anchors (ASA).
Ett API som kallas XRAnchorStore gör att fästpunkter kan bevaras mellan sessioner. XRAnchorStore är en representation av de sparade fästpunkterna på en enhet. Du kan spara fästpunkter från ARAnchors i Unity-scenen, läsa in fästpunkter från lagringen till nya ARAnchorseller ta bort fästpunkter från lagringen.
Kommentar
Du sparar och läser in dessa fästpunkter på samma enhet. Fästpunkter mellan enheter stöds via Azure Spatial Anchors.
Namnrymder
För Unity 2020 och OpenXR:
using Microsoft.MixedReality.ARSubsystems.XRAnchorStore
eller Unity 2019/2020 + Windows XR Plugin:
using UnityEngine.XR.WindowsMR.XRAnchorStore
Offentliga metoder
{
// 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);
}
Hämta en referens för fästpunktsarkiv
Om du vill läsa in XRAnchorStore med Unity 2020 och OpenXR använder du tilläggsmetoden på XRAnchorSubsystem, undersystemet för en ARAnchorManager:
public static Task<XRAnchorStore> LoadAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem)
Om du vill läsa in XRAnchorStore med Unity 2019/2020 och Windows XR-plugin-programmet använder du tilläggsmetoden på XRReferencePointSubsystem (Unity 2019) eller XRAnchorSubsystem (Unity 2020), undersystemet för en 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);
Läsa in ett fästpunktslager
Om du vill läsa in ett ankararkiv i Unity 2020 och OpenXR kan du komma åt det från en ARAnchorManagers undersystem på följande sätt:
Om du vill se ett fullständigt exempel på bestående/opersisterande fästpunkter kan du titta på Anchors -> Anchors Sample GameObject och AnchorsSample.cs skriptet i [Mixed Reality OpenXR Plugin Sample Scene]((https://github.com/microsoft/OpenXR-Unity-MixedReality-Samples):
För hologrampersistence i äldre Unity-versioner eller WSA-projekt använder du WorldAnchor.
WorldAnchorStore skapar holografiska upplevelser där hologram förblir i specifika verkliga positioner mellan instanser av programmet. Användare kan fästa enskilda hologram var de vill och hitta dem senare på samma plats under appsessioner.
Låter WorldAnchorStore dig bevara platsen för världens fästpunkter mellan sessioner. Om du vill spara hologram mellan sessioner kan du hålla separat koll på dem med hjälp av GameObjects ett visst världsankare. Du kan skapa en GameObject rot med en världsankare och fästpunkt för underordnade hologram med en lokal positionsförskjutning.
Så här läser du in hologram från tidigare sessioner:
WorldAnchorStoreHämta .
Läs in appdata för världsankare, vilket ger dig ID:t för världsankaret.
Läs in fästpunkten för världen med dess ID.
Så här sparar du hologram för framtida sessioner:
WorldAnchorStoreHämta .
Spara en världsankare och ange ett ID.
Spara appdata som är relaterade till världsankaret tillsammans med ID:t.
Hämta WorldAnchorStore
Behåll en referens till , så att WorldAnchorStoredu vet när den är redo att utföra en åtgärd. Eftersom det här anropet är asynkront kan du anropa så fort appen startas:
WorldAnchorStore.GetAsync(StoreLoaded);
StoreLoaded är hanteraren när inläsningen WorldAnchorStore är klar:
Nu har du en referens till , WorldAnchorStoresom du kan använda för att spara och läsa in specifika fästpunkter för världen.
Spara en världsankare
För att rädda ett världsankare, namnge världens ankare och skicka det i WorldAnchorStore det du fick tidigare. Om du försöker spara två fästpunkter i samma sträng store.Save returneras false. Ta bort föregående spara innan du sparar en ny.
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);
}
}
Läs in en världsankare
Så här läser du in en världsankare:
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.
}
}
Du kan också använda store.Delete() för att ta bort en fästpunkt som du sparade tidigare och store.Clear() för att ta bort alla tidigare sparade data.
Räkna upp befintliga fästpunkter
Om du vill visa lagrade fästpunkter anropar du GetAllIds.
string[] ids = this.store.GetAllIds();
for (int index = 0; index < ids.Length; index++)
{
Debug.Log(ids[index]);
}
Spara hologram för flera enheter
Du kan använda Azure Spatial Anchors för att skapa en hållbar molnankare från en lokal fästpunkt i världen. Din app kan hitta molnankaret på flera HoloLens-, iOS- och Android-enheter, även om enheterna inte är tillsammans samtidigt. Eftersom molnankare är beständiga kan flera enheter se innehåll som återges i förhållande till fästpunkten på samma fysiska plats över tid.