Ögonstödt målval – MRTK2

MRTK

På den här sidan beskrivs olika alternativ för att komma åt ögonögadata och ögonögaspecifika händelser för att välja mål i MRTK. Ögonspårning möjliggör snabba och enkla målval med hjälp av en kombination av information om vad en användare tittar på med ytterligare indata som handspårning och röstkommandon:

  • Titta & Säga "Välj" (standardkommando för röst)
  • Titta & Säga "Explodera" eller "Pop" (anpassade röstkommandon)
  • Titta & Bluetooth-knapp
  • Titta & Nyp (d.v.s. håll upp handen framför dig och för ihop tummen och pekfingret)

Om du vill välja holografiskt innehåll med ögonöga finns det flera alternativ:

1. Använd den primära fokuspekaren:

Detta kan tolkas som din prioriterade markör. Om händerna visas som standard är det här handstrålar. Om inga händer visas är den prioriterade pekaren huvud eller ögonöga. Observera därför att baserat på det aktuella designhuvudet eller ögonögonblicken undertrycks som en markörinmatning om handstrålar används.

Exempel:

En användare vill välja en avlägsen holografisk knapp. Som utvecklare vill du tillhandahålla en flexibel lösning som gör att användaren kan utföra dessa uppgifter under olika förhållanden:

  • Gå fram till knappen och peta den
  • Titta på den från ett avstånd och säg "välj"
  • Rikta knappen med en handstråle och utför en nypa I det här fallet är den mest flexibla lösningen att använda den primära fokushanteraren eftersom den meddelar dig när den prioriterade primära fokuspekaren utlöser en händelse. Observera att om handstrålar är aktiverade inaktiveras fokuspekaren för huvud- eller ögonögonblixten så snart händerna visas.

Viktigt

Observera att om handstrålar är aktiverade inaktiveras fokuspekaren för huvud- eller ögonögonblixten så snart händerna visas. Om du vill stödja en "look and pinch" -interaktion måste du inaktivera handstrålen. I våra ögonspårningsexempelscener har vi inaktiverat handstrålen så att du kan visa rikare interaktioner med ögon + handrörelser – se till exempel Positionering som stöds av ögon.

2. Använd både ögonfokus och handstrålar samtidigt:

Det kan finnas instanser där du vill vara mer specifik vilken typ av fokuspekare som kan utlösa vissa händelser och tillåta samtidig användning av flera tekniker för långt interaktion.

Till exempel: I din app kan en användare använda långa handstrålar för att manipulera vissa holografiska mekaniska installationer , t.ex. ta tag i och hålla några avlägsna holografiska motordelar och hålla dem på plats. När du gör det måste användaren gå igenom ett antal instruktioner och registrera sina framsteg genom att markera några kryssrutor. Om användaren inte har händerna upptagna är det instinktivt att bara röra kryssrutan eller välja den med hjälp av en handstråle. Men om användaren har händerna upptagna, som i vårt fall med några holografiska motordelar på plats, vill du göra det möjligt för användaren att sömlöst bläddra igenom instruktionerna med hjälp av deras ögonöga och helt enkelt titta på en kryssruta och säga "check it!".

För att aktivera detta måste du använda ögonspecifika EyeTrackingTarget-skript som är oberoende av kärn-MRTK FocusHandlers och kommer att diskuteras ytterligare nedan.

1. Använd allmänna fokus- och pekarhanterare

Om ögonspårning är korrekt konfigurerat (se Grundläggande MRTK-konfiguration för att använda ögonspårning) är det samma sak för användare att välja hologram med ögonen som för andra fokusindata (t.ex. huvudöga eller handstråle). Detta ger den stora fördelen med ett flexibelt sätt att interagera med dina hologram genom att definiera huvudfokustypen i din MRTK-indatapekarprofil beroende på användarens behov, samtidigt som koden lämnas orörd. Detta möjliggör växling mellan huvud- eller ögonögon utan att ändra en kodrad eller ersätta handstrålar med ögoninriktning för avlägsna interaktioner.

Fokusera på ett hologram

