Door het oog ondersteunde doelselectie — MRTK2

MRTK

Op deze pagina worden verschillende opties besproken voor het openen van eye gaze-gegevens en oogklikken specifieke gebeurtenissen om doelen in MRTK te selecteren. Oogtracering maakt snelle en moeiteloze doelselecties mogelijk met behulp van een combinatie van informatie over waar een gebruiker naar kijkt, met extra invoer, zoals handtracering en spraakopdrachten:

  • Kijk & Zeg 'Selecteren' (standaard spraakopdracht)
  • Kijk & Zeg 'Exploderen' of 'Pop' (aangepaste spraakopdrachten)
  • Look & Bluetooth-knop
  • Kijk & Knijp (dat wil zeggen, houd uw hand voor u omhoog en breng uw duim en wijsvinger samen)

Als u holografische inhoud wilt selecteren met ogen staren, zijn er verschillende opties:

1. Gebruik de primaire focuspointer:

Dit kan worden gezien als uw prioriteitscursor. Als de handen in beeld zijn, zijn dit standaard handstralen. Als er geen handen in beeld zijn, is de prioriteitsaanwijzer hoofd- of oog staren. Houd er dus rekening mee dat op basis van het huidige ontwerp hoofd- of oog staren wordt onderdrukt als een cursorinvoer als handstralen worden gebruikt.

Bijvoorbeeld:

Een gebruiker wil een holografische knop op afstand selecteren. Als ontwikkelaar wilt u een flexibele oplossing bieden waarmee de gebruiker deze taken onder verschillende voorwaarden kan uitvoeren:

  • Ga naar de knop en klik erop
  • Bekijk het van een afstand en zeg 'selecteren'
  • De knop richten met behulp van een handstraal en een knijpbeweging uitvoeren In dit geval is de meest flexibele oplossing het gebruik van de primaire focushandler, omdat deze u op de hoogte stelt wanneer de momenteel prioriteitsaanwijzer een gebeurtenis activeert. Houd er rekening mee dat als handstralen zijn ingeschakeld, de focusaanwijzer voor hoofd- of ogenkijken wordt uitgeschakeld zodra de handen in beeld komen.

Belangrijk

Houd er rekening mee dat als handstralen zijn ingeschakeld, de focusaanwijzer voor hoofd- of ogenkijken wordt uitgeschakeld zodra de handen in beeld komen. Als u een 'look and pinch' -interactie wilt ondersteunen, moet u de handstraal uitschakelen. In onze voorbeeldscènes voor oogtracering hebben we de handstraal uitgeschakeld om rijkere interacties te laten zien met behulp van ogen en handbewegingen - zie bijvoorbeeld Eye-Supported Positioning.

2. Gebruik zowel oogfocus als handstralen tegelijkertijd:

Er kunnen gevallen zijn waarin u specifieker wilt zijn met welk type focuspointers bepaalde gebeurtenissen kunnen worden geactiveerd en waarbij tegelijkertijd meerdere ver-interactietechnieken kunnen worden gebruikt.

Bijvoorbeeld: in uw app kan een gebruiker verre stralen gebruiken om bepaalde holografische mechanische instellingen te manipuleren, bijvoorbeeld enkele holografische onderdelen van de holografische motor vastpakken en vasthouden en op hun plaats houden. Daarbij moet de gebruiker een aantal instructies doorlopen en zijn/haar voortgang vastleggen door enkele selectievakjes af te vinken. Als de gebruiker de handen niet bezet heeft, is het instinctief om het selectievakje aan te raken of het te selecteren met een handstraal. Als de gebruiker echter zijn of haar handen bezig heeft, zoals in ons geval het vasthouden van enkele holografische engineonderdelen, wilt u de gebruiker in staat stellen om naadloos door de instructies te bladeren met behulp van hun oogblik en gewoon naar een selectievakje te kijken en te zeggen 'check it!'.

Om dit mogelijk te maken, moet u oogspecifiek EyeTrackingTarget-script gebruiken dat onafhankelijk is van de kern MRTK FocusHandlers en hieronder verder wordt besproken.

1. Algemene handlers voor focus en aanwijzers gebruiken

Als oogtracering correct is ingesteld (zie Standaard MRTK-instellingen voor het gebruik van oogtracering), is het inschakelen van gebruikers om hologrammen te selecteren met hun ogen hetzelfde als voor andere focusinvoer (bijvoorbeeld hoofd staren of handstraal). Dit biedt het grote voordeel van een flexibele manier om met uw hologrammen te werken door het belangrijkste focustype in uw MRTK-profiel voor invoeraanwijzer te definiëren, afhankelijk van de behoeften van uw gebruiker, terwijl uw code ongewijzigd blijft. Dit maakt het mogelijk om te schakelen tussen hoofd- of oog staren zonder een coderegel te wijzigen of handstralen te vervangen door oog gericht voor verre interacties.

