Menú de mano : MRTK3

Menú mano

Los menús de mano permiten a los usuarios mostrar la interfaz de usuario adjunta a mano para las funciones usadas con frecuencia. Suelen ser 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 un menú de mano, a menudo con la opción de "arrancar" el menú de la mano y anclarlo en el mundo.

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

Escena de ejemplo y prefabs

Si usa el proyecto de plantilla, HandMenuExamples.unity muestra varias configuraciones comunes para los menús de mano, todas ellas mediante el HandConstraintPalmUp script.

Escena de ejemplo de menú mano

HandMenuLarge

Este objeto prefabricado muestra el ejemplo de una interfaz de usuario grande o compleja que requiere un tiempo de interacción extendido. Para este tipo de interfaz de usuario, se recomienda bloquear el menú a mano para mejorar la facilidad de uso y evitar la fatiga del brazo. En este ejemplo también se admite "grab and pull" 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 selección de ubicación. La animación es una fluctuación de escalado simple. 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 que el menú esté bloqueado por el mundo sin arrastrarse demasiado hacia abajo a mano.

Ejemplo de menú mano grande 1

Configuración de Palm Up

En este ejemplo se proporciona la barra que se puede agarrar en el área inferior del menú y el comportamiento automático de bloqueo global. El usuario puede desasociar explícitamente el menú de la mano y colocarlo en el mundo agarrándolo. Para ello, en el evento ManipulationStarted() en ObjectManipulator, deshabilitamos SolverHandler.UpdateSolvers. De lo contrario, el menú no podrá desasociarse, ya que el solucionador HandConstraint 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 HandConstraint comportamiento 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 la mano, los menús, etc.) Las regiones seguras se consideran áreas que no intersecan con la mano. También se incluye una clase derivada de HandConstraint llamada HandConstraintPalmUp para mostrar un comportamiento común de activación del objeto de seguimiento del solucionador cuando la palma de la mano se encuentra frente al 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 contenido en el lado ulnar para evitar la superposición con la mano y mejorar la calidad de la interacción. Las zonas seguras se calculan mediante la orientación de las manos proyectada en un plano ortogonal a la vista de la cámara y la difusión por rayos contra un rectángulo delimitador alrededor de las manos. Las zonas seguras se definen para trabajar con XRNode. Se recomienda explorar lo que cada zona segura representa en diferentes tipos de controlador.

  • Seguir la mano hasta la cámara frontal Con esta opción activa, el solucionador seguirá la rotación de la mano hasta que el menú esté lo suficientemente alineado con la mirada cuando se enfrente a la cámara. Para que esto funcione, cambie en SolverRotationBehavior , HandConstraintSolverde LookAtTrackedObject a LookAtMainCamera como varía el GazeAlignment ángulo con el solucionador.

Zona segura de ejemplo de menú 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 ya no se satisface el método IsHandActive.
    • OnFirstHandDetected: se produce cuando el estado de seguimiento de la mano cambia de ninguna mano a la vista de primera mano.
    • OnLastHandLost: se produce cuando el estado de seguimiento de la mano cambia de al menos una mano en vista a ninguna mano a 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 SolverHandlervalor 's 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 que el objeto restringido a mano se detenga (y no ejecute la lógica de activación y desactivación), establezca UpdateSolver en False en lugar de deshabilitar HandConstraintPalmUp.
      • Si desea habilitar la lógica de reasociación basada en la mirada (o incluso no basada en la mirada), a continuación, se le seguirá llamando a la HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine() función . Esto desencadenará una corrutina que sigue comprobando si se cumplen los criterios "IsValidController" y establecerá UpdateSolver en True una vez que esté (o el objeto esté deshabilitado).
    • Iniciar la lógica de restricción de mano: al intentar establecer el objeto restringido a la mano para que empiece 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, HandConstraintPalmUp puede volver a conectar automáticamente el objeto de destino al punto al que se realiza el seguimiento, independientemente de si el SolverHandlervalor de UpdateSolver es True. Para ello, se llama a la HandConstraintPalmUpfunción de después de StartWorldLockReattachCheckCoroutine() que se haya bloqueado por el mundo (lo que, en este caso, está estableciendo eficazmente UpdateSolver de SolverHandler en False).