Menu ręczne

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

Menu ręczne umożliwiają użytkownikom szybkie pojawianie się ręcznie dołączonego interfejsu użytkownika dla często używanych funkcji. Aby zapobiec fałszywej aktywacji podczas interakcji z innymi obiektami, menu ręczne 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 . Gdy jest uruchomiona, scena aktywuje tylko aktualnie wybrany typ menu.
HandMenu_ExampleScene

Te prefabrykaty menu ręcznego można znaleźć w MRTK/Examples/Demos/HandTracking/Prefabs folderze .

HandMenu_Small_HideOnHandDrop i HandMenu_Medium_HideOnHandDrop

Te dwa przykłady po prostu uaktywniają i dezaktywują obiekt MenuContent w celu pokazania i ukrycia 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 na całym świecie. W tym przykładzie użytkownik może pobrać i ściągnąć menu z blokadą świata, a także aktywować i dezaktywować element MenuContent w zdarzeniach OnFirstHandDetected() i OnLastHandLost().
HandMenu_ExampleScene 3

Dzięki platformie Backplate ManipulationHandler można ją pobierać i movable. W przypadku zdarzenia Manipulation Started funkcja SolverHandler.UpdateSolvers jest dezaktywowana w celu zablokowania menu przez cały świat. Ponadto wyświetla przycisk Zamknij, aby umożliwić użytkownikowi zamknięcie menu po zakończeniu zadania. W przypadku zdarzenia zakończonego manipulacją wywołuje on element HandConstraintPalmUp.StartWorldLockReattacheckCoroutine, aby umożliwić użytkownikowi powrót do menu przez podniesienie i patrzenie na pączek.
HandMenu_ExampleScene 4

Przycisk Zamknij uaktywnia ponownie element SolverHandler.UpdateSolvers i ukrywa element MenuContent.
HandMenu_ExampleScene 5

HandMenu_Large_AutoWorldLock_On_HandDrop

Ten przykład jest podobny do HandMenu_Large_WorldLock_On_GrabAndPull. Jedyna różnica polega na tym, że menu zostanie automatycznie zablokowane przez cały świat po spadku. W tym celu po prostu nie ukrywaj elementu MenuContent w zdarzeniu OnLastHandLost(). Zachowanie & ściągania jest takie samo jak HandMenu_Large_WorldLock_On_GrabAndPull przykład.

Skrypty

To zachowanie zapewnia solver, który ogranicza śledzony obiekt do regionu bezpiecznego dla zawartości ograniczonej ręcznie (takiej jak interfejs użytkownika HandConstraint strony, menu itp.). Sejf regiony są uznawane za obszary, które nie przecinają się z dłonią. Klasa pochodna o nazwie jest również uwzględniana w celu zademonstrowania typowego zachowania aktywowania obiektu śledzonego przez solver, gdy gadzia HandConstraint HandConstraintPalmUp jest skierowana do użytkownika.

Zapoznaj się z poradami dotyczącymi narzędzi dostępnymi dla każdej HandConstraint właściwości, aby uzyskać dodatkową dokumentację. Poniżej przedstawiono kilka właściwości zdefiniowanych bardziej szczegółowo.

HandMenu_ExampleScene Palm up
  • Sejf strefie: strefa bezpieczna określa, gdzie można ograniczyć zawartość. Zaleca się, aby zawartość była umieszczana po stronie Ulnara, aby uniknąć nakładania się ręki i lepszej jakości interakcji. Sejf są obliczane przez ustawienie orientacji rąk w płaszczyźnie poziomej względem widoku aparatu i rzutowanie promieniowe względem pola granicznego wokół rąk. Sejf są zdefiniowane do pracy z, IMixedRealityHand ale również działa z innymi typami kontrolerów. Zalecane jest, aby zbadać, co każda bezpieczna strefa reprezentuje na różnych typach kontrolerów.

  • Podążaj za ręki, dopóki nie zostanie skierowany do aparatu W przypadku tego aktywnego, solver będzie podążał za obracanie ręki, dopóki menu nie zostanie wystarczająco wyrównane z spojrzeniem, w którym stanie przed kamerą. Działa to przez zmianę solverRotationBehavior w handConstraintSolver, z LookAtTrackedObject na LookAtMainCamera, gdy kąt GazeAlignment z solver się zmienia.

HandMenu Safe Zones
  • Zdarzenia aktywacji: obecnie HandConstraint wyzwalacz wyzwala cztery zdarzenia aktywacji. Tych zdarzeń można używać w wielu różnych kombinacjach w celu tworzenia unikatowych zachowań. Przykłady tych zachowań można znaleźć w scenie HandConstraint HandBasedMenuExample w MRTK/Examples/Demos/HandTracking/Scenes/ obszarze .

    • OnHandActivate: jest wyzwalane, gdy ręka spełnia warunki metody IsHandActive.
    • OnHandDeactivate: jest wyzwalane, gdy metoda IsHandActive nie jest już spełniona.
    • OnFirstHandDetected: występuje, gdy stan śledzenia ręki zmienia się z widoku bez rąk na pierwszy rzut ręki w widoku.
    • OnLastHandLost: występuje, gdy stan śledzenia ręki zmienia się z co najmniej jednej ręki na widoku bez rąk do widoku.
  • Logika aktywacji/dezaktywacji programu Solver: obecnie zaleca się aktywowanie i dezaktywowanie logiki przy użyciu wartości UpdateSolver obiektu SolverHandler, a nie przez HandConstraintPalmUp wyłączenie/włączenie obiektu . Można to zobaczyć w przykładowej scenie za pośrednictwem elementów zaczepienia opartych na edytorze wyzwalanych po zdarzeniach ManipulationHandler dołączonego menu "OnManipulationStarted/Ended".

    • Zatrzymywanie logiki ograniczenia ręcznego: podczas próby ustawienia ograniczonego obiektu ręcznego w celu zatrzymania (a także nie uruchamiania logiki aktywacji/dezaktywacji) ustaw wartość False dla rozwiązania UpdateSolver, zamiast wyłączać aplikację HandConstraintPalmUp.
      • Jeśli chcesz włączyć logikę ponownego dołączania opartą na spojrzeniach (a nawet nie na spojrzeniach), następuje wywołanie funkcji HandConstraintPalmUp.StartWorldLockReattacheckCoroutine(). Spowoduje to wyzwolenie coroutine, która następnie kontynuuje sprawdzanie, czy kryteria "IsValidController" zostały spełnione i ustawi UpdateSolver na wartość True, gdy jest (lub obiekt jest wyłączony)
    • Uruchamianie logiki ograniczenia ręcznego: podczas próby ustawienia ograniczonego obiektu ręcznego w celu rozpoczęcia po ręki ponownie (w zależności od tego, czy spełnia kryteria aktywacji), ustaw dla obiektu UpdateSolver solverHandler wartość true.
  • Ponowne dołączanie logiki: obecnie obiekt może automatycznie ponownie dołączać obiekt docelowy do śledzonego punktu, niezależnie od tego, czy element UpdateSolver obiektu SolverHandler ma wartość True, czy HandConstraintPalmUp nie. Odbywa się to za pomocą wywołania funkcji StartWorldLockReattacheckCoroutine() funkcji HandConstraintPalmUp, gdy zostanie ona zablokowana na świecie (co w tym przypadku efektywnie ustawia dla klasy UpdateSolver solverHandler wartość False).

Zobacz też