Focus op een hologram

Als u wilt detecteren wanneer een hologram is gericht, gebruikt u de interface 'IMixedRealityFocusHandler' die u twee interfaceleden biedt: OnFocusEnter en OnFocusExit.

Hier volgt een eenvoudig voorbeeld van ColorTap.cs om de kleur van een hologram te wijzigen wanneer deze wordt bekeken.

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

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

Een hologram met focus selecteren

Als u een hologram met focus wilt selecteren, gebruikt u PointerHandler om te luisteren naar invoerevenementen om een selectie te bevestigen. Als u bijvoorbeeld de IMixedRealityPointerHandler toevoegt, reageert deze op eenvoudige aanwijzerinvoer. Voor de IMixedRealityPointerHandler-interface moeten de volgende drie interfaceleden worden geïmplementeerd: OnPointerUp, OnPointerDown en OnPointerClicked.

In het onderstaande voorbeeld wijzigen we de kleur van een hologram door ernaar te kijken en te knijpen of 'selecteren' te zeggen. De vereiste actie om de gebeurtenis te activeren, wordt gedefinieerd door eventData.MixedRealityInputAction == selectAction , waarbij we het type kunnen selectAction instellen in de Unity-editor. Standaard is dit de actie 'Selecteren'. De typen beschikbare MixedRealityInputActions kunnen worden geconfigureerd in het MRTK-profiel via MRTK-configuratieprofiel ->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) { }
}

Eye-gaze-specific BaseEyeFocusHandler

Gezien het feit dat ogen staren sterk kan verschillen van andere aanwijzerinvoer, kunt u ervoor zorgen dat u alleen op de focusinvoer reageert als het ogen staren is en dit momenteel de primaire invoerpointer is. Hiervoor gebruikt u de BaseEyeFocusHandler die specifiek is voor oogtracering en die is afgeleid van de BaseFocusHandler. Zoals eerder vermeld, wordt deze alleen geactiveerd als oogstaren gericht momenteel de primaire aanwijzerinvoer is (dat wil zeggen dat er geen handstraal actief is). Zie Oog staren en handbewegingen ondersteunen voor meer informatie.

Hier volgt een voorbeeld van EyeTrackingDemo-03-Navigation (Assets/MRTK/Examples/Demos/EyeTracking/Scenes). In deze demo zijn er twee 3D-hologrammen die worden ingeschakeld, afhankelijk van welk deel van het object wordt bekeken: als de gebruiker naar de linkerkant van het hologram kijkt, wordt dat deel langzaam naar de voorkant van de gebruiker verplaatst. Als naar de rechterkant wordt gekeken, zal dat deel langzaam naar voren bewegen. Dit is een gedrag dat u mogelijk niet altijd actief wilt hebben en ook iets dat u mogelijk niet per ongeluk wilt activeren door een handstraal of hoofd te staren. Als de OnLookAtRotateByEyeGaze is gekoppeld, wordt een GameObject gedraaid terwijl er naar wordt gekeken.

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;

        ...
    }
}

Raadpleeg de API-documentatie voor een volledige lijst met beschikbare gebeurtenissen van de BaseEyeFocusHandler:

  • OnEyeFocusStart: Geactiveerd zodra de oogstraal begint te snijden met de collider van dit doelwit.
  • OnEyeFocusStay: Geactiveerd terwijl de oog gerichtheidsstraal kruist met de collider van dit doelwit.
  • OnEyeFocusStop: Geactiveerd zodra de oogstraal stopt met snijden met de collider van dit doelwit.
  • OnEyeFocusDwell: Wordt geactiveerd zodra de oogklikkenstraal gedurende een opgegeven tijd is gekruist met de collider van dit doel.

2. Onafhankelijke eye-gaze-specifieke EyeTrackingTarget

Ten slotte bieden we u een oplossing waarmee u invoer op basis van ogen volledig onafhankelijk van andere focuspointers kunt behandelen via het EyeTrackingTarget script.

Dit heeft drie voordelen:

  • U kunt ervoor zorgen dat het hologram alleen reageert op de blik van de gebruiker.
  • Dit is onafhankelijk van de momenteel actieve primaire invoer. Daarom kunt u meerdere invoerbewerkingen tegelijk verwerken, bijvoorbeeld door snel oog richten te combineren met handbewegingen.
  • Er zijn al verschillende Unity-gebeurtenissen ingesteld om het snel en gemakkelijk te maken om bestaand gedrag te verwerken en opnieuw te gebruiken vanuit de Unity-editor of via code.

Er zijn ook enkele nadelen:

  • Meer moeite om afzonderlijke invoer afzonderlijk te verwerken.
  • Geen elegante degradatie: het ondersteunt alleen oog gerichtheid. Als oogtracering niet werkt, hebt u een extra terugval nodig.

