Eye-supported target selection — MRTK2

MRTK

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

  • Look & Say "Select" (Standard-Sprachbefehl)
  • Look & Say "Explode" oder "Pop" (benutzerdefinierte Sprachbefehle)
  • Schaltfläche "Bluetooth suchen & "
  • Anheften (d.h., halten Sie & Ihre Hand vor Ihnen gedrückt, und bringen Sie Ihren Daumen und den Indexfinger zusammen)

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

1. Verwenden Sie den primären Fokuszeiger:

Dies kann als priorisierter Cursor verstanden werden. Wenn die Hände standardmäßig angezeigt werden, dann wäre dies Handstrahlen. Wenn keine Hände im Blick sind, wäre der priorisierte Zeiger Kopf- oder Augensicht. Beachten Sie daher, dass basierend auf dem aktuellen Designkopf oder Augenblick 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, mit der der Benutzer diese Aufgaben unter verschiedenen Bedingungen erreichen kann:

  • Gehen Sie zu der Schaltfläche, und töbern Sie es
  • Sehen Sie es von einer Entfernung aus, 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 sie Sie benachrichtigt, wenn der aktuell priorisierte Primärfokuszeiger ein Ereignis auslöst. Bitte beachten Sie, dass, wenn Handstrahlen aktiviert sind, der Kopf- oder Blickfokuszeiger deaktiviert werden, sobald die Hände in Sicht kommen.

Wichtig

Bitte beachten Sie, dass, wenn Handstrahlen aktiviert sind, der Kopf- oder Blickfokuszeiger deaktiviert werden, sobald die Hände in Sicht kommen. Wenn Sie eine Interaktion mit "Aussehen und Zusammendrücken" unterstützen möchten, müssen Sie den Handstrahl deaktivieren. In unseren Eye Tracking-Beispielszenen haben wir den Handstrahl deaktiviert, um umfassendere Interaktionen mithilfe von Augen + Handbewegungen anzuzeigen - siehe z. B. Eye-Supported Positionierung.

2. Verwenden Sie sowohl den Augenfokus als auch die Handstrahlen gleichzeitig:

Möglicherweise gibt es Instanzen, in denen Sie spezifischer sein möchten, welche Art von Fokuszeiger bestimmte Ereignisse auslösen und gleichzeitig mehrere Weitinteraktionstechniken verwenden können.

Beispiel: In Ihrer App kann ein Benutzer weit Handstrahlen verwenden, um einige holografische mechanische Einrichtung zu bearbeiten– z. B. einige entfernte holografische Modulteile zu greifen und zu halten und an Ort und Stelle zu halten. Dabei muss der Benutzer eine Reihe von Anweisungen durchlaufen und ihren Fortschritt aufzeichnen, indem einige Kontrollkästchen markiert werden. Wenn der Benutzer seine Hände nicht beschäftigt hat, wäre es instinktiv, einfach das Kontrollkästchen zu berühren oder es mithilfe eines Handstrahls auszuwählen. Wenn der Benutzer jedoch ihre/seine Hände beschäftigt hat, wie in unserem Fall einige holografische Modulteile vorhanden sind, möchten Sie es dem Benutzer ermöglichen, nahtlos durch die Anweisungen mit ihrem Blick zu scrollen und einfach ein Kontrollkästchen anzuzeigen und "überprüfen!" zu sagen.

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

1. Verwenden von generischen Fokus- und Zeigerhandlern

Wenn eye tracking richtig eingerichtet ist (siehe Grundlegende MRTK-Einrichtung für die Verwendung von Eye Tracking), können Benutzer Hologramme mit ihren Augen auswählen, ist identisch mit jeder anderen Fokuseingabe (z. B. Kopfblick oder Handstrahl). Dies bietet den großen Vorteil einer flexiblen Möglichkeit, mit Ihren Hologrammen zu interagieren, indem sie den Hauptfokustyp in Ihrem MRTK-Eingabezeigerprofil abhängig von den Anforderungen Ihres Benutzers definieren, während Ihr Code unberührt bleibt. Dies ermöglicht es, zwischen Kopf- oder Augenblick zu wechseln, ohne eine Codezeile zu ändern oder Handstrahlen durch Augenziel für weit interaktionen zu ersetzen.

Konzentrieren auf ein Hologramm

