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


Kézi menü – MRTK3

Kézi menü

A kézi menük lehetővé teszik a felhasználók számára, hogy kézzel csatlakoztatott felhasználói felületet hozzanak létre a gyakran használt függvényekhez. Ezek általában kis gombcsoportok , amelyek gyors műveleteket kínálnak. Néha azonban összetettebb elrendezések jelennek meg az információk vagy beállítások megjelenítéséhez a felhasználó számára kéz menüként, gyakran azzal a lehetőséggel, hogy "elszakítjuk" a menüt a kéztől, és lehorgonyozjuk a világon.

A Hand (Kéz) menü "Lapos kéz megkövetelése" és "Tekintet aktiválásának használata" lehetőséget biztosít, hogy megakadályozza a hamis aktiválást más objektumokkal való interakció során. Javasoljuk, hogy ezeket a beállításokat használja a nemkívánatos aktiválás megakadályozása érdekében.

Példajelenet és előképek

Ha a sablonprojektet használja, HandMenuExamples.unity számos gyakori konfigurációt mutat be a kézi menükhöz, amelyek mindegyike a HandConstraintPalmUp szkriptet használja.

Példa a Kéz menü jelenetére

HandMenuLarge

Ez az előfab egy nagy vagy összetett felhasználói felület példáját mutatja be, amely hosszabb interakciós időt igényel. Az ilyen típusú felhasználói felület esetén ajánlott a menüt kézzel rögzíteni, hogy javuljon a használhatóság és a karfáradtság. Ez a példa a menü világzárolásához is támogatja a "behúzást és lekérést".

Ebben a példában a menü láthatóvá és láthatatlanná válik az OnFirstHandDetected() esemény MenuContent objektumának aktiválásával. Az OnLastHandLost() esemény esetén a bezárás gomb aktiválódik, és az elhelyezési animáció aktiválódik. Az animáció egy egyszerű skálázási ingadozás. Mivel nem rejtettük el a MenuContentet az OnLastHandLost() eseményen, a menü automatikusan zárolva lesz, ha a kéz nem látható. A Palm Up szakaszban található értékek úgy lettek optimalizálva, hogy a menüt a világ minden részén zárolják anélkül, hogy túl sokat húztak volna le a kézből.

Hand Menu Example Large 1

Palm Up-konfiguráció

Ez a példa a menü alsó részén található megragadható sávot és az automatikus világzárolási viselkedést tartalmazza. A felhasználó explicit módon leválaszthatja a menüt a kézről, és elhelyezheti a világon azáltal, hogy megragadja ezt. Ennek eléréséhez az ObjectManipulator ManipulationStarted() eseményén letiltjuk a SolverHandler.UpdateSolvers parancsot. Ellenkező esetben a menü nem lesz leválasztható, mivel a HandConstraint solver megpróbálja a menüt a kéz pozíciója közelében elhelyezni. A HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine parancsot is használjuk, hogy a felhasználó felemelje a kezét a menü újbóli leosztásához.

Hand Menu Example Large 2

Végül a bezárás gombnak újra kell aktiválnia a SolverHandler.UpdateSolvers parancsot a HandConstraint solver funkcióinak visszaállításához.

Hand Menu Example Large 3

Parancsfájlok

A HandConstraint viselkedés egy olyan megoldási megoldást biztosít, amely a nyomon követett objektumot egy olyan régióra korlátozza, amely biztonságos 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 metsződnek a kézzel. A rendszer egy nevű HandConstraintPalmUp származtatott osztályt HandConstraint is tartalmaz, amely bemutatja a solver-tracked objektum aktiválásának gyakori viselkedését, amikor a tenyér a felhasználóval szemben áll.

További dokumentációért tekintse meg az egyes HandConstraint tulajdonságokhoz elérhető elemleírásokat. Alább néhány tulajdonságot határozunk meg részletesebben.

  • Biztonságos zóna: A biztonságos zóna határozza meg, hogy hol legyen korlátozva a tartalom. Javasoljuk, hogy a tartalmat az Ulnar oldalán helyezze el, hogy elkerülje a kézzel való átfedést és a jobb interakciós minőséget. A biztonságos zónákat a kezek ortogonális síkba vetített tájolása alapján számítják ki, és a kéz körüli határolókeretre sugárzottak. A biztonságos zónák a következővel XRNodevaló együttműködésre vannak definiálva: . Javasoljuk, hogy vizsgálja meg, hogy az egyes biztonságos zónák mit képviselnek a különböző vezérlőtípusokon.

  • Kövesse a kezét, amíg a kamera felé nem néz Ezzel az aktív megoldással a solver addig fogja követni a kéz forgását, amíg a menü nem igazodik megfelelően a tekintethez, amikor a kamerával néz szembe. A művelet elvégzéséhez módosítsa a SolverRotationBehavior () változót a HandConstraintSolver-ről LookAtTrackedObject a-ra LookAtMainCamera , mivel a GazeAlignment solver szöge változó.

Hand Menu Example Safe Zone

  • Aktiválási események: Jelenleg négy HandConstraint aktiválási eseményt aktivál. Ezek az események számos különböző kombinációban használhatók egyedi HandConstraint viselkedések létrehozásához.

    • 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és állapota egyetlen kézről a nézetben való első kézre változik.
    • OnLastHandLost: akkor fordul elő, ha a kézkövetés állapota legalább egy kézről nézetben nem láthatóra változik.
  • Solver-aktiválási/deaktiválási logika: Jelenleg a logika aktiválására és deaktiválására HandConstraintPalmUp vonatkozó javaslat az, hogy az objektum letiltása/engedélyezése helyett használja az SolverHandler's UpdateSolver értéket. Ez 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ézi korlátozású objektumot a leállításra próbálja beállítani (és nem futtatja az aktiválási/deaktiválási logikát), á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, akkor ezt a függvény meghívása HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine() követi. Ez elindít egy koroutint, amely továbbra is ellenőrzi, hogy teljesülnek-e a "IsValidController" feltételek, és az UpdateSolver értékét True (Igaz) értékre állítja, ha az (vagy az objektum le van tiltva).
    • A kézkényszerítés logikájának elindítása: Amikor a kézzel korlátozott 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.
  • Logikai újrapróbálkozás: Jelenleg a HandConstraintPalmUp rendszer automatikusan újraaktiválhatja a célobjektumot a nyomon követett ponthoz, függetlenül attól, hogy az SolverHandler"s UpdateSolver " értéke Igaz-e. Ez úgy történik, hogy meghívja az HandConstraintPalmUp's StartWorldLockReattachCheckCoroutine() függvényt, miután az a világ zárolva lett (amely ebben az esetben hatékonyan állítja be a SolverHandler UpdateSolverjét Hamis értékre).