Augengestützte Zielauswahl — MRTK2

MRTK

Auf dieser Seite werden verschiedene Optionen für den Zugriff auf Augenaugendaten und augenspezifische Ereignisse erläutert, um Ziele in MRTK auszuwählen. Eye Tracking ermöglicht eine schnelle und mühelose Zielauswahl mithilfe einer Kombination von Informationen über das, was ein Benutzer betrachtet, mit zusätzlichen Eingaben wie Handverfolgung und Sprachbefehlen:

  • Suchen & " Auswählen" sagen (Standard-Sprachbefehl)
  • Suchen Sie & Sagen Sie "Explode" oder "Pop" (benutzerdefinierte Sprachbefehle)
  • Suchen & Bluetooth-Taste
  • Schauen Sie & Pinch (d. h., Halten Sie Ihre Hand vor Ihnen und bringen Sie Daumen und Zeigefinger zusammen)

Um holografische Inhalte mithilfe des Blicks auszuwählen, gibt es mehrere Optionen:

1. Verwenden Sie den primären Fokuszeiger:

Dies kann als Ihr priorisierter Cursor verstanden werden. Wenn die Hände in sicht sind, handelt es sich standardmäßig um Handstrahlen. Wenn keine Hände in Sicht sind, ist der priorisierte Zeiger kopf- oder augenscheinend. Bitte beachten Sie daher, dass basierend auf dem aktuellen Design Kopf oder Blick als Cursoreingabe unterdrückt wird, wenn Handstrahlen verwendet werden.

Beispiel:

Ein Benutzer möchte eine entfernte holografische Schaltfläche auswählen. Als Entwickler möchten Sie eine flexible Lösung bereitstellen, die es dem Benutzer ermöglicht, diese Aufgaben unter verschiedenen Bedingungen zu erfüllen:

  • Gehen Sie zur Schaltfläche und stochern Sie sie
  • Sehen Sie es sich aus der Ferne an, und sagen Sie "Auswählen".
  • Ziel der Schaltfläche mithilfe eines Handstrahls und Ausführen einer Pinch In diesem Fall besteht die flexibelste Lösung darin, den primären Fokushandler zu verwenden, da er Sie benachrichtigt, wenn der derzeit priorisierte primäre Fokuszeiger ein Ereignis auslöst. Bitte beachten Sie, dass bei aktivierten Handstrahlen der Fokuszeiger des Kopfes oder der Augenaugen deaktiviert wird, sobald die Hände in Sicht kommen.

Wichtig

Bitte beachten Sie, dass bei aktivierten Handstrahlen der Fokuszeiger des Kopfes oder der Augenaugen deaktiviert wird, sobald die Hände in Sicht kommen. Wenn Sie eine "Look and Pinch"- Interaktion unterstützen möchten, müssen Sie den Handstrahl deaktivieren. In unseren Augenverfolgungs-Beispielszenen haben wir den Handstrahl deaktiviert, um eine reichhaltigere Interaktion mit Augen + Handbewegungen zu ermöglichen - siehe z. B . Eye-Supported Positioning.

2. Verwenden Sie augenfokus und Handstrahlen gleichzeitig:

Es gibt möglicherweise Instanzen, in denen Sie genauer festlegen möchten, welcher Typ von Fokuszeiger bestimmte Ereignisse auslösen kann und gleichzeitig die Verwendung mehrerer Ferninteraktionstechniken zulassen kann.

Beispiel: In Ihrer App kann ein Benutzer fernliegende Handstrahlen verwenden, um ein holografisches mechanisches Setup zu bearbeiten– z. B. einige entfernte holografische Engine-Teile zu greifen und zu halten und sie an Ort und Stelle zu halten. Dabei muss der Benutzer eine Reihe von Anweisungen durchlaufen und seinen Fortschritt aufzeichnen, indem er einige Kontrollkästchen deaktiviert. Wenn der Benutzer seine Hände nicht beschäftigt hat, wäre es instinktiv, einfach das Kontrollkästchen zu berühren oder es mit einem Handstrahl auszuwählen. Wenn der Benutzer jedoch seine Hände beschäftigt hat, wie in unserem Fall einige holografische Engine-Teile an Ort und Stelle hält, möchten Sie es dem Benutzer ermöglichen, nahtlos mit seinem Blick durch die Anweisungen zu scrollen und einfach ein Kontrollkästchen anzusehen und "check it!" zu sagen.

