Door ogen ondersteunde doelselectie

MRTK

Op deze pagina worden verschillende opties besproken voor toegang tot oogklikken en oogklikken op specifieke gebeurtenissen om doelen te selecteren in MRTK. Oogtracking maakt snelle en moeiteloze doelselecties mogelijk met behulp van een combinatie van informatie over waar een gebruiker naar kijkt met extra invoer, zoals handtracking en spraakopdrachten:

  • Look & Say "Select" (standaard spraakopdracht)
  • Zeg & ' Exploderen' of 'Pop' (aangepaste spraakopdrachten)
  • Knop Bluetooth zoeken &
  • Kijk Knijp & (houd je hand omhoog voor je en breng je duim en indexvinger bij elkaar)

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

1. Gebruik de primaire focuspointer:

Dit kan worden begrepen als de cursor met prioriteit. Als de handen in beeld zijn, zijn dit standaard handstralen. Als er geen handen in beeld zijn, zou de prioriteitsaanwijzer hoofd- of oogklikken zijn. Houd er dus rekening mee dat op basis van de huidige ontwerpkop of oogklikken wordt onderdrukt als cursorinvoer als handstralen worden gebruikt.

Bijvoorbeeld:

Een gebruiker wil een verafgelegen holografische knop selecteren. Als ontwikkelaar wilt u een flexibele oplossing bieden waarmee de gebruiker deze taken in verschillende omstandigheden kan uitvoeren:

  • Loop omhoog naar de knop en poke het
  • Kijk er vanaf een afstand naar en zeg "select"
  • Richt u op de knop met behulp van een handstraal en het uitvoeren van een knijp in dit geval, de meest flexibele oplossing is het gebruik van de primaire focushandler, omdat deze u op de hoogte stelt wanneer de huidige primaire focusaanwijzer een gebeurtenis activeert. Houd er rekening mee dat als handstralen zijn ingeschakeld, de focusaanwijzer op het hoofd of oog wordt uitgeschakeld zodra de handen in beeld komen.

Belangrijk

Houd er rekening mee dat als handstralen zijn ingeschakeld, de focusaanwijzer op het hoofd of oog 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 met oogtracking hebben we de handstraal uitgeschakeld om rijkere interacties mogelijk te maken met behulp van ogen + handbewegingen - zie bijvoorbeeld Door ogen ondersteunde plaatsing.

2. Gebruik tegelijkertijd oogfocus en handstralen:

Er zijn mogelijk gevallen waarin u specifieker wilt zijn welk type focusaanwijzers bepaalde gebeurtenissen kunnen activeren en tegelijkertijd meerdere interactietechnieken kunnen gebruiken.

Bijvoorbeeld: In uw app kan een gebruiker veel handstralen gebruiken om een aantal holografische mechanische installatie te manipuleren, bijvoorbeeld om enkele delen van de holografische holografische motor te pakken en vast te houden en op hun plaats te houden. Terwijl de gebruiker dit doet, moet hij een aantal instructies doorlopen en de voortgang vastleggen door enkele selectievakjes uit te schakelen. Als de gebruiker haar/zijn handen niet bezet heeft, is het instinctief om het selectievakje aan te raken of te selecteren met behulp van een handstraal. Als de gebruiker echter zijn handen bezet heeft, zoals in ons geval het houden van een aantal holografische engineonderdelen, wilt u de gebruiker in staat stellen naadloos door de instructies te bladeren met behulp van hun oog staren en gewoon naar een selectievakje te kijken en 'check it!' te zeggen.

Als u dit wilt inschakelen, moet u oogspecifiek EyeTrackingTarget-script gebruiken dat onafhankelijk is van de MRTK FocusHandlers en verder hieronder wordt besproken.

1. Algemene focus- en aanwijzerhandlers gebruiken

Als oogtracking correct is ingesteld (zie Basic MRTK setup voor het gebruik van oogtracking), zodat gebruikers hologrammen kunnen selecteren met behulp van hun ogen, is hetzelfde als voor andere focusinvoer (bijvoorbeeld hoofdboog of handstraal). Dit biedt het grote voordeel van een flexibele manier om te communiceren met uw hologrammen door het belangrijkste focustype in uw MRTK Input Pointer-profiel te definiëren, afhankelijk van de behoeften van uw gebruiker, terwijl uw code ongewijzigd blijft. Hierdoor kunt u schakelen tussen hoofd- of oogklikken zonder een regel code te wijzigen of handstralen te vervangen door oog gericht op verre interacties.

