Handmenü

UX-Beispiel für ein Handmenü

MitHilfe von Handmenüs können Benutzer schnell eine handverfügte Benutzeroberfläche für häufig verwendete Funktionen aufrufen. Um eine falsche Aktivierung während der Interaktion mit anderen Objekten zu verhindern, bietet das Handmenü Optionen wie "Flache Hand erforderlich" und "Anviertaktivierung verwenden". Es wird empfohlen, diese Optionen zu verwenden, um unerwünschte Aktivierung zu verhindern.

Beispiele für Handmenüs

Die Szene "HandMenuExamples.unity" befindet sich im MRTK/Examples/Demos/HandTracking/Scenes Ordner . Wenn sie ausgeführt wird, wird die Szene nur den aktuell ausgewählten Menütyp aktivieren.
HandMenu_ExampleScene

Sie finden diese Prefabs im Handmenü im MRTK/Examples/Demos/HandTracking/Prefabs Ordner .

HandMenu_Small_HideOnHandDrop und HandMenu_Medium_HideOnHandDrop

In diesen beiden Beispielen wird das MenuContent-Objekt einfach aktiviert und deaktiviert, um das Menü im OnFirstHandDetected()- und OnLastHandLost()-Ereignis anzuzeigen und auszublenden.
HandMenu_ExampleScene 1
HandMenu_ExampleScene 2

HandMenu_Large_WorldLock_On_GrabAndPull

Für komplexere Menüs, die eine längere Interaktionszeit erfordern, wird empfohlen, das Menü weltweit zu sperren. In diesem Beispiel kann der Benutzer das Menü abrufen und zur Weltsperre ziehen, zusätzlich zum Aktivieren und Deaktivieren des MenuContent-Ereignisses für OnFirstHandDetected() und OnLastHandLost().
HandMenu_ExampleScene 3

Backplate es ManipulationHandler macht es greifend und verschiebbar. Beim Manipulation Started-Ereignis wird SolverHandler.UpdateSolvers deaktiviert, um das Menü weltweit zu sperren. Darüber hinaus wird die Schaltfläche Schließen angezeigt, damit der Benutzer das Menü schließen kann, wenn die Aufgabe abgeschlossen ist. Beim Manipulation Ended-Ereignis wird HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine aufgerufen, damit der Benutzer das Menü wieder in die Hand nehmen kann, indem er die Handfläche anhebt und ansieht.
HandMenu_ExampleScene 4

Die Schaltfläche "Schließen" aktiviert SolverHandler.UpdateSolvers erneut und blendet menuContent aus.
HandMenu_ExampleScene 5

HandMenu_Large_AutoWorldLock_On_HandDrop

Dieses Beispiel ähnelt HandMenu_Large_WorldLock_On_GrabAndPull. Der einzige Unterschied besteht darin, dass das Menü beim Handablage automatisch weltversperrt wird. Dies erfolgt, indem das Ereignis MenuContent on OnLastHandLost() einfach nicht ausgeblendet wird. Das Pullverhalten von "Greifen &" entspricht HandMenu_Large_WorldLock_On_GrabAndPull Beispiel.

Skripts

Das HandConstraint-Verhalten stellt einen Solver bereit, der das verfolgte Objekt auf einen Bereich beschränkt, der für auf Hand eingeschränkte Inhalte sicher ist (z. B. Handbenutzeroberfläche, Menüs usw.). Als sichere Regionen gelten Bereiche, die sich nicht mit der Hand überschneiden. Eine abgeleitete Klasse von HandConstraint namens HandConstraintPalmUp ist ebenfalls enthalten, um ein allgemeines Verhalten der Aktivierung des vom Solver verfolgten Objekts zu veranschaulichen, wenn die Handfläche dem Benutzer zugewandt ist.

Weitere Dokumentation finden Sie in den QuickInfos, die für jede Eigenschaft verfügbar HandConstraint sind. Einige Eigenschaften werden unten ausführlicher definiert.