Um dies zu ermöglichen, müssen Sie das augenspezifische EyeTrackingTarget-Skript verwenden, das unabhängig von den KERN-MRTK-FocusHandlern ist und weiter unten erläutert wird.

1. Verwenden von generischen Fokus- und Zeigerhandlern

Wenn eye tracking richtig eingerichtet ist (siehe Grundlegende MRTK-Einrichtung zur Verwendung von Eye Tracking), ist die Möglichkeit, Hologramme mit ihren Augen auszuwählen, identisch mit jeder anderen Fokuseingabe (z. B. Kopf- oder Handstrahl). Dies bietet den großen Vorteil einer flexiblen Möglichkeit, mit Ihren Hologrammen zu interagieren, indem sie den Standard Fokustyp in Ihrem MRTK-Eingabezeigerprofil abhängig von den Anforderungen Ihres Benutzers definiert, während Ihr Code unverändert bleibt. Dies ermöglicht es, zwischen Kopf- oder Augenaugen zu wechseln, ohne eine Codezeile zu ändern, oder Handstrahlen durch Augenziel für weit entfernte Interaktionen zu ersetzen.

Fokus auf ein Hologramm

Um zu erkennen, wann ein Hologramm fokussiert ist, verwenden Sie die Schnittstelle "IMixedRealityFocusHandler" , die Ihnen zwei Schnittstellenmember zur Verfügung stellt: OnFocusEnter und OnFocusExit.

Hier ist ein einfaches Beispiel von ColorTap.cs , um die Farbe eines Hologramms zu ändern, wenn sie betrachtet wird.

public class ColorTap : MonoBehaviour, IMixedRealityFocusHandler
{
    void IMixedRealityFocusHandler.OnFocusEnter(FocusEventData eventData)
    {
        material.color = color_OnHover;
    }

    void IMixedRealityFocusHandler.OnFocusExit(FocusEventData eventData)
    {
        material.color = color_IdleState;
    }
    ...
}

Auswählen eines fokussierten Hologramms

Um ein fokussiertes Hologramm auszuwählen, verwenden Sie PointerHandler , um auf Eingabeereignisse zu lauschen, um eine Auswahl zu bestätigen. Wenn Sie beispielsweise den IMixedRealityPointerHandler hinzufügen, reagieren sie auf einfache Zeigereingaben. Die IMixedRealityPointerHandler-Schnittstelle erfordert die Implementierung der folgenden drei Schnittstellenmember: OnPointerUp, OnPointerDown und OnPointerClicked.

Im folgenden Beispiel ändern wir die Farbe eines Hologramms, indem wir es betrachten und "auswählen" anheften oder sagen. Die erforderliche Aktion zum Auslösen des Ereignisses wird dadurch eventData.MixedRealityInputAction == selectAction definiert, dass wir den Typ von selectAction im Unity-Editor festlegen können. Standardmäßig handelt es sich um die Aktion "Auswählen". Die verfügbaren MixedRealityInputActions-Typen können im MRTK-Profil über das MRTK-Konfigurationsprofil ->Input ->Input Actions konfiguriert werden.

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) { }
}

Blick-spezifischer BaseEyeFocusHandler

Da sich der Blick sehr von anderen Zeigereingaben unterscheiden kann, sollten Sie sicherstellen, dass Sie nur auf die Fokuseingabe reagieren, wenn es sich um den Blick handelt und es sich derzeit um den primären Eingabezeiger handelt. Zu diesem Zweck würden Sie das verwenden, das BaseEyeFocusHandler spezifisch für eye tracking ist und von BaseFocusHandlerabgeleitet wird. Wie bereits erwähnt, wird es nur ausgelöst, wenn das Ziel des Blicks derzeit die primäre Zeigereingabe ist (d. h. kein Handstrahl aktiv ist). Weitere Informationen finden Sie unter Unterstützen von Blick und Handgesten.

Hier sehen Sie ein Beispiel aus EyeTrackingDemo-03-Navigation (Assets/MRTK/Examples/Demos/EyeTracking/Scenes). In dieser Demo gibt es zwei 3D-Hologramme, die sich drehen, je nachdem, welcher Teil des Objekts betrachtet wird: Wenn der Benutzer die linke Seite des Hologramms betrachtet, bewegt sich dieser Teil langsam nach vorne, der dem Benutzer zugewandt ist. Wenn die rechte Seite betrachtet wird, bewegt sich dieser Teil langsam nach vorne. Dies ist ein Verhalten, das Sie möglicherweise nicht immer aktiv haben möchten, und auch etwas, das Sie möglicherweise nicht versehentlich durch einen Handstrahl oder Kopfblick auslösen möchten. Wenn das OnLookAtRotateByEyeGaze angefügt ist, wird ein GameObject rotiert, während er betrachtet wird.

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;

        ...
    }
}