Om du vill identifiera när ett hologram är fokuserat använder du gränssnittet "IMixedRealityFocusHandler" som ger dig två gränssnittsmedlemmar: OnFocusEnter och OnFocusExit.

Här är ett enkelt exempel från ColorTap.cs för att ändra ett holograms färg när du tittar på.

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

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

Välja ett fokuserat hologram

Om du vill välja ett fokuserat hologram använder du PointerHandler för att lyssna efter indatahändelser för att bekräfta en markering. Om du till exempel lägger till IMixedRealityPointerHandler kommer de att reagera på enkla pekarindata. Gränssnittet IMixedRealityPointerHandler kräver att följande tre gränssnittsmedlemmar implementeras: OnPointerUp, OnPointerDown och OnPointerClicked.

I exemplet nedan ändrar vi färgen på ett hologram genom att titta på det och nypa eller säga "välj". Den åtgärd som krävs för att utlösa händelsen definieras av eventData.MixedRealityInputAction == selectAction varigenom vi kan ange typen av selectAction i Unity-redigeraren – som standard är det åtgärden "Välj". Typerna av tillgängliga MixedRealityInputActions kan konfigureras i MRTK-profilen via MRTK-konfigurationsprofilen ->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) { }
}

Ögonögonspecifik BaseEyeFocusHandler

Med tanke på att blicken kan skilja sig mycket från andra pekarindata kanske du vill se till att bara reagera på fokusindata om det är ögonöga och det för närvarande är den primära indatapekaren. För det här ändamålet använder du det BaseEyeFocusHandler som är specifikt för ögonspårning och som härleds från BaseFocusHandler. Som tidigare nämnts utlöses den bara om ögonögamål för närvarande är den primära pekarinmatningen (dvs. ingen handstråle är aktiv). Mer information finns i Så här stöder du ögonöga + handgester.

Här är ett exempel från EyeTrackingDemo-03-Navigation (Assets/MRTK/Examples/Demos/EyeTracking/Scenes). I den här demonstrationen finns det två 3D-hologram som kommer att aktiveras beroende på vilken del av objektet som granskas: Om användaren tittar på vänster sida av hologrammet flyttas den delen långsamt mot användarens framsida. Om den högra sidan tittar på, kommer den delen långsamt att röra sig framifrån. Detta är ett beteende som du kanske inte vill ha aktiv hela tiden och även något som du kanske inte vill av misstag utlösas av en handstråle eller huvud blick. Med den anslutna OnLookAtRotateByEyeGaze roterar en GameObject medan du tittar på.

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;

        ...
    }
}

I API-dokumentationen finns en fullständig lista över tillgängliga händelser för BaseEyeFocusHandler:

  • OnEyeFocusStart: Utlöses när ögonögastrålen börjar korsas med målets kolliderare.
  • OnEyeFocusStay: Utlöses medan ögonögastrålen korsar målets kolliderare.
  • OnEyeFocusStop: Utlöses när ögonögastrålen slutar korsa målets kolliderare.
  • OnEyeFocusDwell: Utlöses när ögonögastrålen har korsats med målets kolliderare under en angiven tid.

2. Oberoende ögon-blick-specifika EyeTrackingTarget

Slutligen ger vi dig en lösning som låter dig behandla ögonbaserade indata helt oberoende av andra fokuspekare via skriptet EyeTrackingTarget .

Detta har tre fördelar:

  • Du kan se till att hologrammet bara reagerar på användarens ögonöga.
  • Detta är oberoende av de aktiva primära indata. Därför kan du bearbeta flera indata samtidigt, till exempel genom att kombinera snabb ögoninriktning med handgester.
  • Flera Unity-händelser har redan konfigurerats för att göra det snabbt och enkelt att hantera och återanvända befintliga beteenden från Unity-redigeraren eller via kod.

Det finns också några nackdelar:

  • Mer arbete med att hantera separata indata individuellt.
  • Ingen elegant försämring: Det stöder bara ögoninriktning. Om ögonspårning inte fungerar behöver du ytterligare en reserv.

