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.
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.
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 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.
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.
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ó.
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.
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.
Fontos
A helyi horgonyok az eszközön, az Azure Spatial Anchors pedig a felhőben vannak tárolva. A helyi és az Azure-horgonyok ütközés nélkül is ugyanabban a projektben lehetnek. 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.
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. Android, iOS és HoloLens rendszerű eszközök esetén integrálható az Azure Spatial Anchors szolgáltatással a koordináta-terek 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. 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. Az eszközközi horgonyok az Azure Spatial Anchors segítségével támogatottak.
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:
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.
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:
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]);
}
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 nincsenek egyszerre 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.