
A vegyes valóságbeli alkalmazások létrehozásának nagy része, hogy a hologramok helyben maradjanak, mozogjanak Önnel, vagy bizonyos esetekben más hologramokhoz viszonyítva helyezhessék el magukat. Ez a cikk végigvezeti a Javasolt megoldáson a World Locking Tools használatával, de a Unity-projektek térbeli horgonyainak manuális beállításával is foglalkozunk. Mielőtt bármilyen kódba belevágnánk, fontos tisztában lenni azzal, hogy a Unity hogyan kezeli a térközök és horgonyok koordináta-kezelését a saját motorjában.
Világszintű koordinátarendszerek
Napjainkban játékok, adatvizualizációs alkalmazások vagy virtuális valóságbeli alkalmazások írásakor a tipikus megközelítés egy olyan abszolút világkoordináta-rendszer létrehozása, amelyre minden más koordináták megbízhatóan visszaképezhetők. Ebben a környezetben mindig találhat egy stabil átalakítást, amely meghatározza a kapcsolatot a világ bármely két objektuma között. Ha nem helyezné át ezeket az objektumokat, a relatív átalakításuk mindig ugyanaz maradna. Ez a fajta globális koordináta-rendszer könnyen elérhető, ha tisztán virtuális világot jelenít meg, ahol előre ismeri az összes geometriát. A szobaméretű VR-alkalmazások ma általában ilyen abszolút helyiségméretű koordináta-rendszert hoznak létre, amelynek eredete a padlón található.
Ezzel szemben egy nem csatlakoztatott vegyes valóságú eszköz, például a HoloLens dinamikus érzékelőalapú ismeretekkel rendelkezik a világról, folyamatosan igazítva tudását a felhasználó környezetének idejére, miközben több métert gyalogolnak egy épület teljes emeletén. Egy világszintű élményben, ha az összes hologramot egy naiv merev koordinátarendszerbe helyezné, ezek a hologramok idővel elsodródnak, akár a világ alapján, akár egymáshoz képest.
Például a headset jelenleg úgy véli, hogy a világ két helye 4 méter távolságra van egymástól, majd később pontosítja ezt a megértést, és megtanulja, hogy a helyek valójában 3,9 méterre vannak egymástól. Ha ezeket a hologramokat eredetileg 4 méterre helyezték volna el egy merev koordinátarendszerben, akkor az egyik mindig 0,1 méterre jelenne meg a valós világtól.
A térbeli horgonyokat manuálisan is elhelyezheti a Unityben, hogy megőrizze a hologram pozícióját a fizikai világban, amikor a felhasználó mobil. Ez azonban feláldozza az önkonzisztenciát a virtuális világban. A különböző horgonyok folyamatosan mozognak egymáshoz képest, és a globális koordináta-térben is mozognak. Ebben a forgatókönyvben az egyszerű feladatok, például az elrendezés nehézkessé válnak. A fizikaszimuláció is problémás lehet.
A World Locking Tools (WLT) mindkét világból a legjobbat nyújtja, egyetlen merev koordináta-rendszert stabilizálva a virtuális jelenetben elterülő térbeli horgonyok belső készletével, miközben a felhasználó mozog. A WLT elemzi a kamera koordinátáit, és ezek a térbeli horgonyok minden keretet. Ahelyett, hogy megváltoztatná a világ összes koordinátáját, hogy kompenzálja a felhasználó fejének koordinátáinak korrekcióit, a WLT csak a fej koordinátáit rögzíti.
Válassza ki a világzárolási módszert
Ha lehetséges, használja a World Locking Tools eszközt a hologramok elhelyezéséhez.
A World Locking Tools stabil koordinátarendszert biztosít, amely minimalizálja a virtuális és a valós jelölők közötti látható ellentmondásokat. A World Locking Tools a teljes jelenetet zárolja egy közös horgonykészlettel, ahelyett, hogy minden objektumcsoportot zárolna a csoport saját egyedi horgonyával.
A World Locking Tools automatikusan kezeli a térbeli horgonyok belső létrehozását és kezelését. Nem kell az ARAnchorManagerrel vagy a WorldAnchorral együttműködnie ahhoz, hogy a hologramok világzárva maradjanak.
- A Unity 2019/2020-hoz az OpenXR vagy a Windows XR beépülő modul használatával használja az ARAnchorManagert.
- Régebbi Unity-verziókhoz vagy WSA-projektekhez használja a WorldAnchort.
Világzárolás beállítása
A World Locking Tools használatának megkezdéséhez töltse le a Mixed Reality funkcióeszközt. Az alapokkal kapcsolatos további információkért tekintse meg a World Locking Tools fő dokumentációs oldalát, amely áttekintésre, rövid útmutatóra és egyéb hasznos témakörökre mutató hivatkozásokat tartalmaz.
Automatikus beállítás
Ha a projekt készen áll a használatra, futtassa a konfigurációs jelenet segédprogramot a Mixed Reality > World Locking Toolsból:

Fontos
A Jelenet konfigurálása segédprogram bármikor újra futtatható. Újra kell futtatni például, ha az AR-cél régiről XR SDK-ra módosult. Ha a jelenet már megfelelően van konfigurálva, a segédprogram futtatásának nincs hatása.
Visualizers
A korai fejlesztés során a vizualizációk hozzáadása hasznos lehet annak biztosításához, hogy a WLT megfelelően legyen beállítva és működjön. Az éles teljesítmény érdekében eltávolíthatók, vagy ha bármilyen okból már nincs rájuk szükség, használja a Vizualizációk eltávolítása segédprogramot. A vizualizációkkal kapcsolatos további részletek az Eszközök dokumentációban találhatók.
A Mixed Reality OpenXR beépülő modul alapvető horgonyfunkciókat biztosít a Unity ARFoundation ARAnchorManager implementációján keresztül. Az ARFoundation ARAnchors alapismereteinek megismeréséhez tekintse meg az ARFoundation manual for AR Anchor Managert.
Névtér: UnityEngine.XR.WSA
Típus: WorldAnchor
A fő technika egy térbeli horgony létrehozása a hologramok fürtjének pontosan a fizikai világban való zárolásához, függetlenül attól, hogy a felhasználó milyen messzire kóborolt, majd a későbbi munkamenetekben újra megtalálja ezeket a hologramokat.
A régebbi Unity-verziókban a WorldAnchor Unity összetevő gameObjecthez való hozzáadásával térbeli horgonyt hozhat létre.
Világhorgony hozzáadása
Ha hozzá szeretne adni egy világhorgonyt, hívja fel AddComponent<WorldAnchor>() a játékobjektumot a valós világban horgonyozni kívánt átalakítással.
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();
Ez a játékobjektum most a fizikai világ jelenlegi helyére van rögzítve. Előfordulhat, hogy a Unity világkoordinátái kissé igazodnak az idő függvényében, hogy biztosítsák a fizikai igazítást. A lehorgonyzott hely későbbi alkalmazás-munkamenetben való megkereséséhez tekintse meg a világ egyik horgonyának betöltését.
Világhorgony eltávolítása
Ha már nem szeretné, hogy a GameObject fizikai világ helye zárolva legyen, és nem kívánja áthelyezni ezt a keretet, hívja fel Destroy a World Anchor összetevőt.
Destroy(gameObject.GetComponent<WorldAnchor>());
Ha át szeretné helyezni ezt a GameObject keretet, hívja DestroyImmediate meg helyette.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
Világhorgonyzott GameObject áthelyezése
Egy darabig nem mozoghat GameObject rajta a Világ horgonya. Ha át kell helyeznie ezt a GameObject keretet, a következőt kell elvégeznie:
DestroyImmediate a World Anchor összetevőt.
GameObjectA .
- Adjon hozzá egy új World Anchor-összetevőt a
GameObject.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();
A helyváltozások kezelése
Előfordulhat, hogy egy világhorgony egy adott időpontban nem található meg a fizikai világban. A Unity ezután nem frissíti a rögzített objektum átalakítását. Ez a helyzet akkor is előfordulhat, ha egy alkalmazás fut. A helyváltozás kezelésének elmulasztása miatt az objektum nem jelenik meg a világ megfelelő fizikai helyén.
Értesítés a helyváltozásokról:
Iratkozzon fel az eseményre OnTrackingChanged . Az OnTrackingChanged eseményt akkor hívjuk meg, ha a mögöttes térbeli horgony egy olyan állapot között változik, amelyben a hely vagy a hely nem található.
anchor.OnTrackingChanged += Anchor_OnTrackingChanged;
Kezelje az eseményt.
private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
// This simply activates/deactivates this object and all children when tracking changes
self.gameObject.SetActiveRecursively(located);
}
Ha a horgonyok azonnal találhatók, a isLocated horgony tulajdonsága a visszatéréskor AddComponent<WorldAnchor>() lesz beállítvatrue. Ezért az OnTrackingChanged esemény nem aktiválódik. A tisztább minta a horgony csatolása után a OnTrackingChanged kezdeti IsLocated állapottal rendelkező kezelő meghívása.
Anchor_OnTrackingChanged(anchor, anchor.isLocated);
Állandó világzárolás
A térbeli horgonyok hologramokat mentenek a valós térben az alkalmazás munkamenetei között. A HoloLens horgonytárolóban mentett térbeli horgonyok különböző munkamenetekben találhatók és tölthetők be, és ideális tartalék, ha nincs internetkapcsolat.
A World Locking Tools alapértelmezés szerint visszaállítja a Unity koordináta-rendszerét a fizikai világhoz képest a helyi térbeli horgonyok megőrzését támogató eszközökön futó munkamenetek során. Ahhoz, hogy egy hologram ugyanazon a helyen jelenjen meg a fizikai világban az alkalmazás kilépése és újrafuttatása után, az alkalmazásnak csak vissza kell állítania ugyanazt a pózt a hologramra.