Eine vollständige Liste der verfügbaren Ereignisse finden Sie in BaseEyeFocusHandlerder API-Dokumentation:

  • OnEyeFocusStart: Wird ausgelöst, sobald der Blickstrahl beginnt , sich mit dem Collider dieses Ziels zu kreuzen.
  • OnEyeFocusStay: Wird ausgelöst , während sich der Blickstrahl mit dem Collider dieses Ziels überschneiden.
  • OnEyeFocusStop: Wird ausgelöst, sobald der Blickstrahl aufhört , sich mit dem Collider dieses Ziels zu kreuzen.
  • OnEyeFocusDwell: Wird ausgelöst, sobald sich der Blickstrahl für eine bestimmte Zeit mit dem Collider dieses Ziels überschneiden hat.

2. Unabhängiges Auge-spezifisches EyeTrackingTarget

Schließlich bieten wir Ihnen eine Lösung, mit der Sie augenbasierte Eingaben völlig unabhängig von anderen Fokuszeigern über das EyeTrackingTarget Skript behandeln können.

Dies hat drei Vorteile:

  • Sie können sicherstellen, dass das Hologramm nur auf den Blick des Benutzers reagiert.
  • Dies ist unabhängig von der derzeit aktiven primären Eingabe. Daher können Sie mehrere Eingaben gleichzeitig verarbeiten – z. B. durch die Kombination von schnellem Augenziel mit Handgesten.
  • Mehrere Unity-Ereignisse wurden bereits eingerichtet, damit vorhandene Verhaltensweisen im Unity-Editor oder über Code schnell und bequem verarbeitet und wiederverwendet werden können.

Es gibt auch einige Nachteile:

  • Mehr Aufwand, um separate Eingaben einzeln zu verarbeiten.
  • Keine elegante Degradierung: Es unterstützt nur das Ziel der Augen. Wenn eye tracking nicht funktioniert, benötigen Sie einen zusätzlichen Fallback.

Ähnlich wie der BaseFocusHandler verfügt das EyeTrackingTarget über mehrere blickspezifische Unity-Ereignisse, die Sie bequem über den Unity-Editor (siehe Beispiel unten) oder mithilfe von AddListener() im Code anhören können:

  • OnLookAtStart()
  • WhileLookingAtTarget()
  • OnLookAway()
  • OnDwell()
  • OnSelected()

Im Folgenden führen wir Sie durch einige Beispiele für die Verwendung von EyeTrackingTarget.

Beispiel Nr. 1: Von Augen unterstützte intelligente Benachrichtigungen

In EyeTrackingDemo-02-TargetSelection (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) finden Sie ein Beispiel für "intelligente aufmerksame Benachrichtigungen" , die auf Ihren Blick reagieren. Dies sind 3D-Textfelder, die in der Szene platziert werden können und die sich beim Betrachten auf den Benutzer hin leicht vergrößern und sich an den Benutzer wenden, um die Lesbarkeit zu erleichtern. Während der Benutzer die Benachrichtigung liest, werden die Informationen immer wieder scharf und klar angezeigt. Nachdem Sie sie gelesen und von der Benachrichtigung wegschauen, wird die Benachrichtigung automatisch geschlossen und verblasst. Um all dies zu erreichen, gibt es einige generische Verhaltensskripts, die überhaupt nicht spezifisch für eye tracking sind, wie z. B.:

Der Vorteil dieses Ansatzes besteht darin, dass dieselben Skripts von verschiedenen Ereignissen wiederverwendet werden können. Beispielsweise kann ein Hologramm den Benutzern basierend auf sprachgesteuerten Befehlen oder nach dem Drücken einer virtuellen Schaltfläche entgegensehen. Um diese Ereignisse auszulösen, können Sie einfach auf die Methoden verweisen, die in dem EyeTrackingTarget Skript ausgeführt werden sollen, das an Ihr GameObject angefügt ist.

