Kézmozdulatok a Unityben

A Unityben,kézmozdulatok és mozgásvezérlők használatával két fő módon lehet műveletet HoloLens És a Modern HKD-ben. A térbeli bemenetek mindkét forrásának adatait ugyanazokon az API-kon keresztül férheti hozzá a Unityben.

A Unity két elsődleges módszert kínál a térbeli bemeneti adatok eléréséhez Windows Mixed Reality. A közös Input.GetButton/Input.GetAxis API-k több Unity XR API-n is működnek, míg az Windows Mixed Reality-ra 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ásokhoz, a Koppintás, a Hold, a Manipulation és a Navigation kézmozdulathoz. Ezeket az összetett kézmozdulatokat mindkét kézmozdulatban és mozgásvezérlőben felismerheti a GestureRecognizer használatával.

A GestureRecognizer minden kézmozdulati eseménye biztosítja a SourceKindet a bemenethez, valamint az eseménykor a célcsoportos head rayt. Egyes események további környezetspecifikus információkat biztosítanak.

A kézmozdulatok kézmozdulat-rögzítővel való rögzítéséhez csak néhány lépésre van szükség:

  1. Új Gesture Recognizer létrehozása
  2. Adja meg, hogy mely kézmozdulatokat figyelje
  3. Feliratkozás eseményekre ezekhez a kézmozdulatokhoz
  4. Kézmozdulatok rögzítésének elkezde

Új Gesture Recognizer létrehozása

A GestureRecognizer csakakkor használható, ha létrehozott egy GestureRecognizert:

GestureRecognizer recognizer = new GestureRecognizer();

Adja meg, hogy mely kézmozdulatokat figyelje

Adja meg, hogy mely kézmozdulatok érdeklik a SetRecognizableGestures()segítségével:

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

Feliratkozás eseményekre ezekhez a kézmozdulatokhoz

Iratkozzon fel az eseményekre az Önt érdeklő kézmozdulatokért.

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 egymást a GestureRecognizer egy példányában.

Kézmozdulatok rögzítésének elkezde

Alapértelmezés szerint a GestureRecognizer nem figyeli a bemenetet, amíg a StartCapturingGestures() meg nincs hívva. Lehetséges, hogy a StopCapturingGestures() lehívása után kézmozdulati esemény jön létre, ha a bemenet a StopCapturingGestures() feldolgozását megelőzően lett létrehozva. A GestureRecognizer tudni fogja, hogy az előző képkockán volt-e be- vagy kikapcsolva, amelyben a kézmozdulat ténylegesen megtörtént, így megbízható a kézmozdulatok figyelése a képkockák célcsoport-figyelése alapján.

recognizer.StartCapturingGestures();

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

A kézmozdulatok felismerésének leállítása:

recognizer.StopCapturingGestures();

Kézmozdulat-ismétlő eltávolítása

Ne felejtsen el leiratkozni az előfizetett eseményekről a GestureRecognizer objektum megsemmisítése előtt.

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

A felhasználók által a különböző gombok megnyomásakor a fizikai vezérlőknek megfelelő mozgásvezérlők renderelhetőek az alkalmazásban a Mixed Reality Toolkitben. Ez az előregyártott modell futásidőben dinamikusan betölti a megfelelő modelt a rendszer telepített mozgásvezérlő-illesztőprogramjéről. Fontos, hogy ezeket a modelleket dinamikusan töltse be ahelyett, hogy manuálisan importálja őket a szerkesztőben, hogy az alkalmazás fizikailag pontos 3D-modelleket mutasson a felhasználók aktuális és jövőbeli vezérlőihez.

  1. Kövesse az Első lépések útmutatót 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 minden rendben van. Ez az előzetesfab tartalmazza a mozgásvezérlő renderelését. Ellenkező esetben adja hozzá az Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab adatokat a jelenethez a Project panelről. Ezt az előfedőt bármely szülőobjektum gyermekobjektumaként kell hozzáadnia, amikor a felhasználó teleportál a jeleneten belül, hogy a vezérlők a felhasználóval együtt tudjanak telepedni. Ha az alkalmazásnak nincs teleportálása, egyszerűen adja hozzá az előfát a jelenet gyökeréhez.

Objektumok dobása

