Rendszerek koordinálása a Unityben

Windows Mixed Reality számos felületi skálán támogatja az alkalmazásokat, a csak tájolású és a helyalapú alkalmazásoktól kezdve egészen a helyiségméretező alkalmazásokig. A HoloLensen továbbhaladhat, és olyan világszintű alkalmazásokat hozhat létre, amelyek segítségével a felhasználók 5 métert meghaladó sétát tehetnek egy épület teljes emeletén és azon túl.

A Unityben a vegyes valósági élmény kialakításának első lépése a koordinátarendszerek megismerése és az alkalmazás által megcélzott élményskálázás kiválasztása.

Csak tájolású vagy ülő léptékű élmény létrehozása

Névtér:UnityEngine.XR
Típus:XRDevice

A csak tájolású vagy ülő léptékű élmény létrehozásához a Unityt a Helyhez kötött nyomkövetési hely típusára kell állítania. A helyhez kötött nyomkövetési tér beállítja a Unity világkoordináta-rendszerét a helyhez kötött referenciakeret nyomon követésére. A Rögzített nyomkövetési módban a szerkesztőben, közvetlenül a kamera alapértelmezett helye előtt elhelyezett tartalom (előre -Z) megjelenik a felhasználó előtt az alkalmazás indításakor.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Névtér:UnityEngine.XR
Típus:InputTracking

Ha csak a tájolást szeretné lehetővé tenni , például egy 360 fokos videómegjelenítőt (ahol a pozíciófej frissítése tönkretené az illúziót), beállíthatja az XR-t. InputTracking.disablePositionalTracking értéke igaz:

InputTracking.disablePositionalTracking = true;

Ha ülő szintű élményt szeretne, hogy a felhasználó később újabb helyet adjon az ülő forrásnak, meghívhatja az XR-t. InputTracking.Recenter metódus:

InputTracking.Recenter();

Álló vagy helyiségméretű élmény létrehozása

Névtér:UnityEngine.XR
Típus:XRDevice

Álló vagyhelyiségméretű élményhez a tartalmat a padlóhoz képest kell elhelyeznie. Az első futtatáskor beállított, a felhasználó által definiált padlószintű forrást és opcionális helyiséghatárt jelképező térbeli szakaszt használva a felhasználó padlószintjét kell megadnia.

Annak biztosítása érdekében, hogy a Unity a világszintű koordinátarendszerrel működjön, beállíthatja és tesztelheti, hogy a Unity a RoomScale nyomkövetési helytípust használja-e:

if (XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale))
{
    // RoomScale mode was set successfully.  App can now assume that y=0 in Unity world coordinate represents the floor.
}
else
{
    // RoomScale mode was not set successfully.  App cannot make assumptions about where the floor plane is.
}
  • Ha a SetTrackingSpaceType igaz értéket ad vissza, a Unity sikeresen átváltotta a világkoordináta-rendszerét a referenciaszakasz-keret nyomon követésére.
  • Ha a SetTrackingSpaceType hamis értéket ad vissza, a Unity nem tudott átváltani a referencia fáziskeretére, valószínűleg azért, mert a felhasználó nem állított be padlót a környezetében. Bár a hamis visszatérési érték nem gyakori, előfordulhat, hogy a fázis egy másik helyiségben van beállítva, és az eszköz az aktuális helyiségbe kerül anélkül, hogy a felhasználó új szakaszt állítana be.

Ha az alkalmazás sikeresen beállítja a Helyiségskálázás követési terület típusát, az y=0 síkon elhelyezett tartalom megjelenik a padlón. A 0, 0, 0 kezdőpont az a hely lesz, ahol a felhasználó a helyiség beállításakor állt, a -Z pedig azt az előremutató irányt jelöli, amellyel a beállítás során szembesültek.

Namespace:UnityEngine.Experimental.XR
Típus:Határ

A szkriptkódban ezután meghívhatja a TryGetGeometry metódust a UnityEngine.Experimental.XR.Boundary típuson, hogy lekérjen egy határ sokszöget, megadva a TrackedArea határtípusát. Ha a felhasználó meghatároz egy határt (a csúcspontok listájának visszaadása után), nyugodtan biztosíthatja a helyiségméretű élményt a felhasználónak, ahol körbejárhatják a létrehozott jelenetet.

Megjegyzés

A rendszer automatikusan megjeleníti a határt, amikor a felhasználó megközelíti. Az alkalmazásnak nem kell ezt a sokszöget használnia a határ megjelenítéséhez. Azonban dönthet úgy, hogy a jelenetobjektumokat ezzel a határ sokszögdel helyezi el, hogy a felhasználó fizikailag elérhesse ezeket az objektumokat teleportálás nélkül:

var vertices = new List<Vector3>();
if (UnityEngine.Experimental.XR.Boundary.TryGetGeometry(vertices, Boundary.Type.TrackedArea))
{
    // Lay out your app's content within the boundary polygon, to ensure that users can reach it without teleporting.
}

Világszintű élmény létrehozása

Névtér:UnityEngine.XR.WSA
Típus:WorldAnchor

A HoloLens valódi világszintű élményeihez , amelyek lehetővé teszik, hogy a felhasználók 5 méternél tovább vándorolnak, új technikákra lesz szüksége a helyiségméretű élményekhez használt módszereken túl. Az egyik fő technika, amelyet használni fog, 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 Unityben úgy hozhat létre térbeli horgonyt, hogy hozzáadja a WorldAnchor Unity összetevőt egy GameObject elemhez.

Világhorgony hozzáadása

Világhorgony hozzáadásához hívja meg az AddComponent<WorldAnchor>() elemet a játékobjektumon azzal az átalakítással, amelyet a valós világban szeretne rögzíteni.

WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Ennyi az egész! Ez a játékobjektum most a fizikai világ aktuális helyére lesz rögzítve - láthatja, hogy a Unity világkoordinátái az idő múlásával kissé módosulnak, hogy biztosítsák a fizikai igazítást. Az állandóság használatával keresse meg újra ezt a rögzített helyet egy későbbi alkalmazás-munkamenetben.

Világhorgony eltávolítása

Ha már nem szeretné, hogy a GameObject egy fizikai világbeli helyre legyen zárolva, és nem kívánja áthelyezni ezt a keretet, akkor egyszerűen meghívhatja a Destroy-et a World Anchor összetevőn.

Destroy(gameObject.GetComponent<WorldAnchor>());

Ha át szeretné helyezni a GameObject ezt a keretet, akkor inkább a DestroyImmediate-ot kell meghívnia.

DestroyImmediate(gameObject.GetComponent<WorldAnchor>());

Világhorgonyzott GameObject áthelyezése

A GameObject-eket nem lehet áthelyezni, amíg a World Anchor rajta van. Ha át kell helyeznie a GameObject ezt a keretet, a következőket kell elvégeznie:

  1. DestroyImmediate a World Anchor összetevő
  2. A GameObject áthelyezése
  3. Adjon hozzá egy új World Anchor-összetevőt a GameObjecthez.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Locatability-változások kezelése

Előfordulhat, hogy a WorldAnchor egy adott időpontban nem található meg a fizikai világban. Ha ez történik, a Unity nem frissíti a rögzített objektum átalakítását. Ez az alkalmazás futása közben is változhat. A helymeghatározó változás kezelésének elmulasztása miatt az objektum nem jelenik meg a megfelelő fizikai helyen a világon.

Ha értesítést szeretne kapni a helyváltozásokról:

  1. Feliratkozás az OnTrackingChanged eseményre
  2. Az esemény kezelése

Az OnTrackingChanged esemény akkor lesz meghívva, ha a mögöttes térbeli horgony egy olyan állapot között változik, hogy a hely nem található.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Ezután 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);
}

Néha a horgonyok azonnal találhatók. Ebben az esetben ez a horgony lokált tulajdonsága igaz értékre lesz állítva, amikor az AddComponent<WorldAnchor>() visszaadja. Ennek eredményeképpen az OnTrackingChanged esemény nem aktiválódik. Egy tiszta minta az OnTrackingChanged kezelő meghívása a kezdeti IsLocated állapottal egy horgony csatolása után.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

Horgonyok megosztása az eszközök között

Az Azure Spatial Anchors használatával tartós felhőhorgonyt hozhat létre egy helyi WorldAnchorból, amelyet az alkalmazás több HoloLens- iOS- és Android-eszközön is megtalálhat. Ha közös térbeli horgonyt oszt meg több eszközön, minden felhasználó ugyanazon a fizikai helyen láthatja a horgonyhoz képest renderelt tartalmat. Ez valós idejű megosztott élményt tesz lehetővé.

Ha meg szeretné kezdeni a megosztott élmények kiépítését a Unityben, próbálja ki az 5 perces Azure Spatial Anchors Unity rövid útmutatót.

Az Azure Spatial Anchors használata után létrehozhat és megkereshet horgonyokat a Unityben.

Következő fejlesztési ellenőrzőpont

Ha a Unity fejlesztési ellenőrzőpont-útját követi, akkor a Mixed Reality alapvető építőelemeinek felfedezésére készül. Innen továbbléphet a következő építőelemre:

Vagy ugorjon Mixed Reality platform képességeire és API-ira:

Bármikor visszatérhet a Unity fejlesztési ellenőrzőpontjaihoz .

Lásd még: