Menú Manual : MRTK3

Menú Mano

Los menús de mano permiten a los usuarios abrir la interfaz de usuario conectada a mano para las funciones usadas con frecuencia. Normalmente son grupos de botones pequeños que ofrecen acciones rápidas. Sin embargo, a veces se proporcionan diseños más complejos para mostrar información o configuración al usuario como menú de mano, a menudo con la opción de "quitar" el menú de la mano y anclarlo en el mundo.

El menú Mano proporciona opciones "Requerir mano plana" y "Usar activación de mirada" para evitar la activación falsa al interactuar con otros objetos. Se recomienda usar estas opciones para evitar la activación no deseada.

Escena de ejemplo y objetos prefabricados

Si usa el proyecto de plantilla, HandMenuExamples.unity muestra varias configuraciones comunes para los menús de mano, todo ello con el HandConstraintPalmUp script .

Escena de ejemplo del menú Mano

HandMenuLarge

Este objeto prefabricado muestra el ejemplo de una interfaz de usuario grande o compleja que requiere un tiempo de interacción prolongado. Para este tipo de interfaz de usuario, se recomienda bloquear el menú de la mano para mejorar la facilidad de uso y evitar la fatiga de los brazos. En este ejemplo también se admiten "agarrar y extraer" para bloquear el menú.

En este ejemplo, el menú se vuelve visible e invisible activando el objeto MenuContent en el evento OnFirstHandDetected(). Con el evento OnLastHandLost(), se activa el botón Cerrar y se desencadena la animación de colocación. La animación es una simple fluctuación de escalado. Dado que no ocultamos el evento MenuContent en OnLastHandLost(), el menú se bloqueará automáticamente cuando la mano no esté visible. Los valores de la sección Palm Up se han optimizado para hacer que el menú esté bloqueado por el mundo sin arrastrarse demasiado en la lista desplegable de la mano.

Ejemplo de menú mano grande 1

Configuración de Palm Up

En este ejemplo se proporciona la barra agarrable en el área inferior del menú y el comportamiento automático de bloqueo mundial. El usuario puede desasociar explícitamente el menú de la mano y colocarlo en el mundo agarrando esto. Para lograrlo, en el evento ManipulationStarted() de ObjectManipulator, deshabilitamos SolverHandler.UpdateSolvers. De lo contrario, el menú no podrá desasociarse, ya que HandConstraint solver intentará colocar el menú cerca de la posición de la mano. También usamos HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine para permitir que el usuario levante la mano para volver a adjuntar el menú a la mano.

Ejemplo de menú mano grande 2

Por último, el botón Cerrar debe reactivar SolverHandler.UpdateSolvers para restaurar la funcionalidad del solucionador HandConstraint.

Ejemplo de menú mano grande 3

Scripts

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

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

  • Zona segura: la zona segura especifica dónde se va a restringir el contenido. Se recomienda colocar el contenido en el lado ulnar para evitar superponerse con la mano y mejorar la calidad de interacción. Las zonas seguras se calculan mediante la orientación de las manos proyectadas en un plano ortogonal a la vista de la cámara y la radiodifusión en un rectángulo delimitador alrededor de las manos. Las zonas seguras se definen para que funcionen con XRNode. Se recomienda explorar lo que representa cada zona segura en diferentes tipos de controlador.

  • Seguir la mano hasta la cámara orientada Con este activo, el solucionador seguirá la rotación de manos hasta que el menú esté suficientemente alineado con la mirada cuando se enfrente a la cámara. Para realizar este trabajo, cambie en SolverRotationBehaviorHandConstraintSolver, de LookAtTrackedObject a LookAtMainCamera como el GazeAlignment ángulo con el solucionador varía.

Ejemplo de zona segura del menú de mano

  • 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 .

    • 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 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 vista a ninguna de las manos en la vista.
  • Lógica de activación/desactivación del solucionador: actualmente, la recomendación para activar y desactivar HandConstraintPalmUp la lógica es hacerlo mediante el uso del SolverHandlervalor de UpdateSolver 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 "OnManipulationStarted/Ended" del menú adjunto.

    • Detener la lógica de restricción de mano: al intentar establecer el objeto restringido a mano para detener (y 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 de reintento basada en la mirada (o incluso no basada en miradas), esto va seguido de llamar a la HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine() función . Esto desencadenará una corrutina que continúa 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.
  • Lógica de reintento: actualmente, HandConstraintPalmUp puede volver a adjuntar automáticamente el objeto de destino al punto de seguimiento, independientemente de si el SolverHandlervalor UpdateSolver de es True. Esto se hace mediante una llamada a la HandConstraintPalmUpfunción de StartWorldLockReattachCheckCoroutine() después de que se haya bloqueado el mundo (lo que, en este caso, establece eficazmente updateSolver de SolverHandler en False).