Focussen 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 prioriteit selecteren

Als u een gericht hologram wilt selecteren, gebruikt u PointerHandler om te luisteren naar invoerevenementen om een selectie te bevestigen. Als u bijvoorbeeld de IMixedRealityPointerHandler toevoegt, reageren ze op eenvoudige aanwijzerinvoer. Voor de interface IMixedRealityPointerHandler 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 het type in selectAction de Unity-editor in te stellen. Dit is standaard de actie Selecteren. De typen beschikbare MixedRealityInputActions kunnen worden geconfigureerd in het MRTK-profiel via MRTK-configuratieprofiel ->Input -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) { }
}

Oogspecifieke BaseEyeFocusHandler

Aangezien de blik van het oog heel anders kan zijn dan andere aanwijzers, kunt u ervoor zorgen dat u alleen reageert op de focusinvoer als deze oogklikken is en het momenteel de primaire invoerpointer is. Voor dit doel gebruikt u de BaseEyeFocusHandler specifieke functie voor oogtracering en die is afgeleid van de BaseFocusHandler. Zoals eerder vermeld, wordt deze alleen geactiveerd als oogklikken momenteel de primaire aanwijzerinvoer is (dat wil gezegd hebben dat er geen handstraal actief is). Zie Oogklikken 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 afhankelijk zijn van welk deel van het object wordt bekeken: Als de gebruiker naar de linkerkant van het hologram kijkt, gaat dat deel langzaam naar de voorkant van de gebruiker. Als de rechterkant wordt bekeken, gaat dat deel langzaam naar de voorkant. Dit is een gedrag dat u misschien niet altijd actief wilt hebben en ook iets dat u niet per ongeluk wilt activeren door een handstraal of hoofdklikken. Als de OnLookAtRotateByEyeGaze bijlage is gekoppeld, draait een GameObject terwijl deze wordt bekeken.

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 doel.
  • OnEyeFocus Stay: Geactiveerd terwijl de oogstraal kruist met de collider van dit doel.
  • OnEyeFocusStop: Geactiveerd zodra de oogstraal stopt met snijden met de collider van dit doel.
  • OnEyeFocusDwell: Geactiveerd zodra de oogstraal gedurende een bepaalde tijd met de collider van dit doel is gekruist.

2. Onafhankelijke oog-blik-specifieke EyeTrackingTarget

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

Dit heeft drie voordelen:

  • U kunt ervoor zorgen dat het hologram alleen reageert op de ogen van de gebruiker.
  • Dit is onafhankelijk van de momenteel actieve primaire invoer. Daarom kunt u meerdere invoer tegelijk verwerken, bijvoorbeeld het combineren van snelle ooggerichtheid met handbewegingen.
  • Er zijn al verschillende Unity-gebeurtenissen ingesteld om het snel en handig te maken om bestaande gedragingen vanuit de Unity-editor of via code te verwerken en opnieuw te gebruiken.

Er zijn ook enkele nadelen:

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

Net als bij de BaseFocusHandler is de EyeTrackingTarget klaar met verschillende eye-gaze-specifieke Unity-gebeurtenissen die u gemakkelijk kunt beluisteren via de Unity Editor (zie hieronder voorbeeld) of met behulp van AddListener() in code:

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

Hieronder volgen enkele voorbeelden voor het gebruik van EyeTrackingTarget.

Voorbeeld 1: Door ogen ondersteunde slimme meldingen

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

Het voordeel van deze benadering is dat dezelfde scripts kunnen worden hergebruikt door verschillende gebeurtenissen. Een hologram kan bijvoorbeeld beginnen met het bekijken van de gebruiker op basis van spraakopdrachten of na het drukken op 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 wordt gestart...

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

  • OnLookAway(): De melding wordt gestart...

    • FaceUser.Disengage: ... keer terug naar de oorspronkelijke afdrukstand.
    • ChangeSize.Disengage: ... verkleinen tot de oorspronkelijke grootte.
    • BlendOut.Disengage: ... begint te mengen - Als OnDwell() is geactiveerd, volledig mengen en vernietigen, anders terug naar de niet-actieve status.