På samma sätt som BaseFocusHandler är EyeTrackingTarget redo med flera ögonspecifika Unity-händelser som du enkelt kan lyssna på antingen via Unity-redigeraren (se exemplet nedan) eller genom att använda AddListener() i kod:

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

I följande avsnitt går vi igenom några exempel på hur du använder EyeTrackingTarget.

Exempel # 1: Ögonstödda smarta meddelanden

I EyeTrackingDemo-02-TargetSelection (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) kan du hitta ett exempel på "smarta uppmärksamma meddelanden" som reagerar på din blick. Det här är 3D-textrutor som kan placeras i scenen och som smidigt förstorar och vänder sig mot användaren när man tittar på för att underlätta läsbarheten. Medan användaren läser meddelandet visas informationen tydligt och tydligt. När du har läst det och tittat bort från meddelandet kommer meddelandet automatiskt att stängas och tonas ut. För att uppnå allt detta finns det några allmänna beteendeskript som inte är specifika för ögonspårning alls, till exempel:

Fördelen med den här metoden är att samma skript kan återanvändas av olika händelser. Ett hologram kan till exempel börja vändas mot användaren baserat på ett röstkommando eller när du har tryckt på en virtuell knapp. Om du vill utlösa dessa händelser kan du bara referera till de metoder som ska köras i skriptet EyeTrackingTarget som är kopplat till ditt GameObject.

I exemplet med "smarta uppmärksamma meddelanden" händer följande:

  • OnLookAtStart(): Meddelandet börjar...

    • FaceUser.Engage: ... vända dig mot användaren.
    • ChangeSize.Engage: ... öka i storlek (upp till en angiven maximal skala).
    • BlendOut.Engage: ... börjar smälta in mer (efter att ha varit i ett mer subtilt inaktivt tillstånd).
  • OnDwell(): Informerar BlendOut-skriptet om att meddelandet har granskats tillräckligt.

  • OnLookAway(): Meddelandet börjar...

    • FaceUser.Disengage: ... tillbaka till dess ursprungliga orientering.
    • ChangeSize.Disengage: ... minska tillbaka till sin ursprungliga storlek.
    • BlendOut.Disengage: ... börjar smälta ut – Om OnDwell() utlöstes blandar du ut helt och förstör, annars tillbaka till dess inaktiva tillstånd.

Designövervägande: Nyckeln till en trevlig upplevelse här är att noggrant justera hastigheten för något av dessa beteenden för att undvika att orsaka obehag genom att reagera på användarens ögonöga för snabbt hela tiden. Annars kan detta snabbt kännas extremt överväldigande.

Målmeddelande

Exempel 2: Holografisk pärla roterar långsamt när du tittar på den

I likhet med exempel nr 1 kan vi enkelt skapa en hovringsfeedback för våra holografiska gems i EyeTrackingDemo-02-TargetSelection (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) scen som långsamt roterar i konstant riktning och med konstant hastighet (till skillnad från rotationsexemplet ovan) när vi tittar på. Allt du behöver är att utlösa rotationen av den holografiska pärlan från Händelsen EyeTrackingTargetsWhileLookingAtTarget(). Här följer några fler detaljer:

  1. Skapa ett allmänt skript som innehåller en offentlig funktion för att rotera det GameObject som det är kopplat till. Nedan visas ett exempel från RotateWithConstSpeedDir.cs där vi kan justera rotationsriktningen och hastigheten från 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. Lägg till skriptet i EyeTrackingTarget målet GameObject och referera till funktionen RotateTarget() i UnityEvent-utlösaren enligt skärmbilden nedan:

    EyeTrackingTarget-exempel

Exempel #3: Pop dessa gems aka multi-modal eye-gaze-supported target selection

