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 att skapa Mixed Reality program. Den här artikeln tar dig igenom vår rekommenderade lösning med Hjälp av World Locking Tools, men vi kommer också att gå igenom hur du manuellt konfigurerar rumsliga fästpunkter i dina Unity-projekt. Innan vi hoppar 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
När du i dag 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 mappa 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 för världen och justerar kontinuerligt sin kunskap över tid av 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 de hologramen glida över tid, antingen baserat på världen eller i förhållande till varandra.
Headsetet kan till exempel för närvarande tro att två platser i världen är 4 meter från varandra, och sedan förfina den förståelsen senare och lära sig att platserna i själva verket är 3,9 meter frå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 upprätthå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 problematiskt.
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. WLT analyserar koordinaterna för kameran och dessa rumsliga 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 istället.
World Locking Tools tillhandahåller ett stabilt koordinatsystem som minimerar synliga inkonsekvenser 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 enskilda 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.
För Unity 2019/2020 med OpenXR eller Windows XR-plugin-programmet använder du ARAnchorManager.
Använd WorldAnchor för äldre Unity-versioner eller WSA-projekt.
Om du vill komma igång med World Locking Tools laddar du ned Mixed Reality funktionsverktyget. Mer information om grunderna finns på huvudsidan 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 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 visualiseringar för att säkerställa att WLT konfigureras och fungerar korrekt. De kan tas bort för produktionsprestanda eller om de av någon anledning inte längre behövs med hjälp av verktyget Ta bort visualiserare. Mer information om visualiseringarna finns i verktygsdokumentationen.
Mixed Reality OpenXR-plugin-programmet tillhandahåller grundläggande fästpunktsfunktioner genom en implementering av Unitys ARFoundation ARAnchorManager. Om du vill lära dig grunderna om ARAnchors i ARFoundation kan du gå till ARFoundation Manual för AR Anchor Manager.
I äldre Unity-versioner skapar du ett rumsligt fästpunkt genom att lägga till Komponenten WorldAnchor Unity i ett GameObject.
Lägga till ett 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äst vid 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 ett 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åsta GameObject till en fysisk plats och inte tänker flytta den här ramen anropar Destroy du Komponenten World Anchor.
Destroy(gameObject.GetComponent<WorldAnchor>());
Om du vill flytta den GameObject här ramen anropar DestroyImmediate du i stället.
Ett världsankare kanske inte är locatable i den fysiska världen vid en tidpunkt. Unity uppdaterar sedan inte transformeringen 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.The event is called whenever the underlying spatial anchor changes between a state of being locatable or not being 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 placeras omedelbart isLocated anges fästpunktens egenskap 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 ursprungliga IsLocated tillståndet efter att ha kopplat en fästpunkt.
Rumsliga fästpunkter sparar hologram i verkligt utrymme mellan programsessioner. När de har sparats i HoloLens-ankararkivet 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 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 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 fästpunktspersistence på HoloLens-enheter. För Android-, iOS- och HoloLens-enheter integrerar du med Azure Spatial Anchors för att stödja beständighet och delning av koordinatutrymmen mellan sessioner och enheter. Mer information och exempel som använder 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 bevara fästpunkter från ARAnchors Unity-scenen, läsa in fästpunkter från lagring till nya ARAnchorseller ta bort fästpunkter från lagringen.
Anteckning
Du sparar och läser in fästpunkterna 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-programmet:
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ästpunktsarkivet
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-pluginprogrammet 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 ankararkiv
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/icke-beständiga fästpunkter kan du titta på skriptet Anchors -> Anchors Sample GameObject and AnchorsSample.cs i skriptet [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 över instanser av programmet. Användare kan fästa enskilda hologram var de vill och hitta dem senare på samma plats över appsessioner.
WorldAnchorStore Låter dig bevara platsen för världsfästpunkter mellan sessioner. Om du vill bevara hologram mellan sessioner håller du koll på GameObjects dem genom att använda en viss världsankare. Du kan skapa en GameObject rot med en världsfästpunkt och fästpunkt för underordnade hologram med en förskjutning av lokal position.
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ärldsfästpunkten.
Läs in världsfästpunkten med dess ID.
Så här sparar du hologram för framtida sessioner:
WorldAnchorStoreHämta .
Spara en världsfästpunkt och ange ett ID.
Spara appdata relaterade till världsfästpunkten 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 WorldAnchorStore, som du kan använda för att spara och läsa in specifika världsfästpunkter.
Spara en världsankare
För att spara en världsankare namnger du världens ankare och skickar det i WorldAnchorStore det du fick tidigare. Om du försöker spara två fästpunkter i samma sträng store.Save returnerar falskt. 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äsa in en världsfästpunkt
Så här läser du in en världsfästpunkt:
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]);
}
Bevara hologram för flera enheter
Du kan använda Azure Spatial Anchors för att skapa en beständig molnankare från en lokal världsankare. Din app kan hitta molnfästpunkten på flera HoloLens-, iOS- och Android-enheter, även om enheterna inte är tillsammans samtidigt. Eftersom molnfästpunkter är beständiga kan flera enheter se innehåll som återges i förhållande till fästpunkten på samma fysiska plats över tid.