Um zu erkennen, wann ein Hologramm fokussiert ist, verwenden Sie die Schnittstelle "IMixedRealityFocusHandler" , die Ihnen zwei Schnittstellenelemente bereitstellt: OnFocusEnter und OnFocusExit.

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

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 Eingabeereignisse zu hören, um eine Auswahl zu bestätigen. Das Hinzufügen des IMixedRealityPointerHandlers führt beispielsweise dazu, dass sie auf einfache Zeigereingaben reagieren. Die IMixedRealityPointerHandler-Schnittstelle erfordert die Implementierung der folgenden drei Schnittstellenelemente: OnPointerUp, OnPointerDown und OnPointerClicked.

Im folgenden Beispiel ändern wir die Farbe eines Hologramms, indem wir sie betrachten und anheften oder "auswählen" sagen. Die erforderliche Aktion zum Auslösen des Ereignisses wird definiert, indem eventData.MixedRealityInputAction == selectAction wir den Typ des selectAction Unity-Editors festlegen können – standardmäßig ist es die Aktion "Auswählen". Die Typen der verfügbaren MixedRealityInputActions können im MRTK-Profil über MRTK-Konfigurationsprofil ->Eingabeaktionen> 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) { }
}

Eye-gaze-specific BaseEyeFocusHandler

Da der Augenblick sehr unterschiedlich zu anderen Zeigereingaben sein kann, sollten Sie sicherstellen, dass Sie nur auf die Fokuseingabe reagieren, wenn es augenblickt und derzeit der primäre Eingabezeiger ist. Für diesen Zweck würden Sie die BaseEyeFocusHandler spezifisch für Eye Tracking und die abgeleitet von der BaseFocusHandler. Wie bereits erwähnt, löst er nur aus, wenn das Blickzielziel zurzeit die primäre Zeigereingabe ist (d. h. kein Handstrahl ist aktiv). Weitere Informationen finden Sie unter "Unterstützen von Augenblick+ Handgesten".

Hier ist ein Beispiel aus EyeTrackingDemo-03-Navigation (Assets/MRTK/Examples/Demos/EyeTracking/Scenes). In dieser Demo gibt es zwei 3D-Hologramme, die je nachdem, welcher Teil des Objekts betrachtet wird: Wenn der Benutzer die linke Seite des Hologramms betrachtet, wird dieser Teil langsam in richtung der Vorderseite des Benutzers verschoben. Wenn die rechte Seite betrachtet wird, wird dieser Teil langsam nach vorne verschoben. Dies ist ein Verhalten, das Sie möglicherweise nicht jederzeit aktiv haben möchten und auch etwas, das Sie möglicherweise nicht versehentlich durch einen Handstrahl oder einen Kopfblick auslösen möchten. Nachdem das OnLookAtRotateByEyeGaze Objekt angefügt wurde, wird ein GameObject während des Blicks gedreht.

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;

        ...
    }
}

Überprüfen Sie die API-Dokumentation für eine vollständige Liste der verfügbaren Ereignisse der BaseEyeFocusHandler:

  • OnEyeFocusStart: Wird ausgelöst, sobald der Blickstrahl mit dem Kollidieren dieses Ziels beginnt .
  • OnEyeFocusStay: Ausgelöst , während der Blickstrahl mit dem Kollidieren dieses Ziels intersectingiert wird.
  • OnEyeFocusStop: Wird ausgelöst, sobald der Blickstrahl mit dem Kollidieren dieses Ziels beendet wird.
  • OnEyeFocusDwell: Ausgelöst, nachdem der Blickstrahl dieses Ziels für einen bestimmten Zeitraum mit dem Kollidieren dieses Ziels intersecziert wurde.

2. Unabhängige Augenblick-spezifische EyeTrackingTarget

Schließlich bieten wir Ihnen eine Lösung, mit der Sie augenbasierte Eingaben vollständig 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 aktuell aktiven primären Eingabe. Daher können Sie mehrere Eingaben gleichzeitig verarbeiten – z. B. die Kombination von schnellen Augenzielen mit Handgesten.
  • Mehrere Unity-Ereignisse wurden bereits eingerichtet, um es schnell und bequem zu machen, vorhandene Verhaltensweisen innerhalb des Unity-Editors oder über Code zu behandeln und wiederzuverwenden.

