Megosztás a következőn keresztül:


Rendszerek koordinálása a Unityben

A Windows Mixed Reality számos felhasználói felületi skálán támogatja az alkalmazásokat, a csak tájolásos és az üléses alkalmazásoktól kezdve a helyiségméretű alkalmazásokig. A HoloLensen továbbmehet, és olyan világszintű alkalmazásokat készíthet, amelyek segítségével a felhasználók 5 métert meghaladó sétát tehetnek, és felfedezhetik az épület teljes emeletét és azon túl is.

A vegyes valósági felület Unityben való kiépítésének első lépése a koordináta-rendszerek megértése és az alkalmazás által megcélzott felületi skálázás kiválasztása.

Csak tájolásos vagy ülő léptékű felület létrehozása

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

Ha csak tájolásos vagy ülő léptékű élményt szeretne létrehozni, a Unityt a helyhez kötött követési hely típusára kell állítania. A helyhez kötött nyomkövető tér a Unity világkoordináta-rendszerét állítja be a helyhez kötött referenciakeret nyomon követésére. A Helyhez kötött nyomkövetési módban a szerkesztőben közvetlenül a kamera alapértelmezett helye előtt elhelyezett tartalom (a továbbítás -Z) a felhasználó előtt jelenik meg az alkalmazás indításakor.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

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

Az olyan tiszta tájolású élmény érdekében, mint a 360 fokos videómegjelenítő (ahol a pozíciófej frissítése tönkretenné az illúziót), beállíthatja az XR-t . Az InputTracking.disablePositionalTracking értéke igaz:

InputTracking.disablePositionalTracking = true;

Az ülőméretű élmény érdekében, hogy a felhasználó később még frissebb legyen az ülő forrásnál, meghívhatja az XR-t. InputTracking.Recenter metódus:

InputTracking.Recenter();

Álló vagy helyiségméretű felület létrehozása

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

Az álló vagy helyiségméretű élmény érdekében a tartalmat a padlóhoz viszonyítva kell elhelyeznie. A felhasználó padlójára a térbeli szakaszt kell használnia, amely a felhasználó definiált padlószintű eredetét és az első futtatáskor beállított opcionális helyiséghatárt jelöli.

Annak biztosítása érdekében, hogy a Unity a világszintű koordináta-rendszerével működjön, beállíthatja és tesztelheti, hogy a Unity a RoomScale követőtértí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 referencia fáziskeretének 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 szakasz 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ít be.

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

Névtér: UnityEngine.Experimental.XR
Típus: Határ

A szkriptkódban ezután meghívhatja a TryGetGeometry metódust a UnityEngine.Experimental.XR.Boundary típusban egy határ sokszög lekéréséhez, amely a TrackedArea határtípusát adja meg. Ha a felhasználó meghatározta a határt (a csúcsok listájának visszaadása után), nyugodtan biztosíthatja a felhasználónak a helyiségméretű élményt , ahol körbejárhatják a létrehozott jelenetet.

Feljegyzé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 is, hogy ezzel a határ sokszögkel helyezi el a jelenetobjektumokat, 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 a felhasználók számára, hogy 5 méternél tovább bolyonganak, új technikákra lesz szüksége a helyiségméretű élményekhez használt módszereken túl. Az egyik fő technika, amellyel egy térbeli horgonyt fog létrehozni, amely pontosan a fizikai világban található hologramokból álló fürtöt zárolja, 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 a WorldAnchor Unity összetevő gameObjecthez való hozzáadásával térbeli horgonyt hozhat létre.

Világhorgony hozzáadása

A világ horgonyának hozzáadásához hívja meg az AddComponent<WorldAnchor>() nevet a játékobjektumon azzal az átalakítással, amelyet a valós világban szeretne horgonyozni.

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

Ennyi az egész! Ez a játék objektum most rögzítve lesz a jelenlegi helyén a fizikai világban - lehet, hogy a Unity világ koordinátái kissé az idő múlásával, hogy biztosítsa a fizikai igazítás. A lehorgonyzott hely egy későbbi alkalmazás-munkamenetben való megkereséséhez használja az adatmegőrzést .

Világhorgony eltávolítása

Ha már nem szeretné, hogy a GameObject egy fizikai világ helyére 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-t kell meghívnia.

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

Világhorgonyzott GameObject áthelyezése

A GameObject nem helyezhető át, amíg a World Anchor rajta van. Ha át kell helyeznie a GameObject ezt a keretet, a következőt 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 Changes 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 világ megfelelő fizikai helyén.

Értesítés 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 megváltozik egy olyan állapot között, amely nem található, és 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 a horgonynak ez a helyelhelyezett tulajdonsága igaz értékre lesz állítva, amikor az AddComponent<WorldAnchor>() visszatér. Ennek eredményeképpen az OnTrackingChanged esemény nem aktiválódik. A horgony csatolása után tiszta mintaként hívhatja meg az OnTrackingChanged kezelőt a kezdeti IsLocated állapottal.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

Horgonyok megosztása 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 ezután 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 lehetővé teszi a valós idejű megosztott élményeket.

Ha el 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óit.

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 Vegyes valóság alapvető építőelemeinek felfedezése felé halad. Innen továbbléphet a következő építőelemre:

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

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

Kapcsolódó információk