I föregående exempel har vi visat hur enkelt det är att identifiera om ett mål granskas och hur du utlöser en reaktion på det. Nu ska vi få ädelstenarna att explodera med hjälp av händelsen OnSelected() från EyeTrackingTarget. Den intressanta delen är hur valet utlöses. Gör EyeTrackingTarget det möjligt att snabbt tilldela olika sätt att anropa ett val:

  • Nyp gest: Om du ställer in "Välj åtgärd" på "Välj" används standardhandgesten för att utlösa markeringen. Det innebär att användaren helt enkelt kan höja handen och nypa ihop tummen och pekfingret för att bekräfta valet.

  • Säg "Välj": Använd standardröstkommandot "Välj" för att välja ett hologram.

  • Säg "Explode" eller "Pop": Om du vill använda anpassade röstkommandon måste du följa två steg:

    1. Konfigurera en anpassad åtgärd som "DestroyTarget"

      • Gå till MRTK –> Indata –> Indataåtgärder
      • Klicka på "Lägg till en ny åtgärd"
    2. Konfigurera röstkommandon som utlöser den här åtgärden, till exempel "Explode" eller "Pop"

      • Gå till MRTK –> Indata –> Tal
      • Klicka på "Lägg till ett nytt talkommando"
        • Associera åtgärden som du nyss skapade
        • Tilldela en KeyCode för att utlösa åtgärden via en knapptryckning

Röstkommandon EyeTrackingTarget-exempel

När en pärla väljs exploderar den, vilket gör ett ljud och försvinner. Detta hanteras av skriptet HitBehaviorDestroyOnSelect . Du kan välja mellan två alternativ:

  • I Unity-redigeraren: Du kan helt enkelt länka skriptet som är kopplat till var och en av våra gem-mallar till Händelsen OnSelected() Unity i Unity-redigeraren.
  • I kod: Om du inte vill dra och släppa GameObjects kan du också lägga till en händelselyssnare direkt i skriptet.
    Här är ett exempel på hur vi gjorde det i skriptet HitBehaviorDestroyOnSelect :
/// <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
    }
}

Exempel nr 4: Använd handstrålar och ögonögainmatning tillsammans

Handstrålar prioriteras framför huvud- och ögonögonmål. Detta innebär, om handstrålar är aktiverade, så fort händerna kommer i sikte, kommer handstrålen att fungera som den primära pekaren. Det kan dock finnas situationer där du vill använda handstrålar samtidigt som du identifierar om en användare tittar på ett visst hologram. Lätt! I princip behöver du två steg:

1. Aktivera handstrålen: Om du vill aktivera handstrålen går du till Mixed Reality Toolkit –> Indata –> Pekare. I EyeTrackingDemo-00-RootScene där Mixed Reality Toolkit har konfigurerats en gång för alla demoscener för ögonspårning bör du se EyeTrackingDemoPointerProfile. Du kan antingen skapa en ny indataprofil från grunden eller anpassa den aktuella ögonspårningen:

  • Från grunden: På fliken Pekare väljer du DefaultMixedRealityInputPointerProfile på snabbmenyn. Det här är standardpekarprofilen som redan har handstrålen aktiverad! Om du vill ändra standardmarkören (en ogenomskinlig vit punkt) klonar du bara profilen och skapar en egen anpassad pekarprofil. Ersätt sedan DefaultCursor med EyeGazeCursor under Gaze Cursor Prefab.
  • Baserat på den befintliga EyeTrackingDemoPointerProfile: Dubbelklicka på EyeTrackingDemoPointerProfile och lägg till följande post under Pekaralternativ:
    • Typ av kontrollant: "Ledad hand", "Windows Mixed Reality"
    • Handedness: Någon
    • Prefab för pekare: DefaultControllerPointer

2. Identifiera att ett hologram granskas: Använd skriptet EyeTrackingTarget för att aktivera identifiering av att ett hologram granskas enligt beskrivningen ovan. Du kan också ta en titt på exempelskriptet FollowEyeGaze för inspiration eftersom det här visar ett hologram som följer din blick (t.ex. en markör) oavsett om handstrålar är aktiverade eller inte.

När du startar demoscenerna för ögonspårning bör du se en stråle komma från dina händer. I målvalsdemo för ögonspårning följer till exempel den halvtransparent cirkeln fortfarande din blick och gems svarar på om de ses på eller inte, medan de översta scenmenyknapparna använder den primära indatapekaren (dina händer) istället.


Tillbaka till "Ögonspårning i MixedRealityToolkit"