Ontwerpoverwegingen: 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 ogen van de gebruiker te snel. Anders kan dit zich snel zeer overweldigend voelen.

Target Notification

Voorbeeld #2: Holographic gem draait langzaam wanneer u ernaar kijkt

Net als in voorbeeld #1 kunnen we eenvoudig een aanwijsfeedback maken voor onze holografische edelstenen in EyeTrackingDemo-02-TargetSelection scènes (Assets/MRTK/Examples/Demos/EyeTracking/Scènes), die langzaam in een constante richting draaien en met een constante snelheid (in tegenstelling tot het bovenstaande draaivoorbeeld) wanneer ze worden bekeken. U hoeft alleen de draaiing van de holografische gem te activeren vanuit de gebeurtenis WhileLookingAtTarget() van EyeTrackingTarget(). Hier volgen nog enkele details:

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

    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 hieronder wordt weergegeven:

    EyeTrackingTarget sample

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

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

  • Knijpbeweging: Als u de actie Selecteren instelt op Selecteren, wordt de standaardbeweging met de hand gebruikt om de selectie te activeren. Dit betekent dat de gebruiker gewoon zijn hand omhoog kan steken en zijn duim en indexvinger samen kan knijpen om de selectie te bevestigen.

  • Zeg 'Selecteren': gebruik de standaard spraakopdracht Selecteren om een hologram te selecteren.

  • Zeg 'Explode' 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 die deze actie activeren, zoals 'Explode' of 'Pop'

      • Navigeren naar MRTK -> Invoer -> Spraak
      • Klik op 'Een nieuwe spraakopdracht toevoegen'
        • Koppel de actie die u zojuist hebt gemaakt
        • Een KeyCode toewijzen om de actie via een knop te activeren

Voice commands EyeTrackingTarget sample

Wanneer een juweeltje is geselecteerd, explodeert het, waardoor er een geluid wordt gemaakt en verdwijnt. Dit wordt verwerkt 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 koppelen aan de Unity-gebeurtenis OnSelected() in de Unity-editor.
  • In code: Als u GameObjects niet wilt slepen en neerzetten, kunt u ook rechtstreeks een gebeurtenislistener toevoegen aan uw script.
    Hier volgt een voorbeeld van hoe we dit in het HitBehaviorDestroyOnSelect script hebben gedaan:
/// <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 samen gebruiken

Handstralen hebben prioriteit boven het hoofd en ogen gericht. Dit betekent dat als handstralen zijn ingeschakeld, het moment dat de handen in beeld komen, de handstraal fungeert als de primaire aanwijzer. Er kunnen echter situaties zijn waarin u handstralen wilt gebruiken terwijl u nog steeds detecteert of een gebruiker een bepaald hologram bekijkt. Gemakkelijk! In wezen hebt u twee stappen nodig:

1. Schakel de handstraal in: Als u de handstraal wilt inschakelen, gaat u naar Mixed Reality Toolkit -> Invoer -> Aanwijzers. In de EyeTrackingDemo-00-RootScene, waar de Mixed Reality Toolkit eenmaal is geconfigureerd voor alle scènes van de eyetrackingDemodemo, ziet u het EyeTrackingDemoPointerProfile. U kunt een nieuw invoerprofiel helemaal zelf maken of de huidige oogtracking aanpassen:

  • Volledig nieuw: Selecteer op het tabblad Aanwijzers het DefaultMixedRealityInputPointerProfile in het contextmenu. Dit is het standaardprofiel voor aanwijzers waarvoor 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 de bestaande EyeTrackingDemoPointerProfile: Dubbelklik op het EyeTrackingDemoPointerProfile en voeg de volgende vermelding toe onder Aanwijzeropties:
    • Type controller: 'Gearticuleerde hand', 'Windows Mixed Reality'
    • Handigheid: Alle
    • Aanwijzer prefab: DefaultControllerPointer

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

Wanneer u de scènes van de eyetrackingdemo's start, zou u een straal uit uw handen moeten zien komen. In de demo van de doelselectie van de oogtracking volgt de semitransparante cirkel nog steeds uw ogen en reageren de edelstenen op of ze al dan niet worden bekeken, terwijl de bovenste scènemenuknoppen in plaats daarvan de primaire invoerwijzer (uw handen) gebruiken.


Terug naar 'Eye tracking in the MixedRealityToolkit'