Menu ręczne — MRTK2
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.
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_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().
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ę.
Zamknij przycisk reactivates SolverHandler.UpdateSolvers i ukrywa MenuContent.
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 HandConstraint
HandConstraintPalmUp
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.
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ę.
Zdarzenia aktywacji: obecnie
HandConstraint
wyzwala cztery zdarzenia aktywacji. Te zdarzenia mogą być używane w wielu różnych kombinacjach do tworzenia unikatowychHandConstraint
zachowań. Zobacz scenę HandBasedMenuExample poniżej, abyMRTK/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.
- 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.
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).