HandMenu_ExampleScene Palm up
  • Tresor Zone: Die sichere Zone gibt an, wo Inhalte eingeschränkt werden sollen. Es wird empfohlen, Inhalte auf der Ulnar-Seite zu platzieren, um Überschneidungen mit der Hand und eine verbesserte Interaktionsqualität zu vermeiden. Tresor Zonen werden berechnet, indem die Ausrichtung der Hände, die in ein Ebenenorthogonal projiziert werden, zur Ansicht der Kamera und zum Raycasting an einem umgebenden Feld um die Hände geleitet wird. Tresor Zonen sind für die Arbeit mit IMixedRealityHand definiert, funktionieren aber auch mit anderen Controllertypen. Es wird empfohlen, zu untersuchen, was jede sichere Zone auf verschiedenen Controllertypen darstellt.

  • Hand bis Kamera folgen Bei dieser Aktivität folgt der Solver der Handdrehung, bis das Menü ausreichend auf den Anviert ausgerichtet ist, an dem er sich der Kamera gegenübersieht. Dies funktioniert, indem SolverRotationBehavior im HandConstraintSolver von LookAtTrackedObject in LookAtMainCamera geändert wird, da der GazeAlignment-Winkel mit dem Solver variiert.

HandMenu Safe Zones
  • Aktivierungsereignisse: Derzeit HandConstraint löst vier Aktivierungsereignisse aus. Diese Ereignisse können in vielen verschiedenen Kombinationen verwendet werden, um eindeutige Verhaltensweisen zu erstellen. Beispiele für HandConstraint dieses Verhalten finden Sie in der HandBasedMenuExample-Szene unter MRTK/Examples/Demos/HandTracking/Scenes/ .

    • OnHandActivate: wird ausgelöst, wenn eine Hand die IsHandActive-Methode erfüllt.
    • OnHandDeactivate: wird ausgelöst, wenn die IsHandActive-Methode nicht mehr erfüllt wird.
    • OnFirstHandDetected: tritt auf, wenn sich der Zustand der Handnachverfolgung von keiner Hand in der Ansicht in die erste Hand ändert.
    • OnLastHandLost: Tritt auf, wenn sich der Zustand der Handnachverfolgung von mindestens einer Hand in der Ansicht in keine Hände ändert.
  • Aktivierungs-/Deaktivierungslogik des Solvers: Derzeit wird empfohlen, die Logik zu aktivieren und zu deaktivieren, HandConstraintPalmUp indem Sie den UpdateSolver-Wert von SolverHandler verwenden, anstatt das Objekt zu deaktivieren/zu aktivieren. Dies ist in der Beispielszene über die editorbasierten Hooks zu sehen, die nach den ManipulationHandler-Ereignissen "OnManipulationStarted/Ended" des angefügten Menüs ausgelöst werden.

    • Beenden der Handeinschränkungslogik: Legen Sie UpdateSolver auf False fest, anstatt HandConstraintPalmUp zu deaktivieren, wenn Sie versuchen, das objekt mit Handeinschränkung zu beenden (und die Aktivierungs-/Deaktivierungslogik nicht auszuführen).
      • Wenn Sie die logikbasierte (oder sogar nicht anverfolgte) Neuanvieren-Logik aktivieren möchten, wird anschließend die Funktion HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine() aufgerufen. Dadurch wird eine Coroutine ausgelöst, die dann weiterhin überprüft, ob die IsValidController-Kriterien erfüllt sind, und UpdateSolver auf True festgelegt wird, sobald sie ist (oder das Objekt deaktiviert ist).
    • Starten der Handeinschränkungslogik: Legen Sie den UpdateSolver des SolverHandlers auf TRUE fest, wenn Sie versuchen, das handgebundene Objekt so festzulegen, dass es wieder ihrer Hand folgt (je nachdem, ob es die Aktivierungskriterien erfüllt).
  • Logik erneut anfügen: Derzeit HandConstraintPalmUp kann das Zielobjekt automatisch erneut an den nachverfolgten Punkt angefügt werden, unabhängig davon, ob der UpdateSolver des SolverHandler true ist oder nicht. Dies erfolgt durch Aufrufen der StartWorldLockReattachCheckCoroutine()-Funktion von HandConstraintPalmUp, nachdem sie weltweit gesperrt wurde (was in diesem Fall den UpdateSolver des SolverHandlers auf False festlegt).

Siehe auch