Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En esta página se describen las distintas opciones para acceder a los datos de mirada ocular y a 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á mirando con entradas adicionales, como el seguimiento de manos y los comandos de voz:
- Buscar & decir "Seleccionar" (comando de voz predeterminado)
- Mira & decir "Explosionar" o "Pop" (comandos de voz personalizados)
- Look & botón Bluetooth
- Mira & Pinch (es decir, levanta la mano delante de ti y reúne el pulgar y el dedo índice)
- Tenga en cuenta que para que esto funcione, los rayos de mano deben estar deshabilitados.
Para seleccionar contenido holográfico con mirada de ojos, hay varias opciones:
1. Use el puntero de foco principal:
Esto se puede entender como el cursor priorizado. De forma predeterminada, si las manos están a la vista, serían rayos de mano. Si no hay ninguna mano a la vista, el puntero priorizado sería la mirada de la cabeza o los ojos. Por lo tanto, tenga en cuenta que en función de la cabeza de diseño actual o la mirada de los ojos se suprime como una entrada de cursor si se usan rayos de mano.
Por ejemplo:
Un usuario quiere seleccionar un botón holográfico distante. Como desarrollador, quiere proporcionar una solución flexible que permita al usuario realizar estas tareas en varias condiciones:
- Subir al botón y empujarlo
- Míralo desde una distancia y di "seleccionar"
- Dirigirse al botón mediante un rayo de mano y realizar un pellizco 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 activa un evento. Tenga en cuenta que si se habilitan los rayos de mano, el puntero de enfoque de mirada de la cabeza o los ojos se deshabilita en cuanto las manos entran en vista.
Importante
Tenga en cuenta que si se habilitan los rayos de mano, el puntero de enfoque de mirada de la cabeza o los ojos se deshabilita en cuanto las manos entran en vista. Si quieres admitir una interacción "look and pinch", debes deshabilitar el rayo de mano. En nuestras escenas de muestra de seguimiento ocular, hemos deshabilitado el rayo de mano para permitir mostrar interacciones más enriquecidas con los ojos y movimientos de la mano, vea por ejemplo Posicionamiento compatible con los ojos.
2. Use tanto el foco ocular como los rayos de la 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 simultáneamente el uso de varias técnicas de interacción lejana.
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 distantes del motor holográfico y mantenerlas en su lugar. Mientras lo hace, el usuario tiene que seguir una serie de instrucciones y registrar su progreso marcando algunas casillas. Si el usuario no tiene las manos ocupadas, sería instintivo simplemente tocar la casilla o seleccionarla mediante un rayo de mano. Sin embargo, si el usuario tiene las manos ocupadas, como en nuestro caso, manteniendo algunas partes del motor holográficos en su lugar, desea permitir que el usuario se desplace sin problemas a través de las instrucciones con la mirada de los ojos y simplemente mirar una casilla de verificación y decir "¡compruébalo!".
Para habilitar esto, debe usar un script EyeTrackingTarget específico del ojo que sea independiente del núcleo de MRTK FocusHandlers y se describirá más adelante.
1. Usar controladores de puntero y foco genéricos
Si el seguimiento ocular está configurado correctamente (consulte Configuración básica de MRTK para usar el seguimiento ocular), permitir que los usuarios seleccionen hologramas con sus ojos es el mismo que para cualquier otra entrada de foco (por ejemplo, mirada de la cabeza o rayos de mano). Esto proporciona la gran ventaja de una manera flexible de interactuar con los hologramas mediante la definición del tipo de foco 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 los ojos sin cambiar una línea de código o reemplazar los rayos de las manos por la orientación ocular para interacciones lejanas.
Centrarse en un holograma
Para detectar cuándo se centra un holograma, use la interfaz "IMixedRealityFocusHandler" que le proporciona dos miembros de la interfaz: OnFocusEnter y OnFocusExit.
Este es un ejemplo sencillo de ColorTap.cs para cambiar el color de un holograma al examinarlo.
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 los eventos de entrada y confirmar una selección. Por ejemplo, agregar IMixedRealityPointerHandler hará que reaccionen a la 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 mirándolo y pellizcándolo o diciendo "seleccionar".
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 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 de los ojos puede ser muy diferente a otras entradas de puntero, es posible que desee asegurarse de que solo reaccione a la entrada de foco si es mirada ocular y actualmente es el puntero de entrada principal.
Para este propósito, usaría el BaseEyeFocusHandler que es específico del seguimiento ocular y que deriva de BaseFocusHandler.
Como se mencionó anteriormente, solo se desencadenará si el objetivo de mirada ocular es actualmente la entrada de puntero principal (es decir, no hay ningún rayo de mano activo). Para obtener más información, consulte Cómo admitir la mirada de los ojos y los gestos de la 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 el frente frente al usuario.
Si se mira el lado derecho, esa parte se moverá lentamente hacia el frente.
Este es un comportamiento que es posible que no quieras tener activo en todo momento y también algo que quizás no quieras desencadenar accidentalmente con un rayo de mano o la mirada de la cabeza.
Al tener el OnLookAtRotateByEyeGaze objeto adjunto, un Objeto GameObject girará 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 intersecrse 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 intersecrse 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 específico de la mirada ocular independiente
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:
- Puede asegurarse de que el holograma solo reacciona a la mirada de los ojos del usuario.
- Esto es independiente de la entrada principal actualmente activa. Por lo tanto, puede procesar varias entradas a la vez, por ejemplo, combinando la selección rápida de ojos con gestos de la 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 de código.
También hay algunas desventajas:
- Más esfuerzo para controlar entradas independientes individualmente.
- Sin degradación elegante: solo admite la segmentación ocular. Si el seguimiento ocular no funciona, necesita alguna reserva adicional.
De forma similar a BaseFocusHandler, EyeTrackingTarget está listo con varios eventos de Unity específicos de la mirada que puede escuchar cómodamente 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 a través de algunos ejemplos sobre cómo 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 inteligentes y atentas" que reaccionen a la mirada de los ojos.
Se trata de cuadros de texto 3D que se pueden colocar en la escena y que se ampliarán sin problemas y se dirigirán hacia el usuario cuando se examine para facilitar la legibilidad. Mientras el usuario lee la notificación, la información sigue mostrándose clara y clara. Después de leerla y mirar fuera de la notificación, la notificación se descartará automáticamente y se desvanecerá. 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 un comando de voz o después de presionar un botón virtual. Para desencadenar estos eventos, simplemente puede hacer referencia a los métodos que se deben ejecutar en el EyeTrackingTarget script que está asociado a GameObject.
Para el ejemplo de las "notificaciones atentos inteligentes", ocurre lo siguiente:
OnLookAtStart(): La notificación comienza a...
- FaceUser. Engage: ... girar hacia el usuario.
- ChangeSize. Engage: ... aumento del tamaño (hasta una escala máxima especificada).
- BlendOut. Engage: ... comienza a mezclarse en más (después de estar en un estado de inactividad 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: ... volver a su orientación original.
- ChangeSize.Disengage: ... reducir de nuevo a su tamaño original.
- BlendOut.Disengage: ... comienza a mezclarse: si se desencadenó OnDwell(), se mezcla por completo y se destruye, de lo contrario, vuelve a su estado inactivo.
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 reaccionando a la mirada del usuario demasiado rápido todo el tiempo. De lo contrario, esto puede sentirse muy abrumador rápidamente.
Ejemplo 2: La gema holográfica gira lentamente al examinarla
De forma similar al ejemplo 1, podemos crear fácilmente un comentario sobre el mouse para nuestras gemas holográficas en EyeTrackingDemo-02-TargetSelection la escena (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) que girará lentamente en una dirección constante y a una velocidad constante (a diferencia del ejemplo de rotación anterior) cuando se examine. Todo lo que necesita es desencadenar la rotación de la gema holográfica desde el evento WhileLookingAtTarget() de EyeTrackingTarget. Estos son algunos detalles más:
Cree un script genérico que incluya una función pública para girar el objeto GameObject al que está conectado. 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
EyeTrackingTargetscript al objeto 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: Extraer esas gemas también conocidas como selección de destino compatible con la mirada de ojos multimodal
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 exploten mediante el evento OnSelected() de EyeTrackingTarget. La parte interesante es cómo se desencadena la selección.
EyeTrackingTarget permite asignar rápidamente diferentes formas de invocar una selección:
Gesto de pellizcar: al establecer "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 pellizcar el pulgar y el dedo índice para confirmar la selección.
Diga "Seleccionar": use el comando de voz predeterminado "Seleccionar" para seleccionar un holograma.
Diga "Explosionar" o "Pop": para usar comandos de voz personalizados, debe seguir dos pasos:
Configurar una acción personalizada como "DestroyTarget"
- Vaya a MRTK :> entrada :> acciones de entrada
- Haga clic en "Agregar una nueva acción"
Configure los comandos de voz que desencadenan esta acción, como "Explosionar" o "Pop".
- Vaya a MRTK:> entrada:> voz
- Haga clic en "Agregar un nuevo comando de voz"
- Asociar la acción que acaba de crear
- Asignar un KeyCode para permitir el desencadenamiento de la acción a través de un botón
Cuando se selecciona una gema, esta explotará, haciendo un sonido y desaparecerá. Esto se controla mediante el HitBehaviorDestroyOnSelect script. Tiene dos opciones:
- En el Editor de Unity: Simplemente puede vincular el script que está asociado 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, también puede agregar un agente de escucha de eventos directamente al script.
Este es un ejemplo de cómo lo hicimos en elHitBehaviorDestroyOnSelectscript:
/// <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: Uso de los rayos de mano y la entrada de mirada de los ojos juntos
Los rayos de mano tienen prioridad sobre la mirada de la cabeza y los ojos. Esto significa que, si los rayos de las manos están habilitados, en el momento en que las manos entran en vista, el rayo de mano actuará como el puntero principal. Sin embargo, puede haber situaciones en las que quieras usar rayos de mano mientras sigues detectando si un usuario está mirando un holograma determinado. ¡Fácil! Básicamente, necesita dos pasos:
1. Habilitar el rayo de mano: Para habilitar el rayo de mano, vaya a Mixed Reality Toolkit -> Entrada -> Punteros. En EyeTrackingDemo-00-RootScene, donde Mixed Reality Toolkit se configura 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:
- 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 Prefab de cursor de mirada.
-
En función del 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
- Prefabricado de puntero: DefaultControllerPointer
2. Detectar que se examina un holograma: use el EyeTrackingTarget script para permitir detectar que se examina un holograma como se describió anteriormente. También puede echar un vistazo al FollowEyeGaze script de ejemplo para obtener inspiración, ya que muestra un holograma después de la mirada de los ojos (por ejemplo, un cursor) si los rayos de las manos están habilitados o no.
Ahora, al iniciar las escenas de demostración de seguimiento ocular, debería ver un rayo procedente de sus manos. Por ejemplo, en la demostración de selección de destino de seguimiento de ojos, el círculo semitransparente sigue la mirada de los ojos y las gemas responden a si se ven o no, mientras que los botones del menú de la escena superior usan el puntero de entrada principal (las manos) en su lugar.