Es gibt auch einige Nachteile:

  • Mehr Aufwand, separate Eingaben einzeln zu verarbeiten.
  • Keine elegante Verschlechterung: Es unterstützt nur die Augenzielung. Wenn die Eye Tracking nicht funktioniert, benötigen Sie einen zusätzlichen Fallback.

Ähnlich wie der BaseFocusHandler kommt das EyeTrackingTarget mit mehreren Eye-Gaze-spezifischen Unity-Ereignissen bereit, die Sie bequem über den Unity-Editor hören können (siehe Beispiel unten) oder mithilfe von AddListener() im Code:

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

Im Folgenden werden Sie durch einige Beispiele für die Verwendung von EyeTrackingTarget geführt.

Beispiel #1: Augengestützte smarte Benachrichtigungen

In EyeTrackingDemo-02-TargetSelection (Assets/MRTK/Examples/Demos/EyeTracking/Szenen) finden Sie ein Beispiel für "intelligente aufmerksame Benachrichtigungen" , die auf Ihren Blick reagieren. Hierbei handelt es sich um 3D-Textfelder, die in der Szene platziert werden können und die den Benutzer reibungslos vergrößern und in Richtung des Benutzers drehen, wenn die Lesbarkeit erleichtert wird. Während der Benutzer die Benachrichtigung liest, werden die Informationen immer wieder scharf und klar angezeigt. Nachdem Sie sie gelesen und sich von der Benachrichtigung entfernt haben, wird die Benachrichtigung automatisch geschlossen und ausgeblendet. Um dies zu erreichen, gibt es ein paar generische Verhaltensskripts, die für die Eye Tracking nicht spezifisch sind, z. B.:

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

Im Beispiel der "intelligenten aufmerksamen Benachrichtigungen" geschieht Folgendes:

  • OnLookAtStart(): Die Benachrichtigung beginnt mit...

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

  • OnLookAway(): Die Benachrichtigung beginnt mit...

    • FaceUser.Disengage: ... kehren Sie zur ursprünglichen Ausrichtung zurück.
    • ChangeSize.Disengage: ... verkleinern Sie die ursprüngliche Größe.
    • BlendOut.Disengage: ... beginnt auszublenden - Wenn OnDwell() ausgelöst wurde, blenden Sie sie vollständig aus und zerstören, andernfalls zurück zum Leerlaufzustand.

Designüberlegung: Der Schlüssel zu einem angenehmen Erlebnis ist hier, die Geschwindigkeit eines dieser Verhaltensweisen sorgfältig zu optimieren, um Beschwerden zu vermeiden, indem er auf den Blick des Benutzers zu schnell reagiert. Andernfalls kann dies schnell extrem überwältigend sein.

Target Notification

Beispiel #2: Holographisches Gem wird langsam gedreht, wenn sie sich ansehen

Ähnlich wie beispiel #1 können wir einfach ein Mauszeigerfeedback für unsere holografischen Gems in EyeTrackingDemo-02-TargetSelection (Assets/MRTK/Example/Demos/EyeTracking/Scenes) -Szene erstellen, die sich langsam in konstanter Richtung und in einer konstanten Geschwindigkeit (im Gegensatz zum Drehungsbeispiel von oben) drehen wird. Alles, was Sie benötigen, ist die Drehung des holografischen Gems aus dem EyeTrackingTarget's WhileLookingAtTarget()-Ereignis. Im Anschluss finden Sie einige weitere Details:

  1. Erstellen Sie ein generisches Skript, das eine öffentliche Funktion enthält, um das GameObject zu drehen, dem sie angefügt ist. Unten finden Sie ein Beispiel aus RotateWithConstSpeedDir.cs , in dem wir die Drehungsrichtung und Geschwindigkeit aus dem 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 Skript zu Ihrem Ziel GameObject hinzu, und verweisen Sie auf die EyeTrackingTarget Funktion "RotateTarget() " im UnityEvent-Trigger wie unten gezeigt:

    EyeTrackingTarget sample

Beispiel #3: Pop diese Gems aka multi-modal eye-gaze-unterstützte Zielauswahl

