Az Mixed Reality alkalmazások létrehozásának fontos része, hogy a hologramok a helyén maradjanak, önnel együtt mozogjanak, vagy bizonyos esetekben más hologramokhoz viszonyítva helyezzé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 belevágnánk egy kódba, fontos tisztában lenni azzal, hogy a Unity hogyan kezeli a térközöket és a horgonyokat 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ál egy stabil átalakítást, amely a világ bármely két objektuma közötti kapcsolatot definiálja. Ha nem helyezné át ezeket az objektumokat, a relatív átalakítások mindig változatlanok maradnának. Ez a fajta globális koordináta-rendszer könnyen helyrehozható, 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átarendszert hoznak létre, amelynek eredete a padlón található.
Ezzel szemben a holoLenshez hasonló, nem kötött vegyes valóságú eszközök dinamikus érzékelőalapú ismeretekkel rendelkeznek a világról, és folyamatosan igazítják tudását a felhasználó környezetének idejében, miközben egy épület teljes emeletén több métert gyalogolnak. Egy világszintű élményben, ha az összes hologramot naiv, merev koordinátarendszerbe helyezné, ezek a hologramok idővel sodródnának, akár a világ alapján, akár egymáshoz viszonyítva.
Például a headset jelenleg úgy véli, hogy a világ két helye 4 méterre van egymástól, majd később finomíthatja ezt a megértést, és megtanulhatja, hogy a helyek valójában 3,9 méterre vannak egymástól. Ha ezek a hologramok eredetileg 4 méter távolságra lettek volna egymástól egyetlen merev koordinátarendszerben, akkor az egyik mindig 0,1 méterre lenne a való világtól.
A térbeli horgonyokat manuálisan helyezheti el a Unityben, hogy fenntartsa 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 fizikai szimuláció is problémás lehet.
A World Locking Tools (WLT) mindkét világ legjobbjait nyújtja, egyetlen merev koordinátarendszert 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 ezeket a térbeli horgonyokat minden keretben. Ahelyett, hogy a világ minden pontjának koordinátáit megváltoztatná, hogy kompenzálja a felhasználó fejének koordinátáiban szereplő korrekciókat, a WLT csak a fej koordinátáit javítja ki.
A világzárolási módszer kiválasztása
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ó inkonzisztenciákat. A World Locking Tools a teljes jelenetet egy közös horgonykészlettel zárolja ahelyett, hogy a csoport saját horgonyával zárolna minden objektumcsoportot.
A World Locking Tools automatikusan kezeli a térbeli horgonyok belső létrehozását és kezelését. A hologramok világzárolt állapotban tartásához nem kell az ARAnchorManager vagy a WorldAnchor használatával kommunikálnia.
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.
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.
Ha a projekt készen áll a használatra, futtassa a jelenet konfigurálása segédprogramot Mixed Reality > World Locking Tools eszközből:
Fontos
A Jelenet konfigurálása segédprogram bármikor újrafuttatható. Ú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 már nincs rájuk szükség, használja a Vizualizációk eltávolítása segédprogramot. A vizualizációkról további információt az Eszközök dokumentációjában talál.
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 idővel kissé igazodnak a fizikai igazítás biztosításához. A rögzített hely későbbi alkalmazás-munkamenetben való megkereséséhez lásd: Világhorgony betöltése .
Világhorgony eltávolítása
Ha már nem szeretné, hogy a GameObject fizikai világ helye zárolva legyen, és nem szeretné áthelyezni ezt a keretet, hívja Destroy fel a World Anchor összetevőt.
Destroy(gameObject.GetComponent<WorldAnchor>());
Ha át szeretné helyezni ezt a GameObject keretet, hívja meg a következőt DestroyImmediate : .
Előfordulhat, hogy a 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ívja meg a rendszer, ha a mögöttes térbeli horgony egy olyan állapot között változik, amely a locatable vagy a nem locatable állapot között változik.
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>() értékre true van állítva. Ezért az OnTrackingChanged esemény nem aktiválódik. A tisztább minta az, hogy a horgony csatolása után a OnTrackingChanged kezelőt a kezdeti IsLocated állapottal hívja meg.
A térbeli horgonyok valós térben mentik a hologramokat az alkalmazás munkamenetei között. A HoloLens horgonytárolóban való mentés után a térbeli horgonyok különböző munkamenetekben találhatók és tölthetők be, és ideális tartalék, ha nincs internetkapcsolat.
Fontos
A helyi horgonyok tárolása az eszközön történik, míg az Azure Spatial Anchors a felhőben van tárolva. A helyi és az Azure-beli horgonyok ütközés nélkül is lehetnek ugyanabban a projektben. További információ az Azure-felhőszolgáltatásoknak a horgonyok tárolására való integrálásáról: Azure Spatial Anchors.
Alapértelmezés szerint a World Locking Tools visszaállítja a Unity koordinátarendszerét a fizikai világhoz képest a helyi térbeli horgonyok megőrzését támogató eszközökön futó munkamenetek között. Ahhoz, hogy a hologram ugyanazon a helyen jelenjen meg a fizikai világban az alkalmazás bezárása és újrafuttatása után, az alkalmazásnak csak a hologramra kell visszaállítania ugyanazt a pózt.
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 az adatmegőrzést egy szkriptből. További információ: Térbeli koordinátarendszerek megőrzése.
A World Locking Tools csak HoloLens-eszközökön támogatja a helyi horgonyok megőrzését. Android-, iOS- és HoloLens-eszközök esetén integrálható az Azure Spatial Anchors szolgáltatással a koordinátahelyek munkamenetek és eszközök közötti megőrzésének és megosztásának támogatása érdekében. A World Locking Tools és az Azure Spatial Anchors együttes használatával kapcsolatos további információkért és mintákért lásd: World Locking Tools (WLT) és Az Azure Spatial Anchors (ASA) együttes használata.
Az úgynevezett API lehetővé teszi a XRAnchorStore horgonyok megőrzését a munkamenetek között. A XRAnchorStore az eszköz mentett horgonyainak ábrázolása. Megőrizheti a horgonyokat ARAnchors a Unity-jelenetben, betöltheti a horgonyokat a tárolóból az újba ARAnchors, vagy törölheti a horgonyokat a tárolóból.
using Microsoft.MixedReality.ARSubsystems.XRAnchorStore
vagy Unity 2019/2020 + Windows XR beépülő modul:
using UnityEngine.XR.WindowsMR.XRAnchorStore
Nyilvános módszerek
{
// 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álja az ARAnchorManager alrendszerének XRAnchorSubsystem bővítménymetódusát:
public static Task<XRAnchorStore> LoadAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem)
Az XRAnchorStore unity 2019/2020 és a Windows XR beépülő modul betöltéséhez használja a bővítménymetódust az XRReferencePointSubsystem (Unity 2019) vagy az XRAnchorSubsystem (Unity 2020), az ARReferencePointManager/ARAnchorManager alrendszerén:
// 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
Ha a Unity 2020-ban és az OpenXR-ben szeretne betölteni egy horgonytárolót, az ARAnchorManager alrendszeréből érheti el az alábbiak szerint:
A horgonyok megőrzésére/leválasztására vonatkozó teljes példa megtekintéséhez tekintse meg a Anchors –> Anchors Sample GameObject és AnchorsSample.cs szkriptet a [Mixed Reality OpenXR beépülő modul mintajelenetében](():https://github.com/microsoft/OpenXR-Unity-MixedReality-Samples
A korábbi Unity-verziókban vagy WSA-projektekben a hologramok megőrzéséhez használja a WorldAnchort.
A WorldAnchorStore holografikus élményeket hoz létre, ahol a hologramok az alkalmazás példányai között meghatározott valós pozícióban 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-munkamenetek során.
A WorldAnchorStore segítségével megőrizheti a világ horgonyainak helyét a munkamenetek között. A hologramok munkamenetek közötti megőrzéséhez külön nyomon kell követnie GameObjects , hogy a hologramok egy adott világhorgonyt használnak-e. 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 következőt WorldAnchorStore: .
A world anchor alkalmazás adatainak betöltése, 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 következőt 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 WorldAnchorStoreparancsra, hogy tudja, mikor lehet elvégezni egy műveletet. Mivel ez a hívás aszinkron, az alkalmazás indításakor a következő hívásokat kezdeményezheti:
WorldAnchorStore.GetAsync(StoreLoaded);
StoreLoaded a kezelő, amikor a WorldAnchorStore betöltés befejeződött:
Most már rendelkezik egy hivatkozással a WorldAnchorStore,-ra, amellyel mentheti és betöltheti az adott világhorgonyokat.
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]);
}
Hologramok megőrzése több eszközön
Az Azure Spatial Anchors használatával tartós felhőhorgonyt hozhat létre egy helyi világhorgonyból. Az alkalmazás több HoloLens- iOS- és Android-eszközön is megkeresheti a felhőhorgonyt, még akkor is, ha az eszközök nem egy időben találhatók együtt. Mivel a felhőhorgonyok állandóak, több eszköz is láthatja az adott horgonyhoz képest renderelt tartalmakat ugyanabban a fizikai helyen az idő múlásával.