Menu ręczne — MRTK2

Przykład środowiska użytkownika menu ręcznego

Menu ręczne umożliwiają użytkownikom szybkie wyświetlanie ręcznie dołączonego interfejsu użytkownika dla często używanych funkcji. Aby zapobiec fałszywej aktywacji podczas interakcji z innymi obiektami, menu strony udostępnia opcje, takie jak "Wymagaj płaskiej ręki" i "Użyj aktywacji spojrzenia". Zaleca się użycie tych opcji, aby zapobiec niepożądanej aktywacji.

Przykłady menu ręcznego

Scena HandMenuExamples.unity znajduje się w MRTK/Examples/Demos/HandTracking/Scenes folderze. Po uruchomieniu scena aktywuje tylko aktualnie wybrany typ menu.
HandMenu_ExampleScene

Te prefabryki menu ręcznego można znaleźć w MRTK/Examples/Common/Prefabs folderze.

HandMenu_Small_HideOnHandDrop i HandMenu_Medium_HideOnHandDrop

Te dwa przykłady po prostu uaktywniają i dezaktywuj obiekt MenuContent, aby pokazać i ukryć menu w zdarzeniach OnFirstHandDetected() i OnLastHandLost().
HandMenu_ExampleScene 1
HandMenu_ExampleScene 2

HandMenu_Large_WorldLock_On_GrabAndPull

W przypadku bardziej złożonych menu, które wymagają dłuższego czasu interakcji, zaleca się zablokowanie menu. W tym przykładzie użytkownik może chwycić i ściągnąć, aby zablokować menu, oprócz aktywowania i dezaktywowania zdarzeń MenuContent onFirstHandDetected() i OnLastHandLost().
HandMenu_ExampleScene 3

Backplate sprawia ManipulationHandler , że jest chwytany i ruchomy. Po rozpoczęciu manipulowaniazdarzeniem funkcja SolverHandler.UpdateSolvers jest dezaktywowana, aby zablokować menu. Ponadto jest wyświetlany przycisk Zamknij , aby umożliwić użytkownikowi zamknięcie menu po zakończeniu zadania. Po zakończeniu manipulowania zdarzeniem wywołuje metodę HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine, aby umożliwić użytkownikowi powrót do ręki przez podniesienie i spojrzenie na dłonię.
HandMenu_ExampleScene 4

Zamknij przycisk reactivates SolverHandler.UpdateSolvers i ukrywa MenuContent.
HandMenu_ExampleScene 5

HandMenu_Large_AutoWorldLock_On_HandDrop

Ten przykład jest podobny do HandMenu_Large_WorldLock_On_GrabAndPull. Jedyną różnicą jest to, że menu będzie automatycznie blokowane przy ręcznym upuszczaniu. To zachowanie jest obsługiwane przez ukrycie zdarzenia MenuContent dla zdarzenia OnLastHandLost(). Pobieranie & zachowanie ściągania jest takie samo jak w przypadku HandMenu_Large_WorldLock_On_GrabAndPull przykładu.

Skrypty

Zachowanie HandConstraint zapewnia moduł rozwiązywania, który ogranicza śledzony obiekt do regionu bezpieczne dla zawartości ograniczonej ręcznie (na przykład interfejs użytkownika ręki, menu itp.). Bezpieczne regiony są uznawane za obszary, które nie przecinają się z ręką. Klasa pochodna wywoływana HandConstraintHandConstraintPalmUp jest również uwzględniona w celu zademonstrowania typowego zachowania aktywowania śledzonego obiektu modułu rozwiązywania, gdy palma jest skierowana do użytkownika.

Zobacz porady dotyczące narzędzi dostępne dla każdej HandConstraint właściwości, aby uzyskać więcej dokumentacji. Poniżej zdefiniowano kilka właściwości.