Ha az alkalmazásnak finomabb vezérlésre van szüksége, letilthatja az automatikus mentést és az automatikus betöltést az ellenőrben, és kezelheti a szkriptek adatmegőrzését. További információ: Térbeli koordináta-rendszerek megőrzése.
A World Locking Tools csak HoloLens-eszközökön támogatja a helyi horgonymegőrzést.
Az úgynevezett API lehetővé teszi a XRAnchorStore horgonyok megőrzését a munkamenetek között. Az XRAnchorStore eszköz mentett horgonyainak ábrázolása. A Unity-jelenet horgonyait ARAnchors megőrizheti, a tárolóból betöltheti a horgonyokat újba ARAnchors, vagy törölheti a horgonyokat a tárolóból.
Feljegyzés
Ezeket a horgonyokat ugyanazon az eszközön mentheti és töltheti be.
Névterek
Unity 2020 és OpenXR esetén:
using Microsoft.MixedReality.ARSubsystems.XRAnchorStore
vagy Unity 2019/2020 + Windows XR beépülő modul:
using UnityEngine.XR.WindowsMR.XRAnchorStore
Nyilvános metódusok
{
// 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);
}
Horgonytároló-referencia lekérése
Az XRAnchorStore Unity 2020 és OpenXR használatával való betöltéséhez használjon bővítménymetódust az ARAnchorManager alrendszerén, az XRAnchorSubsystemen:
public static Task<XRAnchorStore> LoadAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem)
Az XRAnchorStore Unity 2019/2020 és a Windows XR beépülő modullal való betöltéséhez használja az XRReferencePointSubsystem (Unity 2019) vagy az ARReferencePointManager/ARAnchorManager alrendszerének XRReferencePointSubsystem (Unity 2020) bővítménymetódusát:
// 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);
Horgonytároló betöltése
Egy horgonytároló a Unity 2020-ban és az OpenXR-ben való betöltéséhez az alábbiak szerint érheti el az ARAnchorManager alrendszeréből:
ARAnchorManager arAnchorManager = GetComponent<ARAnchorManager>();
XRAnchorStore anchorStore = await arAnchorManager.subsystem.LoadAnchorStoreAsync();
vagy a Unity 2019/2020 és a Windows XR beépülő modullal:
// Unity 2019
ARReferencePointManager arReferencePointManager = GetComponent<ARReferencePointManager>();
XRAnchorStore anchorStore = await arReferencePointManager.subsystem.TryGetAnchorStoreAsync();
// Unity 2020
ARAnchorManager arAnchorManager = GetComponent<ARAnchorManager>();
XRAnchorStore anchorStore = await arAnchorManager.subsystem.TryGetAnchorStoreAsync();
Ha látni szeretne egy teljes példát a horgonyok megőrzésére/feloldására, tekintse meg a Horgonyok –> Horgonyok minta GameObject és AnchorsSample.cs szkriptet a [Mixed Reality OpenXR beépülő modul mintajelenetében]((https://github.com/microsoft/OpenXR-Unity-MixedReality-Samples):


A régebbi Unity-verziókban vagy WSA-projektekben használt hologramok megőrzéséhez használja a WorldAnchort.
Névtér: UnityEngine.XR.WSA.Persistence
Osztály: WorldAnchorStore
A WorldAnchorStore holografikus élményeket hoz létre, ahol a hologramok az alkalmazás példányai között meghatározott valós helyzetben maradnak. A felhasználók bárhol rögzíthetik az egyes hologramokat, és később ugyanazon a helyen találhatják meg őket az alkalmazás munkameneteinél.
Lehetővé WorldAnchorStore teszi a világhorgonyok helyének megőrzését a munkamenetek között. A hologramok munkamenetek közötti megőrzéséhez tartsa külön nyomon GameObjects azokat, amelyek egy adott világhorgonyt használnak. Létrehozhat egy GameObject gyökért egy világhorgonysal, és helyi pozícióeltolással rögzítheti a gyermek hologramokat.
Hologramok betöltése az előző munkamenetekből:
- Szerezze be a
WorldAnchorStore.
- Betöltheti a világ horgonyalkalmazásának adatait, amely megadja a világhorgony azonosítóját.
- Töltse be a világ horgonyát az azonosítójával.
Hologramok mentése a jövőbeli munkamenetekhez:
- Szerezze be a
WorldAnchorStore.
- Mentsen egy világhorgonyt, és adjon meg egy azonosítót.
- Mentse a világhorgonyhoz kapcsolódó alkalmazásadatokat az azonosítóval együtt.
A WorldAnchorStore letöltése
Adjon meg egy hivatkozást a WorldAnchorStoreműveletre, hogy tudja, mikor lesz kész a művelet végrehajtására. Mivel ez a hívás aszinkron, az alkalmazás indításakor a következő hívásokat végezheti el:
WorldAnchorStore.GetAsync(StoreLoaded);
StoreLoaded a kezelő, amikor a WorldAnchorStore betöltés befejeződött:
private void StoreLoaded(WorldAnchorStore store)
{
this.store = store;
}
Most már rendelkezik egy hivatkozással az WorldAnchorStoreadott világhorgonyok mentéséhez és betöltéséhez.
Világhorgony mentése
A világ horgonyának mentéséhez nevezze el a világ horgonyát, és adja át a WorldAnchorStore korábban kapottnak. Ha két horgonyt próbál menteni ugyanarra a sztringre, store.Save hamis értéket ad vissza. Az új mentés előtt törölje az előző mentést.
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);
}
}
Világhorgony betöltése
Világhorgony betöltése:
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.
}
}
A korábban mentett horgony eltávolítására és store.Clear() az összes korábban mentett adat eltávolítására is használhatóstore.Delete().
Meglévő horgonyok számbavétele
A tárolt horgonyok listázásához hívja meg a következőt GetAllIds:
string[] ids = this.store.GetAllIds();
for (int index = 0; index < ids.Length; index++)
{
Debug.Log(ids[index]);
}
Következő lépések
Globálisan zárolt koordináta-tér megosztása:
Tudnivalók a térbeli leképezésről:
Térjen vissza a Unity fejlesztési ellenőrzőpontjaihoz:
Lásd még