Für das Beispiel der "smarten aufmerksamen Benachrichtigungen" geschieht Folgendes:

  • OnLookAtStart(): Die Benachrichtigung beginnt...

    • FaceUser.Engage: ... wenden Sie sich an den Benutzer.
    • ChangeSize.Engage: ... Erhöhung der Größe (bis zu einer angegebenen maximalen Skalierung).
    • BlendOut.Engage: ... beginnt sich ( nach einem subtileren Leerlaufzustand) mehr einzufügen.
  • OnDwell(): Informiert das BlendOut-Skript , dass die Benachrichtigung ausreichend untersucht wurde.

  • OnLookAway(): Die Benachrichtigung beginnt...

    • FaceUser.Disengage: ... kehren Sie zurück zu ihrer ursprünglichen Ausrichtung.
    • ChangeSize.Disengage: ... zurück auf die ursprüngliche Größe reduzieren.
    • BlendOut.Disengage: ... beginnt, sich auszublenden: Wenn OnDwell() ausgelöst wurde, blenden Sie vollständig aus und zerstören Sie sie, andernfalls wieder in den Leerlaufzustand zurück.

Entwurfsüberlegung: Der Schlüssel zu einer angenehmen Erfahrung ist hier, die Geschwindigkeit dieser Verhaltensweisen sorgfältig zu optimieren, um Zumutungen zu vermeiden, indem sie zu schnell auf den Blick des Benutzers reagieren. Andernfalls kann sich das schnell extrem überwältigend anfühlen.

Zielbenachrichtigung

Beispiel Nr. 2: Holografisches Edelstein dreht sich beim Betrachten langsam

Ähnlich wie in Beispiel Nr. 1 können wir ganz einfach ein Hoverfeedback für unsere holografischen EyeTrackingDemo-02-TargetSelection Edelsteine (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) erstellen, das sich beim Betrachten langsam in konstanter Richtung und mit konstanter Geschwindigkeit (im Gegensatz zum Oben gezeigten Drehungsbeispiel) dreht. Sie müssen lediglich die Drehung des holografischen Edelsteins aus dem WhileLookingAtTarget()-Ereignis des EyeTrackingTarget-Ereignisses auslösen. Im Anschluss finden Sie einige weitere Details:

  1. Erstellen Sie ein generisches Skript, das eine öffentliche Funktion enthält, um das GameObject zu rotieren, an das es angefügt ist. Im Folgenden finden Sie ein Beispiel aus RotateWithConstSpeedDir.cs , in dem wir die Drehrichtung und Geschwindigkeit im Unity-Editor optimieren können.

    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;
            }
        }
    }
    
  2. Fügen Sie das EyeTrackingTarget Skript ihrem GameObject-Ziel hinzu, und verweisen Sie auf die RotateTarget() -Funktion im UnityEvent-Trigger, wie im folgenden Screenshot gezeigt:

    EyeTrackingTarget-Beispiel

Beispiel Nr. 3: Diese Edelsteine (auch als multimodal eye-gaze-supported target selection bezeichnet) auffüllen

Im vorherigen Beispiel haben wir gezeigt, wie einfach es ist, zu erkennen, ob ein Ziel betrachtet wird und wie eine Reaktion darauf ausgelöst wird. Als Nächstes lassen Sie die Edelsteine mithilfe des OnSelected() -Ereignisses aus dem EyeTrackingTargetexplodieren. Interessant ist , wie die Auswahl ausgelöst wird. Ermöglicht EyeTrackingTarget das schnelle Zuweisen verschiedener Methoden zum Aufrufen einer Auswahl:

  • Zusammendrücken: Wenn Sie "Aktion auswählen" auf "Auswählen" festlegen, wird die Standardhandgeste verwendet, um die Auswahl auszulösen. Dies bedeutet, dass der Benutzer einfach seine Hand heben und seinen Daumen und Zeigefinger zusammendrücken kann, um die Auswahl zu bestätigen.

  • Sagen Sie "Auswählen": Verwenden Sie den Standard-Sprachbefehl "Select" zum Auswählen eines Hologramms.

  • Sagen Sie "Explode" oder "Pop": Um benutzerdefinierte Sprachbefehle zu verwenden, müssen Sie zwei Schritte ausführen:

    1. Einrichten einer benutzerdefinierten Aktion wie "DestroyTarget"

      • Navigieren Sie zu MRTK –> Eingabe –> Eingabeaktionen.
      • Klicken Sie auf "Neue Aktion hinzufügen".
    2. Richten Sie die Sprachbefehle ein, die diese Aktion auslösen, z. B . "Explode" oder "Pop".

      • Navigieren Sie zu MRTK –> Eingabe –> Sprache
      • Klicken Sie auf "Neuen Sprachbefehl hinzufügen".
        • Zuordnen der soeben erstellten Aktion
        • Weisen Sie einen KeyCode zu, um das Auslösen der Aktion über einen Tastendruck zu ermöglichen.