HandMenu_ExampleScene Palm w górę
  • Bezpieczna strefa: bezpieczna strefa określa miejsce, w którym należy ograniczyć zawartość. Zaleca się umieszczenie zawartości na stronie Ulnar, aby uniknąć nakładania się na rękę i lepszej jakości interakcji. Bezpieczne strefy są obliczane przez zabieranie orientacji rąk skierowanych do ortogonal płaszczyzny do widoku kamery i raycasting przed polem ograniczenia wokół rąk. Bezpieczne strefy są definiowane do pracy, IMixedRealityHand ale także współdziałają z innymi typami kontrolerów. Zaleca się zapoznanie się z tym, co reprezentuje każda bezpieczna strefa w różnych typach kontrolerów.

  • Podążaj ręką, aż do aparatu Dzięki temu ustawieniu aktywne, moduł rozwiązywania będzie podążał za obrotem dłoni, dopóki menu nie będzie wystarczająco wyrównane do spojrzenia, w którym to momencie stoi przed kamerą. To zachowanie działa przez zmianę parametru SolverRotationBehavior w obiekcie HandConstraintSolver z LookAtTrackedObject na LookAtMainCamera, ponieważ kąt GazeAlignment z modułem rozwiązywania różni się.

Bezpieczne strefy HandMenu
  • Zdarzenia aktywacji: obecnie HandConstraint wyzwala cztery zdarzenia aktywacji. Te zdarzenia mogą być używane w wielu różnych kombinacjach do tworzenia unikatowych HandConstraint zachowań. Zobacz scenę HandBasedMenuExample poniżej, aby MRTK/Examples/Demos/HandTracking/Scenes/ zapoznać się z przykładami tych zachowań.

    • OnHandActivate: wyzwala, gdy ręka spełnia metodę IsHandActive.
    • OnHandDeactivate: wyzwala, gdy metoda IsHandActive nie jest już zadowolona.
    • OnFirstHandDetected: występuje, gdy stan śledzenia ręki zmienia się z braku rąk w widoku, do pierwszej ręki w widoku.
    • OnLastHandLost: występuje, gdy stan śledzenia ręki zmienia się z co najmniej jednej strony w widoku, bez rąk w widoku.
  • Logika aktywacji/dezaktywacji modułu rozwiązywania: obecnie zaleca się aktywowanie i dezaktywowanie HandConstraintPalmUp logiki przy użyciu wartości UpdateSolver programu SolverHandler, a nie przez wyłączenie/włączenie obiektu. To zachowanie można zobaczyć w przykładowej scenie za pośrednictwem punktów zaczepienia opartych na edytorze wyzwolonych po zdarzeniu "OnManipulationStarted/Ended" dołączonego menu.

    • Zatrzymywanie logiki ograniczeń ręcznych: podczas próby ustawienia obiektu ograniczonego ręcznie w celu zatrzymania (lub nie uruchomienia) logiki aktywacji/dezaktywacji ustaw wartość UpdateSolver na wartość False, a nie wyłączając metody HandConstraintPalmUp.
      • Jeśli chcesz włączyć logikę dołączenia opartą na spojrzeniu (a nawet nienależącą do spojrzenia), wykonaj czynności opisane w funkcji HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine(). To wywołanie wyzwoli koprocedurę, która następnie kontynuuje sprawdzanie, czy kryteria "IsValidController" są spełnione i ustawi wartość UpdateSolver na True po jego utworzeniu (lub obiekt jest wyłączony).
    • Uruchamianie logiki ograniczeń ręcznych: podczas próby ustawienia obiektu ograniczonego ręcznie, aby ponownie zacząć podążać za ręką (na podstawie tego, czy spełnia kryteria aktywacji), ustaw właściwość UpdateSolver programu SolverHandler na wartość true.
  • Ponownie dołącz logikę: Obecnie HandConstraintPalmUp obiekt docelowy jest w stanie automatycznie ponownie dołączyć obiekt docelowy do śledzonego punktu, niezależnie od tego, czy funkcja UpdateSolver programu SolverHandler ma wartość True, czy nie. To zachowanie jest obsługiwane przez wywołanie funkcji StartWorldLockReattachCheckCoroutine() handConstraintPalmUp po jej zablokowaniu (w tym przypadku skutecznie ustawia wartość UpdateSolver programu SolverHandler na false).

Zobacz też