Selección de destino compatible con los ojos: MRTK2
En esta página se describen diferentes opciones para acceder a datos de mirada ocular y eventos específicos de mirada ocular para seleccionar destinos en MRTK. El seguimiento ocular permite selecciones de destino rápidas y sin esfuerzo mediante una combinación de información sobre lo que un usuario está examinando con entradas adicionales, como seguimiento de manos y comandos de voz:
- Busque & diga "Seleccionar" (comando de voz predeterminado)
- Busque & Diga "Explotar" o "Pop" (comandos de voz personalizados)
- Botón & Bluetooth
- Mira & Pinch (es decir, mantener la mano delante de ti y traer el pulgar y el dedo índice juntos)
- Tenga en cuenta que para que esto funcione, los rayos de mano deben estar deshabilitados.
Para seleccionar contenido holográfico mediante la mirada con los ojos, hay varias opciones:
1. Use el puntero de enfoque principal:
Esto se puede entender como el cursor con prioridad. De forma predeterminada, si las manos están en la vista, esto sería rayos de mano. Si no hay manos en la vista, el puntero con prioridad sería la cabeza o la mirada con los ojos. Por lo tanto, tenga en cuenta que en función de la mirada ocular o de la cabeza de diseño actual se suprime como entrada de cursor si se usan rayos de mano.
Por ejemplo:
Un usuario quiere seleccionar un botón holográfico lejano. Como desarrollador, quiere proporcionar una solución flexible que permita al usuario lograr estas tareas en diversas condiciones:
- Camina hasta el botón y cópielo
- Míralo desde una distancia y diga "select"
- Establecer como destino el botón mediante un rayo de mano y realizar una pellizcar En este caso, la solución más flexible es usar el controlador de foco principal, ya que le notificará cada vez que el puntero de foco principal con prioridad actualmente desencadena un evento. Tenga en cuenta que si los rayos de mano están habilitados, el puntero de foco de la mirada con los ojos o la cabeza se deshabilitan en cuanto las manos entran en la vista.
Importante
Tenga en cuenta que si los rayos de mano están habilitados, el puntero de foco de la mirada con los ojos o la cabeza se deshabilitan en cuanto las manos entran en la vista. Si desea admitir una interacción de "aspecto y pellizco", debe deshabilitar el rayo de mano. En nuestras escenas de ejemplo de seguimiento ocular, hemos deshabilitado el rayo de mano para permitir que se muestren interacciones más enriquecidas con los ojos y los movimientos de las manos; vea, por ejemplo , Posicionamiento compatible con los ojos.
2. Use el foco ocular y los rayos de mano al mismo tiempo:
Puede haber instancias en las que quiera ser más específico qué tipo de punteros de foco pueden desencadenar determinados eventos y permitir el uso simultáneo de varias técnicas de interacción lejanas.
Por ejemplo: en la aplicación, un usuario puede usar rayos de mano lejanos para manipular algunas configuraciones mecánicas holográficas, por ejemplo, agarrar y mantener algunas partes de motor holográficas distantes y mantenerlas en su lugar. Al hacerlo, el usuario tiene que seguir una serie de instrucciones y registrar su progreso marcando algunas casillas. Si el usuario tiene sus manos no ocupadas, sería instintiva simplemente tocar la casilla o seleccionarla con un rayo de mano. Sin embargo, si el usuario tiene sus manos ocupadas, como en nuestro caso manteniendo algunas partes del motor holográfico en su lugar, quiere permitir que el usuario se desplace sin problemas por las instrucciones con su mirada ocular y simplemente mirar una casilla y decir "comprobarlo!".
Para habilitar esto, debe usar un script EyeTrackingTarget específico del ojo que sea independiente del núcleo MRTK FocusHandlers y se analizará más adelante.
1. Usar controladores de foco y puntero genéricos
Si el seguimiento ocular está configurado correctamente (consulte Configuración básica de MRTK para usar el seguimiento ocular), lo que permite a los usuarios seleccionar hologramas con sus ojos es el mismo que para cualquier otra entrada de foco (por ejemplo, mirada con la cabeza o rayo de mano). Esto proporciona la gran ventaja de una manera flexible de interactuar con los hologramas definiendo el tipo de enfoque principal en el perfil de puntero de entrada de MRTK en función de las necesidades del usuario, al tiempo que deja el código intacto. Esto permite cambiar entre la mirada de la cabeza o el ojo sin cambiar una línea de código o reemplazar los rayos de mano con el objetivo de los ojos para interacciones lejanas.
Centrarse en un holograma
Para detectar cuándo se centra un holograma, usa la interfaz 'IMixedRealityFocusHandler' que te proporciona dos miembros de interfaz: OnFocusEnter y OnFocusExit.
Este es un ejemplo sencillo de ColorTap.cs para cambiar el color de un holograma cuando se examina.
public class ColorTap : MonoBehaviour, IMixedRealityFocusHandler
{
void IMixedRealityFocusHandler.OnFocusEnter(FocusEventData eventData)
{
material.color = color_OnHover;
}
void IMixedRealityFocusHandler.OnFocusExit(FocusEventData eventData)
{
material.color = color_IdleState;
}
...
}
Selección de un holograma centrado
Para seleccionar un holograma centrado, use PointerHandler para escuchar eventos de entrada para confirmar una selección. Por ejemplo, agregar IMixedRealityPointerHandler hará que reaccionen a una entrada de puntero simple. La interfaz IMixedRealityPointerHandler requiere implementar los tres miembros de interfaz siguientes: OnPointerUp, OnPointerDown y OnPointerClicked.
En el ejemplo siguiente, cambiamos el color de un holograma examinandolo y pellizcándolo o diciendo "select".
La acción necesaria para desencadenar el evento se define mediante eventData.MixedRealityInputAction == selectAction
la cual podemos establecer el tipo de en el Editor de selectAction
Unity; de forma predeterminada, es la acción "Seleccionar". Los tipos de mixedRealityInputActions disponibles se pueden configurar en el perfil de MRTK a través del perfil de configuración de MRTK ->Input ->Input Actions.
public class ColorTap : MonoBehaviour, IMixedRealityFocusHandler, IMixedRealityPointerHandler
{
// Allow for editing the type of select action in the Unity Editor.
[SerializeField]
private MixedRealityInputAction selectAction = MixedRealityInputAction.None;
...
void IMixedRealityPointerHandler.OnPointerUp(MixedRealityPointerEventData eventData)
{
if (eventData.MixedRealityInputAction == selectAction)
{
material.color = color_OnHover;
}
}
void IMixedRealityPointerHandler.OnPointerDown(MixedRealityPointerEventData eventData)
{
if (eventData.MixedRealityInputAction == selectAction)
{
material.color = color_OnSelect;
}
}
void IMixedRealityPointerHandler.OnPointerClicked(MixedRealityPointerEventData eventData) { }
}
BaseEyeFocusHandler específico de la mirada ocular
Dado que la mirada con los ojos puede ser muy diferente a otras entradas de puntero, es posible que desee asegurarse de reaccionar solo a la entrada de foco si es mirada con los ojos y actualmente es el puntero de entrada principal.
Para este propósito, usaría el BaseEyeFocusHandler
que es específico para el seguimiento ocular y que deriva de .BaseFocusHandler
Como se mencionó anteriormente, solo se desencadenará si el objetivo de la mirada ocular es actualmente la entrada de puntero principal (es decir, no hay rayos de mano activos). Para obtener más información, vea Cómo admitir la mirada con los ojos + gestos de mano.
Este es un ejemplo de EyeTrackingDemo-03-Navigation
(Assets/MRTK/Examples/Demos/EyeTracking/Scenes).
En esta demostración, hay dos hologramas 3D que se activarán en función de qué parte del objeto se examine: Si el usuario mira el lado izquierdo del holograma, esa parte se moverá lentamente hacia la parte frontal del usuario.
Si se mira el lado derecho, esa parte se moverá lentamente al frente.
Este es un comportamiento que es posible que no desee tener activo en todo momento y también algo que quizás no desee desencadenar accidentalmente mediante un rayo de mano o una mirada con la cabeza.
Después de adjuntar OnLookAtRotateByEyeGaze
, un GameObject se rotará mientras se examina.
public class OnLookAtRotateByEyeGaze : BaseEyeFocusHandler
{
...
protected override void OnEyeFocusStay()
{
// Update target rotation
RotateHitTarget();
}
...
///
/// This function computes the rotation of the target to move the currently
/// looked at aspect slowly to the front.
///
private void RotateHitTarget()
{
// Example for querying the hit position of the eye gaze ray using EyeGazeProvider
Vector3 TargetToHit = (this.gameObject.transform.position - InputSystem.EyeGazeProvider.HitPosition).normalized;
...
}
}
Consulte la documentación de la API para obtener una lista completa de los eventos disponibles de :BaseEyeFocusHandler
- OnEyeFocusStart: Se desencadena una vez que el rayo de mirada ocular comienza a intersectar con el colisionador de este objetivo.
- OnEyeFocusStay: Se desencadena mientras el rayo de mirada ocular se cruza con el colisionador de este objetivo.
- OnEyeFocusStop: Se desencadena una vez que el rayo de mirada ocular deja de intersecirse con el colisionador de este objetivo.
- OnEyeFocusDwell: Se desencadena una vez que el rayo de mirada ocular se ha intersecado con el colisionador de este objetivo durante un período de tiempo especificado.
2. EyeTrackingTarget independiente específico de la mirada ocular
Por último, le proporcionamos una solución que le permite tratar la entrada basada en los ojos completamente independiente de otros punteros de foco a través del EyeTrackingTarget
script.
Esto tiene tres ventajas:
- Puedes asegurarte de que el holograma solo reacciona a la mirada ocular del usuario.
- Esto es independiente de la entrada principal actualmente activa. Por lo tanto, puede procesar varias entradas a la vez, por ejemplo, combinando el objetivo rápido de los ojos con gestos de mano.
- Ya se han configurado varios eventos de Unity para que sea rápido y cómodo controlar y reutilizar los comportamientos existentes desde el Editor de Unity o a través del código.
También hay algunas desventajas:
- Más esfuerzo para controlar entradas independientes individualmente.
- Sin degradación elegante: solo admite la orientación ocular. Si el seguimiento ocular no funciona, necesita una reserva adicional.
De forma similar a BaseFocusHandler, EyeTrackingTarget viene listo con varios eventos de Unity específicos de la mirada ocular que puede escuchar convenientemente a través del Editor de Unity (vea el ejemplo siguiente) o mediante AddListener() en el código:
- OnLookAtStart()
- WhileLookingAtTarget()
- OnLookAway()
- OnDwell()
- OnSelected()
A continuación, le guiaremos por algunos ejemplos para usar EyeTrackingTarget.
Ejemplo 1: Notificaciones inteligentes compatibles con los ojos
En EyeTrackingDemo-02-TargetSelection
(Assets/MRTK/Examples/Demos/EyeTracking/Scenes), puede encontrar un ejemplo de "notificaciones atentas inteligentes" que reaccionan a su mirada ocular.
Se trata de cuadros de texto 3D que se pueden colocar en la escena y que se ampliarán y girarán hacia el usuario cuando se examinen para facilitar la legibilidad. Mientras el usuario lee la notificación, la información sigue apareciendo clara y clara. Después de leerla y alejarse de la notificación, la notificación se descartará automáticamente y se atenuará. Para lograr todo esto, hay algunos scripts de comportamiento genéricos que no son específicos del seguimiento ocular, como:
La ventaja de este enfoque es que varios eventos pueden reutilizar los mismos scripts. Por ejemplo, un holograma puede empezar a enfrentarse al usuario en función de los comandos de voz o después de presionar un botón virtual. Para desencadenar estos eventos, simplemente puedes hacer referencia a los métodos que se deben ejecutar en el EyeTrackingTarget
script que se adjunta a gameObject.
Para el ejemplo de las "notificaciones atentas inteligentes", ocurre lo siguiente:
OnLookAtStart():La notificación comienza a...
- FaceUser.Engage: ... gire hacia el usuario.
- ChangeSize.Engage: ... aumento del tamaño (hasta una escala máxima especificada).
- BlendOut.Engage: ... comienza a mezclarse más (después de estar en un estado inactivo más sutil).
OnDwell(): informa al script BlendOut de que la notificación se ha examinado lo suficiente.
OnLookAway(): La notificación comienza a...
- FaceUser.Disengage: ... vuelva a su orientación original.
- ChangeSize.Disengage: ... disminuye de nuevo a su tamaño original.
- BlendOut.Disengage: ... comienza a mezclarse: si onDwell() se desencadenó, combine completamente y destruya; de lo contrario, vuelva a su estado de inactividad.
Consideración de diseño: La clave de una experiencia agradable aquí es ajustar cuidadosamente la velocidad de cualquiera de estos comportamientos para evitar causar molestias al reaccionar a la mirada ocular del usuario demasiado rápido todo el tiempo. De lo contrario, esto puede sentirse extremadamente abrumador.
Ejemplo 2: la gema holográfica gira lentamente al examinarla
Al igual que en el ejemplo 1, podemos crear fácilmente un comentario sobre el mouse para nuestras gemas holográficas en EyeTrackingDemo-02-TargetSelection
(Assets/MRTK/Examples/Demos/EyeTracking/Scenes) escena que girará lentamente en una dirección constante y a una velocidad constante (a diferencia del ejemplo de rotación anterior) al examinarse. Todo lo que necesita es desencadenar la rotación de la gema holográfica desde el evento WhileLookingAtTarget() de EyeTrackingTarget(). A continuación se incluyen algunos detalles más:
Cree un script genérico que incluya una función pública para girar el objeto GameObject al que está asociado. A continuación se muestra un ejemplo de RotateWithConstSpeedDir.cs , donde podemos ajustar la dirección de rotación y la velocidad desde el Editor de Unity.
using UnityEngine; namespace Microsoft.MixedReality.Toolkit.Examples.Demos.EyeTracking { /// <summary> /// The associated GameObject will rotate when RotateTarget() is called based on a given direction and speed. /// </summary> public class RotateWithConstSpeedDir : MonoBehaviour { [Tooltip("Euler angles by which the object should be rotated by.")] [SerializeField] private Vector3 RotateByEulerAngles = Vector3.zero; [Tooltip("Rotation speed factor.")] [SerializeField] private float speed = 1f; /// <summary> /// Rotate game object based on specified rotation speed and Euler angles. /// </summary> public void RotateTarget() { transform.eulerAngles = transform.eulerAngles + RotateByEulerAngles * speed; } } }
Agregue el
EyeTrackingTarget
script al gameObject de destino y haga referencia a la función RotateTarget() en el desencadenador UnityEvent, como se muestra en la captura de pantalla siguiente:
Ejemplo 3: sacar esas gemas también conocidas como selección de destino compatible con la mirada ocular multi modal
En el ejemplo anterior, hemos mostrado lo fácil que es detectar si se examina un destino y cómo desencadenar una reacción a eso. A continuación, vamos a hacer que las gemas explotarán mediante el evento OnSelected() de EyeTrackingTarget
. La parte interesante es cómo se desencadena la selección. Permite EyeTrackingTarget
asignar rápidamente diferentes formas de invocar una selección:
Gesto de reducir: al establecer la opción "Seleccionar acción" en "Seleccionar", se usa el gesto de mano predeterminado para desencadenar la selección. Esto significa que el usuario simplemente puede levantar la mano y reducir el pulgar y el dedo índice juntos para confirmar la selección.
Diga "Seleccionar": use el comando de voz predeterminado "Seleccionar" para seleccionar un holograma.
Diga "Explotar" o "Pop": para usar comandos de voz personalizados, debe seguir dos pasos:
Configuración de una acción personalizada como "DestroyTarget"
- Vaya a MRTK -> Input -> Input Actions (Acciones de entrada)
- Haga clic en "Agregar una nueva acción"
Configurar los comandos de voz que desencadenan esta acción, como "Explotar" o "Pop"
- Vaya a MRTK - Input -> Speech (Entrada:> voz)
- Haga clic en "Agregar un nuevo comando de voz".
- Asocie la acción que acaba de crear
- Asignar un keyCode para permitir desencadenar la acción mediante una pulsación de botón
Cuando se selecciona una gema, explotará, haciendo un sonido y desapareciendo. Esto se controla mediante el HitBehaviorDestroyOnSelect
script. Tiene dos opciones:
- En el Editor de Unity: Simplemente puede vincular el script que se adjunta a cada una de nuestras plantillas de gema al evento OnSelected() Unity en el Editor de Unity.
-
En el código: Si no desea arrastrar y colocar GameObjects alrededor, también puede agregar un agente de escucha de eventos directamente al script.
Este es un ejemplo de cómo lo hicimos en elHitBehaviorDestroyOnSelect
script:
/// <summary>
/// Destroys the game object when selected and optionally plays a sound or animation when destroyed.
/// </summary>
[RequireComponent(typeof(EyeTrackingTarget))] // This helps to ensure that the EyeTrackingTarget is attached
public class HitBehaviorDestroyOnSelect : MonoBehaviour
{
...
private EyeTrackingTarget myEyeTrackingTarget = null;
private void Start()
{
myEyeTrackingTarget = this.GetComponent<EyeTrackingTarget>();
if (myEyeTrackingTarget != null)
{
myEyeTrackingTarget.OnSelected.AddListener(TargetSelected);
}
}
...
///
/// This is called once the EyeTrackingTarget detected a selection.
///
public void TargetSelected()
{
// Play some animation
// Play some audio effect
// Handle destroying the target appropriately
}
}
Ejemplo 4: Usar los rayos de mano y la entrada de mirada ocular juntos
Los rayos de mano tienen prioridad sobre la cabeza y el objetivo de la mirada con los ojos. Esto significa que, si los rayos de mano están habilitados, el momento en que las manos entran en la vista, el rayo de mano actuará como puntero principal. Sin embargo, puede haber situaciones en las que quieras usar los rayos de mano mientras sigues detectando si un usuario está mirando un holograma determinado. Fácil. Básicamente, necesita dos pasos:
1. Habilite el rayo de mano: Para habilitar el rayo de mano, vaya a Mixed Reality Kit de herramientas -> Entrada -> Punteros. En EyeTrackingDemo-00-RootScene donde Mixed Reality Toolkit está configurado una vez para todas las escenas de demostración de seguimiento ocular, debería ver eyeTrackingDemoPointerProfile. Puede crear un nuevo perfil de entrada desde cero o adaptar el seguimiento ocular actual uno:
- Desde cero: En la pestaña Punteros , seleccione DefaultMixedRealityInputPointerProfile en el menú contextual. Este es el perfil de puntero predeterminado que ya tiene habilitado el rayo de mano. Para cambiar el cursor predeterminado (un punto blanco opaco), simplemente clone el perfil y cree su propio perfil de puntero personalizado. A continuación, reemplace DefaultCursor por EyeGazeCursor en Cursor de mirada Prefabricado.
-
Basado en el eyeTrackingDemoPointerProfile existente: haga doble clic en EyeTrackingDemoPointerProfile y agregue la siguiente entrada en Opciones de puntero:
- Tipo de controlador: 'Mano articulada', 'Windows Mixed Reality'
- Imparcialidad: Cualquier
- Objeto prefabricado de puntero: DefaultControllerPointer
2. Detecte que se examina un holograma: use el EyeTrackingTarget
script para habilitar la detección de que un holograma se examina como se ha descrito anteriormente. También puede echar un vistazo al FollowEyeGaze
script de ejemplo para inspirarse, ya que se muestra un holograma después de la mirada con los ojos (por ejemplo, un cursor) si los rayos de mano están habilitados o no.
Ahora, al iniciar las escenas de demostración de seguimiento ocular, debería ver un rayo procedente de las manos. Por ejemplo, en la demostración de selección de destino de seguimiento ocular, el círculo semitransparente sigue la mirada con los ojos y las gemas responden a si se ven o no, mientras que los botones de menú de la escena superior usan el puntero de entrada principal (las manos) en su lugar.