Kézmozdulatok a Unityben

A Unityben kétféleképpen hajthat végre műveleteket, kézmozdulatokat és mozgásvezérlőket 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 biztosít a térbeli bemeneti adatok elérésére Windows Mixed Reality. A gyakori Input.GetButton/Input.GetAxis API-k több Unity XR SDK-n is működnek, míg az InteractionManager/GestureRecognizer API Windows Mixed Reality teszi elérhetővé a térbeli bemeneti adatok teljes készletét.

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 bemeneti források, a Tap, 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 GestureRecognizerrel.

A GestureRecognizer minden kézmozdulat-eseménye biztosítja a SourceKindet a bemenethez, valamint a célzási fejsugarat az esemény időpontjában. Egyes események további környezetspecifikus információkat biztosítanak.

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

  1. Új Kézmozdulat-felismerő létrehozása
  2. Adja meg, hogy mely kézmozdulatokat watch
  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 watch

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ézmozdulatokhoz.

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

Megjegyzé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ása után figyeli a bemenetet. Előfordulhat, hogy a StopCapturingGestures() meghívása után egy kézmozdulat-esemény jön létre, ha a bemenetet a StopCapturingGestures() folyamatot feldolgozó keret előtt hajtották végre. 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ó a kézmozdulatok monitorozásának elindítása és leállítása a keret tekintetének célzása alapján.

recognizer.StartCapturingGestures();

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

A kézmozdulat-felismerés leállítása:

recognizer.StopCapturingGestures();

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

Ne felejtsen 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 a különböző gombok lenyomásakor tartott és tagolt fizikai vezérlőknek, használhatja a MotionController előlapjá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 esetleges jelenlegi és jövőbeli vezérlőihez.

  1. Kövesse az Első lépések utasításokat a Mixed Reality Eszközkészlet letöltéséhez és a Unity-projekthez való hozzáadásához.
  2. Ha a kamerát a MixedRealityCameraParent előtagra cserélte a Első lépések lépések részeként, akkor jó, ha megy! Ez az előlap tartalmazza a mozgásvezérlő renderelését. Ellenkező esetben adja hozzá az Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab elemet a jelenethez a Projekt panelen. Ezt az előképet bármilyen szülőobjektum gyermekének 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 tartalmaz teleportálást, egyszerűen adja hozzá az előképet a jelenet gyökeréhez.

Objektumok eldobása

Az objektumok virtuális valóságban való üzembe helyezése nehezebb probléma, mint amilyennek elsőre tűnhet. A legtöbb fizikai interakcióhoz hasonlóan, amikor a játékba dobás váratlanul működik, azonnal nyilvánvaló és megszakítja a merítést. Sok időt töltöttünk azzal, hogy alaposan átgondoljuk, hogyan képviselhetjük a fizikailag helyes dobás viselkedését, és kitaláltunk néhány olyan irányelvet, amelyeket a platform frissítéseivel engedélyeztünk, amelyeket szeretnénk megosztani Ö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ást vezettünk be a viselkedésben, amikor a "Hozzávetőleges" pozíciókövetési állapotban van. Ha ebben az állapotban van, a vezérlő sebességadatait a rendszer mindaddig jelenti, amíg úgy véljük, 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ódusban található a GetThrownObjectVelAngVel fájlban, a fent hivatkozott csomagban:

    1. A szögsebesség megőrzésekor a dobott objektumnak ugyanolyan szögsebességet kell fenntartania, mint a dobás pillanatában: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Mivel a dobott objektum tömegének középpontja valószínűleg nem a markolati helyzet forrásá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 azonnali 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, és a vektor a vezérlő eredete és a dobott objektum tömegének kö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, akár 20 ms-ot is igénybe vehet, amíg az esemény a Bluetooth-on keresztül felborul az operációs rendszerhez. Ez azt jelenti, hogy ha lekérdezi, hogy a vezérlő állapota le van-e nyomva, vagy fordítva, a vezérlő olyan információkat tesz fel, amelyekhez hozzájut, valójában megelőzi ezt az állapotváltozást. Emellett a lekérdezési API által bemutatott vezérlői póz előre jelezve egy valószínű pózolást fog tükrözni a keret megjelenésekor, amely a jövőben több mint 20 ms lehet. Ez jó a megtartott objektumok rendereléséhez , de az időproblémát az objektum megcélzása során oldja meg, 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ényt, például az InteractionSourcePressed vagy az InteractionSourceReleased üzenetet küld, az állapot tartalmazza a gomb megnyomásakor vagy kiadásakor visszaről érkező előzmény pózadatokat. Ahhoz, hogy a legpontosabb vezérlő renderelése és a vezérlő célzása a dobások során, helyesen kell használnia a lekérdezést és az eseménykezelést, ha szükséges:

  • Használja a markolat pózt. Angular sebesség és sebesség a markolathoz viszonyítva van jelentve, nem pedig a mutató pózhoz viszonyítva.

A dobás továbbra is javulni fog a Windows jövőbeli frissítéseivel, és várhatóan itt talál további információkat.

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

A kézmozdulat- és mozgásvezérlőt a bemeneti kezelőből érheti el.

Kövesse az oktatóanyagokat

A részletes testreszabási példákat tartalmazó részletes oktatóanyagok a Mixed Reality Akadémián érhetők el:

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

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

Ha követi a Unity által meghatározott fejlesztési folyamatot, 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 Mixed Reality platform képességeire és API-ira:

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

Lásd még