Az objektumok virtuális valóságban való dobása nehezebb probléma, mint amilyennek elsőre tűnhet. Ahogy a legtöbb fizikailag alapú interakciónál, a játék dobáskor is váratlan módon viselkedik, azonnal nyilvánvaló, és magával ragadó. Sokat gondolkodtunk azon, hogyan ábrázolunk egy fizikailag megfelelő dobásos viselkedést, és hoztunk létre néhány irányelveket, amelyek engedélyezve vannak a platformunk frissítései révén, és amelyekről szeretnénk megosztani Önt.

Itt talál egy példát arra, hogyan érdemes implementálni a dobásokat. Ez a minta az alábbi négy irányelv szerint fog esni:

  • Pozíció helyett használja a vezérlő sebességét. A Windows novemberi frissítésében bevezettünk egy viselkedésváltozást a "Hozzávetőleges" pozíciókövetési állapotban. Ebben az állapotban a vezérlő sebességinformációi folyamatosan adatokat fognak jelenteni, amíg hiszünk a pontosságában, amely gyakran hosszabb, mint a pozíció nagy pontossága.

  • Építse be a vezérlő angular-sebességét. Ezt a logikát a fájl tartalmazza throwing.cs a statikus GetThrownObjectVelAngVel metódusban, a fent hivatkozott csomagban:

    1. Mivel az angular velocity kondenzálva van, a dobás objektumnak ugyanazt az angular-sebességet kell fenntartania, mint a dobás pillanatában: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Mivel a dobt objektum tömegének középpontjában valószínűleg nem a testtartás eredete áll, valószínűleg más sebességgel rendelkezik, mint a vezérlő sebessége a felhasználó hivatkozási képkockájában. Az objektum sebességének ezen a módon való hozzájárulási része a dobt objektum középpontszámának azonnali tangenciális sebessége a vezérlő eredete körül. Ez az tangenciális sebesség a vezérlő szögsebességének keresztterméke, a vektor pedig a vezérlő eredete és a dobt objektum tömegének középponti távolságát jelképezi.

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

  • Fordítson különös figyelmet arra az időre, amikor a sebességet alkalmazjuk. Egy gomb megnyomásakor akár 20 ms is lehet, amíg az esemény az operációs rendszer Bluetooth buborékba. Ez azt jelenti, hogy ha lekérdezi, hogy a vezérlő állapota lenyomásról nincs lenyomásra vált-e, vagy a másik módon, a vezérlő olyan információt ad vissza, amely az állapot változását megelőzi. Emellett a lekérdezési API által bemutatott vezérlői pozíció előrejelezhető, hogy a várható pozíciót tükrözi a képkocka megjelenítésekor, amely a jövőben akár 20 ezred is lehet. Ez jól használható a tárolóban lévő objektumok renderelése esetén, de a dobás kiesése pillanatában kiszámított, az objektum megcélzása során az idő problémáját is fel kell számolni. Szerencsére a novemberi frissítésben, amikor egy Unity-esemény, például a InteractionSourcePressed vagy a InteractionSourceReleased lett elküldve, az állapot tartalmazza a gomb megnyomásakor vagy felszabadításakor a korábbi pozícióadatokat. Ahhoz, hogy a vezérlő legpontosabb renderelése és a vezérlők célcsoportba való bedobása a dobás során, megfelelően kell használnia a lekérdezést és az esemény-adatokat:

  • Használja a testtartást. Angular sebesség és a sebesség a testtartáshoz, és nem a mutatótartáshoz viszonyítva van jelentve.

A dobás a jövőbeli frissítésekkel Windows tovább, és itt további információkra számíthat.

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

A kézmozdulatokat és mozgásvezérlőt az input Managerből lehet elérni.

Kövesse az oktatóanyagokat

A részletes testreszabási példákkal és részletes oktatóanyagokkal a Mixed Reality Academy:

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

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

Ha az eddig kifektetett Unity-fejlesztési utat követi, akkor az MRTK alapvető építőelemei vizsgálatának közepén van. Innen folytathatja a következő építőelemre:

Vagy ugorjon a Mixed Reality képességekre és API-kra:

Bármikor visszamehet a Unity fejlesztési ellenőrzőpontjaiba.

Lásd még