Menú manual: MRTK2

Hand Menu UX Example

Los menús de mano permiten a los usuarios abrir rápidamente la interfaz de usuario conectada a la mano para las funciones usadas con frecuencia. Para evitar la activación falsa al interactuar con otros objetos, el menú de la mano proporciona opciones como "Requerir mano plana" y "Usar activación de mirada". Se recomienda usar estas opciones para evitar la activación no deseada.

Ejemplos de menús de mano

La escena HandMenuExamples.unity está en MRTK/Examples/Demos/HandTracking/Scenes la carpeta . Cuando se ejecuta, la escena solo activará el tipo de menú seleccionado actualmente.
HandMenu_ExampleScene

Puede encontrar estos objetos prefabricados de menú manual en MRTK/Examples/Demos/HandTracking/Prefabs la carpeta .

HandMenu_Small_HideOnHandDrop y HandMenu_Medium_HideOnHandDrop

Estos dos ejemplos simplemente activan y desactivan el objeto MenuContent para mostrar y ocultar el menú en el evento OnFirstHandDetected() y OnLastHandLost().
HandMenu_ExampleScene 1
HandMenu_ExampleScene 2

HandMenu_Large_WorldLock_On_GrabAndPull

Para menús más complejos que requieren más tiempo de interacción, se recomienda bloquear el menú. En este ejemplo, el usuario puede agarrar y extraer para bloquear el menú, además de activar y desactivar los eventos MenuContent en OnFirstHandDetected() y OnLastHandLost().
HandMenu_ExampleScene 3

Backplate hace ManipulationHandler que sea agarrable y extraíble. En el evento Manipulation Started, SolverHandler.UpdateSolvers se desactiva para bloquear el menú. Además, muestra el botón Cerrar para permitir al usuario cerrar el menú cuando finalice la tarea. En el evento Manipulation Ended, llama a HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine para permitir que el usuario devuelva el menú a la mano elevando y mirando la palma.
HandMenu_ExampleScene 4

El botón Cerrar reactiva SolverHandler.UpdateSolvers y oculta MenuContent.
HandMenu_ExampleScene 5

HandMenu_Large_AutoWorldLock_On_HandDrop

Este ejemplo es similar a HandMenu_Large_WorldLock_On_GrabAndPull. La única diferencia es que el menú se bloqueará automáticamente en la mano. Esto se hace simplemente sin ocultar MenuContent en el evento OnLastHandLost(). El & comportamiento de extracción de toma es el mismo que HandMenu_Large_WorldLock_On_GrabAndPull ejemplo.

Scripts

El comportamiento de HandConstraint proporciona un solucionador que restringe el objeto con seguimiento a una región segura para el contenido restringido a la mano (como la interfaz de usuario de la mano, los menús, etc.). Las regiones seguras se consideran áreas que no se intersecan con la mano. También se incluye una clase derivada de HandConstraint llamada HandConstraintPalmUp para mostrar un comportamiento común de activar el objeto con seguimiento del solucionador cuando la palma mira hacia el usuario.

Consulte las sugerencias sobre herramientas disponibles para cada HandConstraint propiedad para obtener documentación adicional. A continuación se definen algunas propiedades con más detalle.

HandMenu_ExampleScene Palm up
  • Caja fuerte Zona: la zona segura especifica dónde se va a restringir el contenido. Se recomienda colocar el contenido en el lado ulnar para evitar la superposición con la mano y mejorar la calidad de la interacción. Caja fuerte zonas se calculan tomando la orientación de las manos proyectadas en un plano ortogonal a la vista de la cámara y raycasting en un rectángulo delimitador alrededor de las manos. Caja fuerte zonas se definen para funcionar conIMixedRealityHand, pero también con otros tipos de controlador. Se recomienda explorar lo que representa cada zona segura en diferentes tipos de controlador.

  • Siga hand until facing Cámara With this active, solver will follow hand rotation until the menu is suficientemente aligned with the gaze, at which point it faces the camera. Esto funciona cambiando SolverRotationBehavior en HandConstraintSolver, de LookAtTrackedObject a LookAtMainCamera a medida que varía el ángulo gazeAlignment con el solucionador.

HandMenu Safe Zones
  • Eventos de activación: actualmente, desencadena HandConstraint cuatro eventos de activación. Estos eventos se pueden usar en muchas combinaciones diferentes para crear comportamientos únicos HandConstraint , consulte la escena HandBasedMenuExample en MRTK/Examples/Demos/HandTracking/Scenes/ para obtener ejemplos de estos comportamientos.

    • OnHandActivate: se desencadena cuando una mano satisface el método IsHandActive.
    • OnHandDeactivate: se desencadena cuando el método IsHandActive ya no está satisfecho.
    • OnFirstHandDetected: se produce cuando el estado de seguimiento de la mano cambia de ninguna de las manos en la vista, a la primera mano en la vista.
    • OnLastHandLost: se produce cuando el estado de seguimiento de la mano cambia de al menos una mano en la vista, a ninguna de las manos en la vista.
  • Lógica de activación y desactivación de Solver: actualmente, la recomendación para activar y desactivar HandConstraintPalmUp la lógica es hacerlo mediante el uso del valor UpdateSolver de SolverHandler, en lugar de deshabilitar o habilitar el objeto. Esto se puede ver en la escena de ejemplo a través de los enlaces basados en editor desencadenados después de los eventos ManipulationHandler del menú adjunto "OnManipulationStarted/Ended".

    • Detener la lógica de restricción de mano: al intentar establecer el objeto restringido a mano para detener (así como no ejecutar la lógica de activación o desactivación), establezca UpdateSolver en False en lugar de deshabilitar HandConstraintPalmUp.
      • Si desea habilitar la lógica Reattach basada en miradas (o incluso no basada en miradas), esto va seguido de llamar a la función HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine(). Esto desencadenará una corrutina que, a continuación, seguirá comprobando si se cumplen los criterios "IsValidController" y establecerá UpdateSolver en True una vez que sea (o el objeto esté deshabilitado).
    • Iniciar la lógica de restricción de mano: al intentar establecer el objeto restringido a mano para empezar a seguir la mano de nuevo (en función de si cumple los criterios de activación), establezca UpdateSolver de SolverHandler en true.
  • Volver a adjuntar lógica: actualmente, puede HandConstraintPalmUp volver a adjuntar automáticamente el objeto de destino al punto de seguimiento, independientemente de si UpdateSolver de SolverHandler es True o no. Esto se hace mediante la llamada a la función StartWorldLockReattachCheckCoroutine() de HandConstraintPalmUp, después de que se bloquee el mundo (que, en este caso, establece eficazmente UpdateSolver de SolverHandler en False).

Consulta también