Menú manual: MRTK2
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.
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_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().
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.
El botón Cerrar reactiva SolverHandler.UpdateSolvers y oculta MenuContent.
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.

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 con
IMixedRealityHand
, 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.

Eventos de activación: actualmente, desencadena
HandConstraint
cuatro eventos de activación. Estos eventos se pueden usar en muchas combinaciones diferentes para crear comportamientos únicosHandConstraint
, consulte la escena HandBasedMenuExample enMRTK/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.
- 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.
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).