Net als de BaseFocusHandler wordt de EyeTrackingTarget geleverd met verschillende oog-specifieke Unity-gebeurtenissen die u gemakkelijk kunt beluisteren via de Unity-editor (zie het onderstaande voorbeeld) of met behulp van AddListener() in code:

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

In het volgende worden enkele voorbeelden beschreven voor het gebruik van EyeTrackingTarget.

Voorbeeld 1: slimme meldingen die door het oog worden ondersteund

In EyeTrackingDemo-02-TargetSelection (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) vindt u een voorbeeld voor 'slimme attente meldingen' die reageren op uw ogen kijken. Dit zijn 3D-tekstvakken die in de scène kunnen worden geplaatst en die soepel worden vergroot en naar de gebruiker worden gericht wanneer ze worden bekeken om de leesbaarheid te vereenvoudigen. Terwijl de gebruiker de melding leest, wordt de informatie steeds helder en duidelijk weergegeven. Na het lezen en wegkijken van de melding, wordt de melding automatisch gesloten en vervaagd. Om dit allemaal te bereiken, zijn er enkele algemene gedragsscripts die helemaal niet specifiek zijn voor oogtracering, zoals:

Het voordeel van deze aanpak is dat dezelfde scripts opnieuw kunnen worden gebruikt door verschillende gebeurtenissen. Een hologram kan bijvoorbeeld naar de gebruiker worden gericht op basis van een spraakopdracht of na het indrukken van een virtuele knop. Als u deze gebeurtenissen wilt activeren, kunt u gewoon verwijzen naar de methoden die moeten worden uitgevoerd in het EyeTrackingTarget script dat is gekoppeld aan uw GameObject.

Voor het voorbeeld van de 'slimme attente meldingen' gebeurt het volgende:

  • OnLookAtStart(): de melding begint met...

    • FaceUser.Engage: ... naar de gebruiker toe te keren.
    • ChangeSize.Engage: ... vergroten in grootte (tot een opgegeven maximale schaal).
    • BlendOut.Engage: ... begint in meer op te gaan (na een subtielere niet-actieve status).
  • OnDwell(): informeert het BlendOut-script dat de melding voldoende is bekeken.

  • OnLookAway(): De melding begint met...

    • FaceUser.Disengage: ... teruggaan naar de oorspronkelijke richting.
    • ChangeSize.Disengage: ... terug te nemen naar de oorspronkelijke grootte.
    • BlendOut.Disengage: ... begint met overvloeien: als OnDwell() is geactiveerd, mengt u volledig en vernietigt u, anders terug naar de niet-actieve status.

Ontwerpoverweging: De sleutel tot een plezierige ervaring hier is om de snelheid van elk van deze gedragingen zorgvuldig af te stemmen om ongemak te voorkomen door te reageren op de blik van de gebruiker te snel. Anders kan dit al snel extreem overweldigend zijn.

Doelmelding

Voorbeeld 2: Holographic gem draait langzaam wanneer het wordt bekeken

Net als bij voorbeeld 1 kunnen we eenvoudig feedback maken voor onze holografische edelstenen in EyeTrackingDemo-02-TargetSelection de scène Assets/MRTK/Examples/Demos/EyeTracking/Scenes die langzaam in een constante richting en met een constante snelheid draaien (in tegenstelling tot het bovenstaande draaivoorbeeld). U hoeft alleen de rotatie van het holografische juweel te activeren vanuit de whilelookingattarget()-gebeurtenis van EyeTrackingTarget. Hier volgen nog enkele details:

  1. Maak een algemeen script met een openbare functie voor het roteren van het GameObject waaraan het is gekoppeld. Hieronder ziet u een voorbeeld van RotateWithConstSpeedDir.cs , waar we de draairichting en snelheid kunnen aanpassen vanuit de Unity Editor.

    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. Voeg het EyeTrackingTarget script toe aan uw doel-GameObject en verwijs naar de functie RotateTarget() in de UnityEvent-trigger, zoals in de onderstaande schermopname wordt weergegeven:

    EyeTrackingTarget-voorbeeld

Voorbeeld 3: Pop die edelstenen, ook wel multimodale oog-gaze-ondersteunde doelselectie