EyeTrackingTarget-Beispiel für Sprachbefehle

Wenn ein Edelstein ausgewählt wird, explodiert es, macht einen Sound und verschwindet. Dies wird vom HitBehaviorDestroyOnSelect Skript behandelt. Sie haben zwei Möglichkeiten:

  • Im Unity-Editor: Sie können einfach das Skript, das an jede unserer Gem-Vorlagen angefügt ist, mit dem OnSelected()-Unity-Ereignis im Unity-Editor verknüpfen.
  • Im Code: Wenn Sie GameObjects nicht ziehen und ablegen möchten, können Sie ihrem Skript auch einfach einen Ereignislistener direkt hinzufügen.
    Hier sehen Sie ein Beispiel für die Vorgehensweise im HitBehaviorDestroyOnSelect Skript:
/// <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
    }
}

Beispiel 4: Verwenden von Handstrahlen und Blickeingaben

Handstrahlen haben Vorrang vor Kopf- und Blickzielen. Das bedeutet, wenn Handstrahlen aktiviert sind, fungiert der Handstrahl in dem Moment, in dem die Hände in Sicht kommen, als primärer Zeiger. Es kann jedoch Situationen geben, in denen Sie Handstrahlen verwenden möchten, während Sie dennoch erkennen, ob ein Benutzer ein bestimmtes Hologramm betrachtet. Kein Problem! Im Wesentlichen sind zwei Schritte erforderlich:

1. Aktivieren des Handstrahls: Um den Handstrahl zu aktivieren, wechseln Sie zu Mixed Reality Toolkit –> Eingabe –> Zeiger. In EyeTrackingDemo-00-RootScene, wo Mixed Reality Toolkit einmal für alle Eyetracking-Demoszenen konfiguriert ist, sollte das EyeTrackingDemoPointerProfile angezeigt werden. Sie können entweder ein neues Eingabeprofil von Grund auf erstellen oder das aktuelle Eyetracking anpassen:

  • Von Grund auf: Wählen Sie auf der Registerkarte Zeiger im Kontextmenü defaultMixedRealityInputPointerProfile aus. Dies ist das Standardzeigerprofil, für das der Handstrahl bereits aktiviert ist. Um den Standardcursor (einen undurchsichtigen weißen Punkt) zu ändern, klonen Sie einfach das Profil, und erstellen Sie Ihr eigenes benutzerdefiniertes Zeigerprofil. Ersetzen Sie dann DefaultCursor durch EyeGazeCursor unter Blickcursor-Prefab.
  • Basierend auf dem vorhandenen EyeTrackingDemoPointerProfile: Doppelklicken Sie auf eyeTrackingDemoPointerProfile , und fügen Sie unter Zeigeroptionen den folgenden Eintrag hinzu:
    • Controllertyp: 'Artikulierte Hand', 'Windows Mixed Reality'
    • Händigkeit: Jegliche
    • Zeiger-Prefab: DefaultControllerPointer

2. Erkennen, dass ein Hologramm betrachtet wird: Verwenden Sie das EyeTrackingTarget Skript, um zu erkennen, dass ein Hologramm wie oben beschrieben betrachtet wird. Sie können sich auch das FollowEyeGaze Beispielskript zur Inspiration ansehen, da dieses ein Hologramm zeigt, das Ihrem Blick folgt (z. B. einen Cursor), unabhängig davon, ob Handstrahlen aktiviert sind oder nicht.

Wenn Sie nun mit den Eyetracking-Demoszenen beginnen, sollte ein Strahl von Ihren Händen kommen. Beispielsweise folgt in der Demo zur Zielauswahl des Auges der halbtransparente Kreis weiterhin Ihrem Blick und die Edelsteine reagieren darauf, ob sie betrachtet werden oder nicht, während die Menüschaltflächen der oberen Szene stattdessen den primären Eingabezeiger (Ihre Hände) verwenden.


Zurück zu "Eyetracking im MixedRealityToolkit"