Freigeben über


Handmenü – MRTK2

UX-Beispiel für ein Handmenü

Mithilfe von Handmenüs können Benutzer schnell eine an die Hand angefügte Benutzeroberfläche für häufig verwendete Funktionen öffnen. Um eine falsche Aktivierung während der Interaktion mit anderen Objekten zu verhindern, enthält das Handmenü Optionen wie "Flache Hand erforderlich" und "Aktivierung des Blicks verwenden". Es wird empfohlen, diese Optionen zu verwenden, um eine unerwünschte Aktivierung zu verhindern.

Beispiele für Handmenüs

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

Sie finden diese Handmenü-Prefabs unter MRTK/Examples/Common/Prefabs ordner.

HandMenu_Small_HideOnHandDrop und HandMenu_Medium_HideOnHandDrop

In diesen beiden Beispielen wird einfach das MenuContent-Objekt aktiviert und deaktiviert, um das Menü für onFirstHandDetected() und OnLastHandLost() ein- 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ü zu sperren. In diesem Beispiel kann der Benutzer das Menü abrufen und pullen, um das Menü zu sperren, zusätzlich zum Aktivieren und Deaktivieren der MenuContent-Ereignisse für OnFirstHandDetected() - und OnLastHandLost() -Ereignisse.
HandMenu_ExampleScene 3

Die Backplate macht ManipulationHandler es greifbar und verschiebbar. Beim Manipulation Started-Ereignis wird SolverHandler.UpdateSolvers deaktiviert, um das Menü 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 zur Hand bringen kann, indem er die Handfläche anhebt und anschaut.
HandMenu_ExampleScene 4

Schaltfläche "Schließen " reaktiviert SolverHandler.UpdateSolvers 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ü automatisch weltgesperrt wird. Dieses Verhalten wird behandelt, indem das MenuContent on OnLastHandLost() -Ereignis nicht ausgeblendet wird. Das Pullverhalten & ist identisch mit HandMenu_Large_WorldLock_On_GrabAndPull Beispiel.

Skripts

Das HandConstraint Verhalten stellt einen Solver bereit, der das nachverfolgte Objekt auf eine Region einschränkt, die für handbeschränkte Inhalte (z. B. Handbenutzeroberfläche, Menüs usw.) sicher ist. 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 Dokumentationen finden Sie in den für jede HandConstraint Eigenschaft verfügbaren QuickInfos. Im Folgenden werden einige Eigenschaften ausführlicher definiert.

HandMenu_ExampleScene Palm up
  • Sichere 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 zu vermeiden und die Interaktionsqualität zu verbessern. Sicherheitszonen werden berechnet, indem die Handausrichtung in eine orthogonale Ebene zur Kameraansicht projiziert wird, und raycasting gegen einen Begrenzungsrahmen um die Hände. Sichere Zonen werden für die Arbeit mit IMixedRealityHand definiert, funktionieren aber auch mit anderen Controllertypen. Es wird empfohlen, zu untersuchen, was die einzelnen sicheren Zonen auf verschiedenen Controllertypen darstellen.

  • Hand bis zur Kamera folgen Wenn diese Einstellung aktiviert ist, folgt der Solver der Handdrehung, bis das Menü ausreichend mit dem Blick ausgerichtet ist, ab dem es der Kamera gegenübersteht. Dieses Verhalten funktioniert, indem der SolverRotationBehavior im HandConstraintSolver von LookAtTrackedObject in LookAtMainCamera geändert wird, da der GazeAlignment-Winkel mit dem Solver variiert.

HandMenu Safe Zones
  • Aktivierungsereignisse: Derzeit löst vier HandConstraint Aktivierungsereignisse aus. Diese Ereignisse können in vielen verschiedenen Kombinationen verwendet werden, um eindeutige HandConstraint Verhaltensweisen zu erstellen. Beispiele für diese Verhaltensweisen 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: Löst aus, wenn die IsHandActive-Methode nicht mehr erfüllt ist.
    • OnFirstHandDetected: Tritt auf, wenn sich der Zustand der Handverfolgung von "Keine Hände in Sicht" auf die erste Hand in der Ansicht ändert.
    • OnLastHandLost: Tritt auf, wenn sich der Zustand der Handverfolgung von mindestens einer Hand in der Ansicht in keine Hände ändert.
  • Solver-Aktivierungs-/Deaktivierungslogik: Derzeit wird empfohlen HandConstraintPalmUp , dies mithilfe des UpdateSolver-Werts des SolverHandlers zu tun, anstatt das Objekt zu deaktivieren/zu aktivieren. Dieses Verhalten kann in der Beispielszene durch die editorbasierten Hooks angezeigt werden, die nach den ManipulationHandler-Ereignissen "OnManipulationStarted/Ended" des angefügten Menüs ausgelöst werden.

    • Beenden der Handeinschränkungslogik: Wenn Sie versuchen, das handbeschränkte Objekt so festzulegen, dass die Aktivierungs-/Deaktivierungslogik beendet (oder nicht ausgeführt wird), legen Sie UpdateSolver auf False fest, anstatt HandConstraintPalmUp zu deaktivieren.
      • Wenn Sie die blickbasierte (oder sogar nicht anvisierende) Wiederholungslogik aktivieren möchten, rufen Sie die Funktion HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine() auf. Dieser Aufruf löst eine Coroutine aus, die dann weiterhin überprüft, ob die Kriterien "IsValidController" erfüllt sind, und UpdateSolver auf True festgelegt wird, sobald dies der Fall ist (oder das Objekt deaktiviert ist).
    • Starten der Handeinschränkungslogik: Wenn Sie versuchen, das handbeschränkte Objekt so festzulegen, dass es ihrer Hand erneut folgt (je nachdem, ob es die Aktivierungskriterien erfüllt), legen Sie updateSolver des SolverHandlers auf true fest.
  • Logik erneut anfügen: Derzeit kann das HandConstraintPalmUp Zielobjekt automatisch erneut an den überwachten Punkt angefügt werden, unabhängig davon, ob der UpdateSolver des SolverHandlers True ist oder nicht. Dieses Verhalten wird durch Aufrufen der StartWorldLockReattachCheckCoroutine()-Funktion von HandConstraintPalmUp verarbeitet, nachdem sie weltgesperrt wurde (was in diesem Fall den UpdateSolver von SolverHandler effektiv auf False festlegt).

Weitere Informationen