Im vorherigen Beispiel haben wir gezeigt, wie einfach es ist, zu erkennen, ob ein Ziel betrachtet wird und wie eine Reaktion ausgelöst wird. Als Nächstes explodieren wir die Gems mithilfe des OnSelected() -Ereignisses aus dem EyeTrackingTarget. Der interessante Teil ist , wie die Auswahl ausgelöst wird. Mit der EyeTrackingTarget Möglichkeit, eine Auswahl schnell zu zuweisen, können Sie eine Auswahl schnell zuweisen:

  • Heftgeste: Festlegen der "Aktion auswählen" auf "Auswählen" verwendet die Standardhandgeste, um die Auswahl auszulösen. Dies bedeutet, dass der Benutzer einfach seine Hand anhebt und seinen Daumen und Indexfinger zusammenheften kann, um die Auswahl zu bestätigen.

  • Sagen Sie "Auswählen": Verwenden Sie den Standard-Sprachbefehl "Auswählen" , um ein Hologramm auszuwählen.

  • 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 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 "Neue Sprachbefehl hinzufügen"
        • Zuordnen der aktion, die Sie gerade erstellt haben
        • Weisen Sie einen KeyCode zu, um die Aktion über eine Schaltfläche auszulösen.

Voice commands EyeTrackingTarget sample

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

  • Im Unity-Editor: Sie können einfach das Skript verknüpfen, das an jede unserer Gem-Vorlagen an das OnSelected() Unity-Ereignis im Unity-Editor angefügt ist.
  • Code: Wenn Sie GameObjects nicht ziehen und ablegen möchten, können Sie auch einfach einen Ereignislistener direkt zu Ihrem Skript hinzufügen.
    Hier sehen Sie ein Beispiel, wie wir es im HitBehaviorDestroyOnSelect Skript getan haben:
/// <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 zusammen

Handstrahlen nehmen Vorrang vor Kopf und Blickziel. Dies bedeutet, wenn Handstrahlen aktiviert sind, der Moment, an dem die Hände in Die Ansicht kommen, wird der Handstrahl als primärer Zeiger fungiert. Es kann jedoch Situationen geben, in denen Sie Handstrahlen verwenden möchten, während sie immer noch erkennen, ob ein Benutzer ein bestimmtes Hologramm betrachtet. Kein Problem! Im Wesentlichen benötigen Sie zwei Schritte:

1. Aktivieren Sie den Handstrahl: Um den Handstrahl zu aktivieren, wechseln Sie zu Mixed Reality Toolkit -> Eingabe -> Zeiger. Im EyeTrackingDemo-00-RootScene, in dem das Mixed Reality Toolkit einmal für alle Eye Tracking-Demoszenen konfiguriert ist, sollten Sie das EyeTrackingDemoPointerProfile sehen. Sie können entweder ein neues Eingabeprofil von Grund auf erstellen oder die aktuelle Augenverfolgung anpassen:

  • Von Grund auf: Wählen Sie auf der Registerkarte " Zeiger" die Option "DefaultMixedRealityInputPointerProfile " im Kontextmenü aus. Dies ist das Standardzeigerprofil, das bereits den Handstrahl aktiviert hat! 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 "Gaze Cursor Prefab".
  • Basierend auf dem vorhandenen EyeTrackingDemoPointerProfile: Doppelklicken Sie auf das EyeTrackingDemoPointerProfile, und fügen Sie den folgenden Eintrag unter Zeigeroptionen hinzu:
    • Controllertyp: "Artikulierte Hand", "Windows Mixed Reality"
    • Händigkeit: Jegliche
    • Zeiger-Prefab: DefaultControllerPointer

2. Erkennen Sie, dass ein Hologramm angezeigt wird: Verwenden Sie das EyeTrackingTarget Skript, um zu aktivieren, dass ein Hologramm wie oben beschrieben angezeigt wird. Sie können auch das FollowEyeGaze Beispielskript für Inspiration betrachten, da dies ein Hologramm zeigt, das Ihren Augenblick (z. B. einen Cursor) folgt, ob Handstrahlen aktiviert oder nicht.

Wenn Sie nun mit den Demoszenen der Augenverfolgung beginnen, sollten Sie einen Ray von Ihren Händen sehen. Beispielsweise folgt der halbtransparente Kreis im Augenverfolgungszielauswahl-Demo immer noch ihrem Blick, und die Gems reagieren darauf, ob sie betrachtet werden oder nicht, während die oberen Szenenmenüschaltflächen stattdessen den primären Eingabezeiger (Ihre Hände) verwenden.


Zurück zu "Augenverfolgung im MixedRealityToolkit"