Kézi menü – MRTK2
A kézi menük lehetővé teszik a felhasználók számára a gyakran használt funkciókhoz tartozó, kézzel csatlakoztatott felhasználói felület gyors megjelenítését. Ha meg szeretné akadályozni a hamis aktiválást más objektumokkal való interakció során, a kéz menü olyan lehetőségeket kínál, mint a "Lapos kéz megkövetelése" és a "Tekintet aktiválásának használata". Javasoljuk, hogy ezeket a lehetőségeket használja a nemkívánatos aktiválás megelőzése érdekében.
Példák a Kézi menüre
A HandMenuExamples.unity jelenet a mappában MRTK/Examples/Demos/HandTracking/Scenes
van. Amikor fut, a jelenet csak az aktuálisan kiválasztott menütípust aktiválja.
Ezeket a kézimenü-előfabsokat a mappában MRTK/Examples/Common/Prefabs
találja.
HandMenu_Small_HideOnHandDrop és HandMenu_Medium_HideOnHandDrop
Ez a két példa egyszerűen aktiválja és inaktiválja a MenuContent objektumot az OnFirstHandDetected() és az OnLastHandLost() esemény menüjének megjelenítéséhez és elrejtéséhez.
HandMenu_Large_WorldLock_On_GrabAndPull
A hosszabb interakciós időt igénylő összetettebb menük esetén javasoljuk, hogy a menüt globálisan zárolja. Ebben a példában a felhasználó az OnFirstHandDetected() és az OnLastHandLost() eseményeken a MenuContent aktiválása és inaktiválása mellett a menüt is megragadhatja és lekérheti.
A Backplate-tal ManipulationHandler
megragadható és mozgatható. A Manipuláció elindítvaeseményen a SolverHandler.UpdateSolvers inaktiválva van a menü globális zárolásához. Emellett megjelenik a Bezárás gomb is, amely lehetővé teszi, hogy a felhasználó bezárja a menüt a feladat befejezésekor. A Manipuláció befejeződött esemény meghívja HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine parancsot, hogy a felhasználó a tenyér felemelésével és nézésével visszahozza a menüt.
A Bezárás gomb újraaktiválja a SolverHandler.UpdateSolvers parancsot , és elrejti a MenuContent parancsot.
HandMenu_Large_AutoWorldLock_On_HandDrop
Ez a példa hasonló a HandMenu_Large_WorldLock_On_GrabAndPull. Az egyetlen különbség az, hogy a menü automatikusan globálisan zárolva lesz a kézdobáskor. Ezt a viselkedést úgy kezeli a rendszer, hogy nem rejti el a MenuContent onLastHandLost() eseményt. A lekéréses & viselkedése megegyezik HandMenu_Large_WorldLock_On_GrabAndPull példával.
Parancsfájlok
A HandConstraint
viselkedés egy olyan megoldási megoldást biztosít, amely a nyomon követett objektumot egy biztonságos régióra korlátozza a korlátozott tartalom (például a kézi felhasználói felület, a menük stb.) számára. A biztonságos régiók olyan területeknek minősülnek, amelyek nem kapcsolódnak egymáshoz. A rendszer a meghívott HandConstraintPalmUp
származtatott osztályt HandConstraint
is tartalmazza, hogy bemutassa a solver tracked objektum aktiválásának gyakori viselkedését, amikor a tenyér a felhasználóval néz szembe.
További dokumentációért tekintse meg az egyes HandConstraint
tulajdonságokhoz elérhető eszköztippeket. Néhány tulajdonságot az alábbiakban talál részletesebben.
Biztonságos zóna: A biztonságos zóna határozza meg, hogy hol korlátozza a tartalmat. Javasoljuk, hogy a tartalom az Ulnar oldalán legyen elhelyezve, hogy elkerülje a kézzel való átfedést és a jobb interakciós minőséget. A biztonságos zónákat úgy számítjuk ki, hogy egy sík ortogonálisra vetített kéz tájolását a kamera nézetére vetítjük, és a kéz körüli határolókeretre sugárszórjuk. A biztonságos zónák úgy vannak definiálva, hogy működjenek,
IMixedRealityHand
de más vezérlőtípusokkal is működnek. Javasoljuk, hogy vizsgálja meg, hogy az egyes biztonságos zónák mit jelentenek a különböző vezérlőtípusokon.Kövesse a kezét, amíg a kamera felé nem áll Ha ez a beállítás aktív, a solver addig követi a kéz forgását, amíg a menü nem igazodik megfelelően a tekintethez, és ekkor a kamerával néz szembe. Ez a viselkedés úgy működik, hogy a HandConstraintSolver SolverRotationBehavior értékét a LookAtTrackedObjectről LookAtMainCamera-ra módosítja, mivel a Solver gazeAlignment szöge változó.
Aktiválási események: Jelenleg négy
HandConstraint
aktiválási esemény aktiválódik. Ezek az események számos különböző kombinációban használhatók egyediHandConstraint
viselkedések létrehozásához, lásd a HandBasedMenuExample jelenetetMRTK/Examples/Demos/HandTracking/Scenes/
, amely példákat mutat be ezekre a viselkedésekre.- OnHandActivate: akkor aktiválódik, ha egy kéz megfelel az IsHandActive metódusnak.
- OnHandDeactivate: akkor aktiválódik, ha az IsHandActive metódus már nem teljesül.
- OnFirstHandDetected: akkor fordul elő, ha a kézkövetési állapot egyik kézről a nézetben való elsőre változik.
- OnLastHandLost: akkor fordul elő, ha a kézkövetés állapota legalább egy kézről nézetben változik, és nincs kéz a nézetben.
Solver-aktiválási/deaktiválási logika: A logika aktiválására és inaktiválására
HandConstraintPalmUp
jelenleg a SolverHandler UpdateSolver értékének használatával lehet javaslatot tenni, nem pedig az objektum letiltásával/engedélyezésével. Ez a viselkedés a példajelenetben a csatolt menü ManipulationHandler "OnManipulationStarted/Ended" eseményei után aktivált szerkesztőalapú horgokon keresztül látható.- A hand-constraint logika leállítása: Amikor a kézzel korlátozott objektumot az aktiválási/deaktiválási logika leállítására (vagy nem futtatására) próbálja beállítani, állítsa az UpdateSolver értékét Hamis értékre a HandConstraintPalmUp letiltása helyett.
- Ha engedélyezni szeretné a tekintetalapú (vagy akár nem tekintetalapú) reattach logikát, kövesse a HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine() függvény meghívásával. Ez a hívás elindít egy koroutint, amely ezután továbbra is ellenőrzi, hogy teljesülnek-e az "IsValidController" feltételek, és az UpdateSolver értékét True (igaz) értékre állítja, ha az (vagy az objektum le van tiltva).
- A hand-constraint logika indítása: Amikor a kézi korlátozású objektumot úgy próbálja beállítani, hogy újra elkezdje követni a kezét (attól függően, hogy megfelel-e az aktiválási feltételeknek), állítsa a SolverHandler UpdateSolver értékét true (igaz) értékre.
- A hand-constraint logika leállítása: Amikor a kézzel korlátozott objektumot az aktiválási/deaktiválási logika leállítására (vagy nem futtatására) próbálja beállítani, állítsa az UpdateSolver értékét Hamis értékre a HandConstraintPalmUp letiltása helyett.
Újracsatolási logika: A jelenleg
HandConstraintPalmUp
képes automatikusan újraaktiválni a célobjektumot a nyomon követett pontra, függetlenül attól, hogy a SolverHandler UpdateSolver értéke Igaz-e vagy sem. Ezt a viselkedést a HandConstraintPalmUp StartWorldLockReattachCheckCoroutine() függvényének meghívásával lehet kezelni, miután az már világzárolt (amely ebben az esetben gyakorlatilag False értékre állítja a SolverHandler UpdateSolverjét).