Handmenü — MRTK3

Handmenü

Mit Handmenüs können Benutzer eine handanhängende Benutzeroberfläche für häufig verwendete Funktionen aufrufen. Dies sind in der Regel kleine Schaltflächengruppen , die schnelle Aktionen bieten. Manchmal werden dem Benutzer jedoch komplexere Layouts zum Anzeigen von Informationen oder Einstellungen als Handmenü bereitgestellt, oft mit der Option, das Menü aus der Hand zu reißen und es in der Welt zu verankern.

Das Handmenü bietet die Optionen "Flat Hand erforderlich" und "Aktivierung des Blicks verwenden", um eine falsche Aktivierung während der Interaktion mit anderen Objekten zu verhindern. Es wird empfohlen, diese Optionen zu verwenden, um unerwünschte Aktivierung zu verhindern.

Beispielszene und Prefabs

Wenn Sie das Vorlagenprojekt verwenden, HandMenuExamples.unity werden mehrere gängige Konfigurationen für Handmenüs veranschaulicht, die alle das HandConstraintPalmUp Skript verwenden.

Handmenü-Beispielszene

HandMenüLarge

Dieses Prefab veranschaulicht das Beispiel einer großen oder komplexen Benutzeroberfläche, die eine längere Interaktionszeit erfordert. Für diese Art von Benutzeroberfläche wird empfohlen, das Menü auf der Hand zu sperren, um die Benutzerfreundlichkeit zu verbessern und Armermüdung zu vermeiden. Dieses Beispiel unterstützt auch "greifen und ziehen", um das Menü weltzusperren.

In diesem Beispiel wird das Menü sichtbar und unsichtbar, indem das MenuContent-Objekt für das OnFirstHandDetected() -Ereignis aktiviert wird. Mit dem OnLastHandLost() -Ereignis wird die Schaltfläche schließen aktiviert, und die Platzierungsanimation wird ausgelöst. Die Animation ist eine einfache Skalierungsschwankung. Da das MenuContent on OnLastHandLost() -Ereignis nicht ausgeblendet wurde, wird das Menü automatisch weltgesperrt, wenn die Hand nicht sichtbar ist. Die Werte im Abschnitt Palm Up wurden so optimiert, dass das Menü weltgesperrt ist, ohne zu sehr nach unten gezogen zu werden.

Handmenü Beispiel groß 1

Palm Up-Konfiguration

In diesem Beispiel werden die Greifleiste im unteren Bereich des Menüs und das verhalten der automatischen Weltsperrung bereitgestellt. Der Benutzer kann das Menü explizit von der Hand trennen und es in der Welt platzieren, indem er dieses greift. Um dies zu erreichen, deaktivieren wir solverHandler.UpdateSolvers im ManipulationStarted()-Ereignis in ObjectManipulator. Andernfalls kann das Menü nicht getrennt werden, da der HandConstraint-Solver versucht, das Menü in der Nähe der Handposition zu positionieren. Wir verwenden auch HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine , damit der Benutzer die Hand anheben kann, um das Menü erneut an die Hand anfügen zu können.

Handmenü Beispiel groß 2

Schließlich muss die Schaltfläche zum Schließen die SolverHandler.UpdateSolvers reaktivieren, um die Funktionalität des HandConstraint-Solvers wiederherzustellen.

Handmenü Beispiel groß 3

Skripts

Das HandConstraint-Verhalten bietet einen Solver, der das nachverfolgte Objekt auf einen Bereich beschränkt, der für auf die Hände eingeschränkte Inhalte (z. B. Handbenutzeroberfläche, Menüs usw.) sicher ist. Sichere Regionen gelten als 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 HandConstraint Eigenschaft verfügbar sind. Einige Eigenschaften sind unten ausführlicher definiert.

  • 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. Sichere Zonen werden durch die Ausrichtung der Hände berechnet, die in ein orthogonales Ebene auf die Kameraansicht projiziert wird und gegen einen begrenzungsenden Kasten um die Hände strahlt. Sichere Zonen werden für die Verwendung mit XRNodedefiniert. Es wird empfohlen, die einzelnen sicheren Zonen auf verschiedenen Controllertypen zu untersuchen.

  • Folgen Sie der Hand bis zur Kamera Wenn dieser aktiviert ist, folgt der Solver der Handdrehung, bis das Menü ausreichend auf den Blick ausgerichtet ist, wenn es auf die Kamera ausgerichtet ist. Damit dies funktioniert, ändern Sie den SolverRotationBehavior in , HandConstraintSolvervon LookAtTrackedObject in LookAtMainCamera , da der GazeAlignment Winkel mit dem Solver variiert.

Beispiel für sichere Zone im Handmenü

  • Aktivierungsereignisse: Derzeit HandConstraint werden vier Aktivierungsereignisse ausgelöst. Diese Ereignisse können in vielen verschiedenen Kombinationen verwendet werden, um eindeutige HandConstraint Verhaltensweisen zu erstellen.

    • 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 Handnachverfolgung von keine Händen in der Ansicht 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.
  • Solveraktivierungs-/Deaktivierungslogik: Derzeit besteht die Empfehlung zum Aktivieren und Deaktivieren HandConstraintPalmUp der Logik darin, dies mithilfe des SolverHandlerWerts des Objekts UpdateSolver zu tun, anstatt das Objekt zu deaktivieren/zu aktivieren. Dies ist in der Beispielszene durch die editorbasierten Hooks zu sehen, 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 es beendet wird (und nicht die Aktivierungs-/Deaktivierungslogik ausgeführt wird), legen Sie UpdateSolver auf False fest, anstatt HandConstraintPalmUp zu deaktivieren.
      • Wenn Sie die blickbasierte (oder sogar nicht auf blickbasierte) Neuanfügen-Logik aktivieren möchten, folgt das Aufrufen der HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine() Funktion. Dadurch wird eine Coroutine ausgelöst, die weiterhin überprüft, ob die "IsValidController"-Kriterien erfüllt sind, und UpdateSolver wird auf True festgelegt, 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 erneut mit der Hand beginnt (je nachdem, ob es die Aktivierungskriterien erfüllt), legen Sie den UpdateSolver des SolverHandlers auf true fest.
  • Logik neu anfügen: Derzeit kann das HandConstraintPalmUp Zielobjekt automatisch erneut an den nachverfolgten Punkt angefügt werden, unabhängig davon, ob " SolverHandlers UpdateSolver True" ist. Dies erfolgt durch Aufrufen der HandConstraintPalmUpFunktion "s StartWorldLockReattachCheckCoroutine() ", nachdem sie weltgesperrt wurde (was in diesem Fall effektiv die UpdateSolver-Einstellung des SolverHandlers auf False festlegt).