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


Kézmozdulatok a Unityben

A Unityben kétféleképpen hajthat végre műveleteket a tekintetén, kézmozdulatok és mozgásvezérlők a HoloLensben és a modern HMD-ben. A térbeli bemenet mindkét forrásának adatait ugyanazokkal az API-kkal érheti el a Unityben.

A Unity két elsődleges módot kínál a térbeli bemeneti adatok elérésére a Windows Mixed Reality esetében. A gyakori Input.GetButton/Input.GetAxis API-k több Unity XR SDK-n is működnek, míg a Windows Mixed Realityre jellemző InteractionManager/GestureRecognizer API a térbeli bemeneti adatok teljes készletét teszi elérhetővé.

Magas szintű összetett kézmozdulat API-k (GestureRecognizer)

Névtér: UnityEngine.XR.WSA.Input
Típusok: GestureRecognizer, GestureSettings, InteractionSourceKind

Az alkalmazás magasabb szintű összetett kézmozdulatokat is képes felismerni a térbeli beviteli források, a Koppintás, a Hold, a Manipuláció és a Navigációs kézmozdulatokhoz. Ezeket az összetett kézmozdulatokat kéz- és mozgásvezérlők között is felismerheti a GestureRecognizer használatával.

A GestureRecognizer minden kézmozdulateseménye biztosítja a SourceKindet a bemenethez, valamint a célzási fejsugarat az esemény idején. Egyes események további környezetspecifikus információkat nyújtanak.

A kézmozdulatok kézmozdulat-felismerővel történő rögzítéséhez csak néhány lépés szükséges:

  1. Új kézmozdulat-felismerő létrehozása
  2. Adja meg, hogy mely kézmozdulatokat kell figyelni
  3. Feliratkozás a kézmozdulatok eseményeire
  4. Kézmozdulatok rögzítésének megkezdése

Új kézmozdulat-felismerő létrehozása

A GestureRecognizer használatához létre kell hoznia egy GestureRecognizert:

GestureRecognizer recognizer = new GestureRecognizer();

Adja meg, hogy mely kézmozdulatokat kell figyelni

Adja meg, hogy mely kézmozdulatok érdeklik a SetRecognizableGestures():

recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);

Feliratkozás a kézmozdulatok eseményeire

Iratkozzon fel az eseményekre az önt érdeklő kézmozdulatokra.

void Start()
{
    recognizer.Tapped += GestureRecognizer_Tapped;
    recognizer.HoldStarted += GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}

Feljegyzés

A navigációs és a manipulációs kézmozdulatok kölcsönösen kizárják a GestureRecognizer egy példányát.

Kézmozdulatok rögzítésének megkezdése

Alapértelmezés szerint a GestureRecognizer csak a StartCapturingGestures() meghívásáig figyeli a bemenetet. Előfordulhat, hogy a StopCapturingGestures() meghívása után egy kézmozdulatesemény jön létre, ha a bemenet a StopCapturingGestures() feldolgozását végző keret előtt történt. A GestureRecognizer emlékezni fog arra, hogy be- vagy kikapcsolt volt-e az előző keretben, amelyben a kézmozdulat ténylegesen történt, így megbízható, hogy a kézmozdulatok monitorozását ennek a keretnek a tekintete alapján indítsa el és állítsa le.

recognizer.StartCapturingGestures();

Kézmozdulatok rögzítésének leállítása

A kézmozdulatfelismerés leállítása:

recognizer.StopCapturingGestures();

Kézmozdulat-felismerő eltávolítása

Ne felejtse el leiratkozni az előfizetett eseményekről, mielőtt megsemmisítené a GestureRecognizer objektumot.

void OnDestroy()
{
    recognizer.Tapped -= GestureRecognizer_Tapped;
    recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}

A mozgásvezérlő modell renderelése a Unityben

Mozgásvezérlő modell és teleportálás
Mozgásvezérlő modell és teleportálás

Ha olyan mozgásvezérlőket szeretne megjeleníteni az alkalmazásban, amelyek megfelelnek a felhasználók által tartott fizikai vezérlőknek, és különböző gombok lenyomása közben tagolják azokat, használhatja a MotionController előfabját a Mixed Reality eszközkészletben. Ez az előfab dinamikusan betölti a megfelelő glTF-modellt futásidőben a rendszer telepített mozgásvezérlő-illesztőprogramjából. Fontos, hogy ezeket a modelleket dinamikusan töltse be ahelyett, hogy manuálisan importálja őket a szerkesztőbe, hogy az alkalmazás fizikailag pontos 3D modelleket jelenítsen meg a felhasználók által esetlegesen meglévő és jövőbeli vezérlőkhöz.

  1. Kövesse az első lépéseket a Mixed Reality eszközkészlet letöltéséhez és a Unity-projekthez való hozzáadásához.
  2. Ha az első lépések részeként lecserélte a kamerát a MixedRealityCameraParent előlapra, akkor jó választás! Ez az előfab a mozgásvezérlő renderelését is magában foglalja. Ellenkező esetben a Projekt panelen adja hozzá az Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab értéket a jelenethez. Ezt az előképet bármilyen szülőobjektum gyermekeként kell hozzáadnia, amellyel áthelyezheti a kamerát, amikor a felhasználó teleportál a jeleneten belül, hogy a vezérlők a felhasználóval együtt legyenek. Ha az alkalmazás nem jár teleportálással, egyszerűen adja hozzá az előképet a jelenet gyökeréhez.

