Handmenü — MRTK2

Hand Menu UX Example

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

Handmenübeispiele

HandMenuExamples.Unity-Szene 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

Diese Handmenüvorstellen finden Sie unter MRTK/Examples/Demos/HandTracking/Prefabs "Ordner".

HandMenu_Small_HideOnHandDrop und HandMenu_Medium_HideOnHandDrop

Diese beiden Beispiele aktivieren und deaktivieren einfach das MenuContent-Objekt, um das Menü auf OnFirstHandDetected() und OnLastHandLost() -Ereignis anzuzeigen und auszublenden.
HandMenu_ExampleScene 1
HandMenu_ExampleScene 2

HandMenu_Large_WorldLock_On_GrabAndPull

Für komplexere Menüs, die längere Interaktionszeit erfordern, empfiehlt es sich, das Menü zu sperren. In diesem Beispiel kann der Benutzer zusätzlich zum Aktivieren und Deaktivieren der MenuContent-Ereignisse on OnFirstHandDetected() und OnLastHandLost() das Menü zum Weltsperren abrufen und abrufen.
HandMenu_ExampleScene 3

Backplate macht ManipulationHandler es greifbar und verschiebbar. Bei dem Ereignis "Manipulation Gestartet " 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. Bei Manipulation Ended-Ereignis ruft es HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine auf, damit der Benutzer das Menü wieder zur Hand bringen kann, indem er die Palme anhebt und betrachtet.
HandMenu_ExampleScene 4

Schließen Sie schaltfläche reactivates SolverHandler.UpdateSolvers, und blenden Sie die 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 in der Hand gesperrt wird. Dies geschieht, indem Sie das MenuContent-Ereignis auf OnLastHandLost() einfach nicht ausblenden. Das Pullverhalten des Grabs & 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 für jede HandConstraint Eigenschaft verfügbaren Tooltipps. Einige Eigenschaften werden unten ausführlicher definiert.

HandMenu_ExampleScene Palm up
  • Tresor Zone: Die sichere Zone gibt an, wo der Inhalt eingeschränkt werden soll. Es wird empfohlen, inhalte auf der Ulnar-Seite zu platzieren, um Überschneidungen mit der Hand zu vermeiden und die Interaktionsqualität zu verbessern. Tresor Zonen werden berechnet, indem die Handausrichtung in eine Ebene orthogonal in die Sicht der Kamera und raycasting gegen ein Begrenzungsfeld um die Hände projiziert wird. Tresor Zonen sind für die Arbeit IMixedRealityHand mit anderen Controllertypen definiert. Es wird empfohlen, zu untersuchen, was jede sichere Zone für verschiedene Controllertypen darstellt.

  • Folgen Sie der Hand, bis Kamera Mit diesem aktiven Solver die Handdrehung folgt, bis das Menü ausreichend an den Blick ausgerichtet ist, an welcher Stelle es der Kamera gegenübersteht. Dies funktioniert, indem der SolverRotationBehavior in der HandConstraintSolver, von LookAtTrackedObject in LookAtMainCamera als Blickrichtungswinkel mit dem Solver variiert.

HandMenu Safe Zones
  • Aktivierungsereignisse: Derzeit HandConstraint werden vier Aktivierungsereignisse ausgelöst. Diese Ereignisse können in vielen verschiedenen Kombinationen verwendet werden, um eindeutige HandConstraint Verhaltensweisen zu erstellen, siehe die HandBasedMenuExample-Szene unter MRTK/Examples/Demos/HandTracking/Scenes/ beispielen dieser Verhaltensweisen.

    • OnHandActivate: Löst aus, wenn eine Hand die IsHandActive-Methode erfüllt.
    • OnHandDeactivate: Trigger, wenn die IsHandActive-Methode nicht mehr erfüllt ist.
    • OnFirstHandDetected: Tritt auf, wenn sich der Handverfolgungszustand von keiner Hand in der Ansicht ändert, in die erste Hand in der Ansicht.
    • OnLastHandLost: Tritt auf, wenn sich der Handverfolgungszustand von mindestens einer Hand in der Ansicht ändert, ohne dass die Hände in der Ansicht angezeigt werden.
  • Solver-Aktivierungs-/Deaktivierungslogik: Derzeit wird empfohlen, logik zu aktivieren und zu deaktivieren HandConstraintPalmUp , besteht darin, dies über die Verwendung des SolverHandler-UpdateSolver-Werts zu tun, anstatt das Objekt zu deaktivieren/zu aktivieren. Dies kann in der Beispielszene durch die editorbasierten Hooks angezeigt werden, die nach den Manipulationshandler-Ereignissen des angefügten Menüs "OnManipulationStarted/Ended" ausgelöst wurden.

    • Beenden der Handeinschränkungslogik: Wenn Sie versuchen, das hand eingeschränkte Objekt auf den Stopp festzulegen (und nicht die Aktivierungs-/Deaktivierungslogik auszuführen), legen Sie UpdateSolver auf False fest, anstatt HandConstraintPalmUp zu deaktivieren.
      • Wenn Sie die blickbasierte (oder sogar nicht blickbasierte) Neuanheftungslogik aktivieren möchten, folgt dies dem Aufrufen der HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine()-Funktion. Dadurch wird ein Coroutine ausgelöst, das dann weiterhin überprüft, ob die "IsValidController"-Kriterien erfüllt sind und UpdateSolver auf "True" festlegen, sobald es sich um "True" handelt (oder das Objekt deaktiviert ist)
    • Starten sie die Handeinschränkungslogik: Wenn Sie versuchen, das handbeschränkte Objekt festzulegen, um erneut mit der Hand zu beginnen (basierend darauf, ob sie die Aktivierungskriterien erfüllt), legen Sie das UpdateSolver des SolverHandlers auf true fest.
  • Logik neu anfügen: Derzeit kann das HandConstraintPalmUp Zielobjekt automatisch an den nachverfolgten Punkt anfügen, unabhängig davon, ob das UpdateSolver des SolverHandlers "True" ist oder nicht. Dies erfolgt durch Aufrufen der StartWorldLockReattachCheckCoroutine()-Funktion von HandConstraintPalmUp, nachdem sie welt gesperrt wurde (in diesem Fall wird das SolverHandler-UpdateSolver effektiv auf False festgelegt).

Siehe auch