In het vorige voorbeeld hebben we laten zien hoe eenvoudig het is om te detecteren of er naar een doel wordt gekeken en hoe een reactie hierop kan worden geactiveerd. Laten we nu de edelstenen laten ontploffen met behulp van de gebeurtenis OnSelected() van de EyeTrackingTarget. Het interessante is hoe de selectie wordt geactiveerd. Met EyeTrackingTarget kunt u snel verschillende manieren toewijzen om een selectie aan te roepen:

  • Knijpbeweging: als u actie selecteren instelt op Selecteren, wordt de standaardbeweging met de hand gebruikt om de selectie te activeren. Dit betekent dat de gebruiker eenvoudig zijn hand kan opsteken en zijn duim en wijsvinger samen kan knijpen om de selectie te bevestigen.

  • Zeg 'Selecteren': gebruik de standaard spraakopdracht 'Selecteren' voor het selecteren van een hologram.

  • Zeg 'Exploderen' of 'Pop': als u aangepaste spraakopdrachten wilt gebruiken, moet u twee stappen uitvoeren:

    1. Een aangepaste actie instellen, zoals 'DestroyTarget'

      • Navigeren naar MRTK -> Invoer -> Invoeracties
      • Klik op 'Een nieuwe actie toevoegen'
    2. De spraakopdrachten instellen waarmee deze actie wordt geactiveerd, zoals 'Exploderen' of 'Pop'

      • Navigeren naar MRTK -> Invoer -> Spraak
      • Klik op 'Een nieuwe spraakopdracht toevoegen'
        • De actie koppelen die u zojuist hebt gemaakt
        • Wijs een KeyCode toe om het activeren van de actie mogelijk te maken via een druk op de knop

Voorbeeld van spraakopdrachten EyeTrackingTarget

Wanneer een juweeltje wordt geselecteerd, zal deze ontploffen, waardoor een geluid wordt gemaakt en verdwijnt. Dit wordt afgehandeld door het HitBehaviorDestroyOnSelect script. U hebt hiervoor twee opties:

  • In de Unity-editor: U kunt het script dat is gekoppeld aan elk van onze gem-sjablonen eenvoudig koppelen aan de gebeurtenis OnSelected() Unity in de Unity-editor.
  • In code: Als u GameObjects niet wilt slepen en neerzetten, kunt u ook gewoon een gebeurtenislistener rechtstreeks aan uw script toevoegen.
    Hier volgt een voorbeeld van hoe we dit hebben gedaan in het HitBehaviorDestroyOnSelect 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
    }
}

Voorbeeld 4: Handstralen en blikinvoer voor ogen samen gebruiken

Handstralen hebben prioriteit boven het richten van hoofd- en oog staren. Dit betekent dat, als handstralen zijn ingeschakeld, de handstraal als de primaire aanwijzer zal fungeren op het moment dat de handen in beeld komen. Er kunnen echter situaties zijn waarin u handstralen wilt gebruiken terwijl u nog steeds detecteert of een gebruiker naar een bepaald hologram kijkt. Gemakkelijk! In wezen hebt u twee stappen nodig:

1. De handstraal inschakelen: als u de handstraal wilt inschakelen, gaat u naar Mixed Reality Toolkit -> Invoer -> Aanwijzers. In de EyeTrackingDemo-00-RootScene waar Mixed Reality Toolkit eenmaal is geconfigureerd voor alle demoscènes voor oogtracering, ziet u het EyeTrackingDemoPointerProfile. U kunt een nieuw invoerprofiel maken of het huidige oogtraceringsprofiel aanpassen:

  • Volledig nieuw: Selecteer op het tabblad Aanwijzers het bestand DefaultMixedRealityInputPointerProfile in het contextmenu. Dit is het standaardprofiel voor de aanwijzer waarop de handstraal al is ingeschakeld. Als u de standaardcursor (een ondoorzichtige witte stip) wilt wijzigen, kloont u het profiel en maakt u uw eigen aangepaste aanwijzerprofiel. Vervang vervolgens DefaultCursor door EyeGazeCursor onder Gaze Cursor Prefab.
  • Op basis van het bestaande EyeTrackingDemoPointerProfile: Dubbelklik op het bestand EyeTrackingDemoPointerProfile en voeg de volgende vermelding toe onder Aanwijzeropties:
    • Type controller: 'Gelede hand', 'Windows Mixed Reality'
    • Handigheid: Alle
    • Aanwijzer prefab: DefaultControllerPointer

2. Detecteren dat er naar een hologram wordt gekeken: gebruik het EyeTrackingTarget script om te detecteren dat er naar een hologram wordt gekeken, zoals hierboven wordt beschreven. U kunt ook het FollowEyeGaze voorbeeldscript ter inspiratie bekijken, omdat hier een hologram wordt weergegeven dat uw ogen volgt (bijvoorbeeld een cursor), ongeacht of handstralen zijn ingeschakeld of niet.

Wanneer u nu de demoscènes voor oogtracering start, ziet u een straal uit uw handen. In de doelselectiedemo voor oogtracering volgt de semitransparante cirkel bijvoorbeeld nog steeds uw ogen en reageren de edelstenen op of ze worden bekeken of niet, terwijl de bovenste scènemenuknoppen in plaats daarvan de primaire invoeraanwijzer (uw handen) gebruiken.


Terug naar 'Oogtracering in de MixedRealityToolkit'