Objektumok dobása

Az objektumok virtuális valóságba való dobása nehezebb probléma, mint amilyennek elsőre tűnhet. Mint a legtöbb fizikai alapú interakciók, amikor dobás játék működik váratlan módon, ez azonnal nyilvánvaló, és megszakítja a merülés. Sok időt töltöttünk azzal, hogy alaposan átgondoljuk, hogyan képviselhetjük a fizikailag helyes dobás viselkedését, és néhány olyan irányelvvel is előálltunk, amelyeket a platformunk frissítéseivel engedélyeztünk, amelyeket meg szeretnénk osztani Önnel.

Itt talál egy példát arra, hogyan javasoljuk a dobás implementálását. Ez a minta az alábbi négy iránymutatást követi:

  • Pozíció helyett használja a vezérlő sebességét. A Windows novemberi frissítésében változás történt a viselkedésben, amikor a "Közelítő" pozíciókövetési állapotban van. Ebben az állapotban a vezérlő sebességadatait mindaddig jelenteni fogjuk, amíg úgy gondoljuk, hogy a nagy pontossága, amely gyakran hosszabb, mint a pozíció, továbbra is nagy pontosságú marad.

  • A vezérlő szögsebességének beépítése. Ez a logika mind a throwing.cs statikus metódus fájljában GetThrownObjectVelAngVel található, a fent hivatkozott csomagon belül:

    1. Mivel a szögsebesség megtartva van, a dobott objektumnak ugyanazt a szögsebességet kell fenntartania, mint a dobás pillanatában: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Mivel a dobott objektum tömegközéppontja valószínűleg nem a markolati póz eredeténél van, valószínűleg más sebességgel rendelkezik, mint a vezérlő sebessége a felhasználó referenciakeretében. Az objektum sebességének ily módon hozzájárult része a dobott objektum tömegközéppontjának pillanatnyi tangenciális sebessége a vezérlő eredete körül. Ez a tangenciális sebesség a vezérlő szögsebességének keresztterméke, a vektor pedig a vezérlő eredete és a dobott objektum tömegközéppontja közötti távolságot jelöli.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. A dobott objektum teljes sebessége a vezérlő sebességének összege, és ez a tangenciális sebesség: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Ügyeljen arra, hogy mikor alkalmazzuk a sebességet. Ha megnyom egy gombot, az esemény akár 20 ms-ot is igénybe vehet, hogy a Bluetooth-on keresztül felboruljon az operációs rendszerre. Ez azt jelenti, hogy ha lekérdezi, hogy a vezérlő állapota le van-e nyomva, vagy fordítva, akkor a vezérlő olyan információkat ad meg, amelyekhez hozzájut, valójában megelőzi ezt az állapotváltozást. Továbbá a lekérdezési API által bemutatott vezérlőpóz előrejelzi, hogy a keret megjelenésekor valószínű póz jelenik meg, amely a jövőben több mint 20 ms lehet. Ez jó a megtartott objektumok megjelenítéséhez, de az időproblémát az objektum megcélzása során oldja fel, mivel kiszámítjuk a pályát abban a pillanatban, amikor a felhasználó elengedte a dobást. Szerencsére a novemberi frissítéssel, amikor egy Unity-esemény, például az InteractionSourcePressed vagy az InteractionSourceReleased el lesz küldve, az állapot tartalmazza a gomb megnyomásakor vagy kiadásakor visszaról érkező előzményes pózadatokat. Ahhoz, hogy a lehető legpontosabb vezérlőmegjelenítést és vezérlő-célzást kapja a dobások során, megfelelő módon kell használnia a lekérdezést és az eseménykezelést:

    • Az egyes kereteket megjelenítő vezérlők esetében az alkalmazásnak a vezérlő GameObject elemét az aktuális keret fotonidejéhez előrejelzett vezérlő pózhoz kell helyeznie. Ezeket az adatokat a Unity lekérdezési API-jából, például az XR-ből szerezheti be. InputTracking.GetLocalPosition vagy XR. WSA. Input.InteractionManager.GetCurrentReading.
    • Ha a vezérlő egy sajtóközleményre vagy kiadásra céloz , az alkalmazásnak sugárzottnak kell lennie, és ki kell számítania a pályát az adott sajtó- vagy kiadási esemény előzményvezérlőjének póza alapján. Ezeket az adatokat a Unity eseménykezelő API-iból kapja, például az InteractionManager.InteractionSourcePressedtől.
  • Használja a markoló pózt. A szögsebesség és a sebesség a markolati pózhoz képest, nem pedig a mutató pózhoz viszonyítva jelent.

A dobás továbbra is javulni fog a Windows jövőbeli frissítéseivel, és itt további információkra számíthat.

Kézmozdulat- és mozgásvezérlők az MRTK-ban

A kézmozdulatok és a mozgásvezérlő a bemeneti kezelőből érhető el.

Kövesse az oktatóanyagokat

Részletes testreszabási példákkal rendelkező részletes oktatóanyagok érhetők el a Mixed Reality Akadémián:

MR Bemenet 213 – Mozgásvezérlő
MR Bemenet 213 – Mozgásvezérlő

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

Ha a Unity fejlesztési útját követi, akkor az MRTK alapvető építőelemeinek felfedezése közben jár. 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 .

Lásd még