Výběr cíle s podporou očí – MRTK2

MRTK

Tato stránka popisuje různé možnosti přístupu k datům pohledů o očích a událostí specifických pro výběr cílů v MRTK. Sledování očí umožňuje rychlý a snadný výběr cíle pomocí kombinace informací o tom, co uživatel sleduje, s dalšími vstupy, jako je sledování rukou a hlasové příkazy:

  • Look & Say "Select" (Vybrat) (výchozí hlasový příkaz)
  • Look & Say "Explode" nebo "Pop" (vlastní hlasové příkazy)
  • Look & bluetooth button
  • Podívejte se & Stažení prstů (tj. zvedněte ruku před sebou a spojte palec a ukazováček).

Pokud chcete vybrat holografický obsah pohledem, máte několik možností:

1. Použijte primární ukazatel fokusu:

To se dá chápat jako prioritní kurzor. Pokud jsou ruce ve výchozím nastavení v pohledu, jedná se o paprsky rukou. Pokud nejsou v zobrazení žádné ruce, bude prioritním ukazatelem pohled na hlavu nebo oči. Proto mějte na paměti, že na základě aktuálního návrhu je hlava nebo pohled z očí potlačen jako kurzorový vstup, pokud jsou použity paprsky rukou.

Příklad:

Uživatel chce vybrat vzdálené holografické tlačítko. Jako vývojář chcete poskytnout flexibilní řešení, které uživateli umožní provádět tyto úlohy za různých podmínek:

  • Přejděte k tlačítku a šťouchte ho
  • Podívejte se na ni z dálky a řekněte "select" (vybrat).
  • Zaměřte tlačítko pomocí ručního paprsku a proveďte stažení prstů. V tomto případě je nejflexičnějším řešením použití obslužné rutiny primárního fokusu, která vás upozorní vždy, když aktuálně prioritní primární ukazatel fokusu aktivuje událost. Upozorňujeme, že pokud jsou zapnuté paprsky rukou, je ukazatel fokusu hlavy nebo pohledu zakázán ihned po zobrazení rukou.

Důležité

Upozorňujeme, že pokud jsou zapnuté paprsky rukou, je ukazatel fokusu hlavy nebo pohledu zakázán ihned po zobrazení rukou. Pokud chcete podporovat interakci "vzhled a stažení prstů", musíte zakázat paprsek ruky. V našich ukázkových scénách sledování očí jsme zakázali paprsek ruky, aby bylo možné zobrazit bohatší interakce pomocí očí a pohybu rukou – viz například umístění podporované zrakem.

2. Používejte jak oční fokus, tak paprsky rukou současně:

V některých případech můžete chtít být konkrétnější, jaký typ ukazatelů fokusu může aktivovat určité události a umožnit současné použití více technik vzdálené interakce.

Příklad: Ve vaší aplikaci může uživatel pomocí paprsků vzdálené ruky manipulovat s některými holografickými mechanickými nastaveními – například uchopit a podržet některé vzdálené části holografického motoru a podržet je na místě. Při tom musí uživatel projít řadu pokynů a zaznamenat svůj postup zaškrtnutím některých políček. Pokud uživatel nemá ruce zaneprázdněné, bylo by instinktivní jednoduše se ho dotknout zaškrtávacího políčka nebo ho vybrat pomocí paprsku ruky. Pokud má však uživatel ruce zaneprázdněné, jako v našem případě drží některé části holografického motoru na místě, chcete uživateli umožnit bezproblémové procházení pokynů pohledem očima a jednoduše se podívat na zaškrtávací políčko a říct "check it!" (zaškrtněte to)."

Pokud to chcete povolit, musíte použít skript EyeTrackingTarget specifický pro oči, který je nezávislý na základních rutinách MRTK FocusHandlers a bude popsán níže.

1. Použití obecných obslužných rutin fokusu a ukazatele

Pokud je sledování očí nastaveno správně (viz Základní nastavení MRTK pro používání sledování očí), je možnost uživatelů vybírat hologramy pomocí očí stejné jako u jakéhokoli jiného vstupu zaostření (např. pohled hlavou nebo paprsek ruky). To poskytuje velkou výhodu flexibilního způsobu interakce s hologramy definováním typu hlavního fokusu v profilu vstupního ukazatele MRTK v závislosti na potřebách uživatele a ponecháním kódu beze změny. To umožňuje přepínat mezi hlavou nebo pohledem na oči beze změny řádku kódu nebo nahradit paprsky rukou za zacílení očí pro dalekou interakci.

Zaměření na hologram

Pokud chcete zjistit, kdy je fokus hologramu, použijte rozhraní IMixedRealityFocusHandler , které poskytuje dva členy rozhraní: OnFocusEnter a OnFocusExit.

Tady je jednoduchý příklad ze souboru ColorTap.cs , jak změnit barvu hologramu při zobrazení.

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

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

Výběr hologramu s fokusem

Pokud chcete vybrat hologram s fokusem, použijte PointerHandler k naslouchání vstupním událostem a potvrďte výběr. Například přidání IMixedRealityPointerHandler způsobí, že budou reagovat na jednoduchý vstup ukazatele. Rozhraní IMixedRealityPointerHandler vyžaduje implementaci následujících tří členů rozhraní: OnPointerUp, OnPointerDown a OnPointerClicked.

V následujícím příkladu změníme barvu hologramu tak, že se na něj podíváme a rozštípíme nebo řekneme "vybrat". Požadovaná akce pro aktivaci události je definovaná tak eventData.MixedRealityInputAction == selectAction , že v Unity Editoru můžeme nastavit typ objektu selectAction – ve výchozím nastavení je to akce "Select". Typy dostupných MixedRealityInputActions je možné nakonfigurovat v profilu MRTK prostřednictvím konfiguračního profilu MRTK ->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) { }
}

BaseEyeFocusHandler specifický pro oči

Vzhledem k tomu, že pohled očima se může velmi lišit od jiných vstupů ukazatele, můžete chtít, aby reagoval na vstup fokusu pouze v případě, že se jedná o pohled očima a je aktuálně primárním vstupním ukazatelem. K tomuto účelu byste použili , BaseEyeFocusHandler která je specifická pro sledování očí a která je odvozená z .BaseFocusHandler Jak už bylo zmíněno dříve, aktivuje se pouze v případě, že zaměření pohledu na oči je aktuálně primárním vstupem ukazatele (tj. není aktivní žádný paprsek ruky). Další informace najdete v tématu Jak podporovat pohled na oči a gesta rukou.

Tady je příklad z EyeTrackingDemo-03-Navigation :Assets/MRTK/Examples/Demos/EyeTracking/Scenes. V této ukázce jsou dva 3D hologramy, které se zapínají v závislosti na tom, na kterou část objektu se dívá: Pokud se uživatel podívá na levou stranu hologramu, bude se tato část pomalu pohybovat směrem dopředu směrem k uživateli. Pokud se podíváte na pravou stranu, bude se tato část pomalu přesouvat vpředu. Jedná se o chování, které nemusíte chtít mít aktivní po celou dobu, a také něco, co možná nechcete, aby se omylem aktivovalo ručním paprskem nebo pohledem hlavou. OnLookAtRotateByEyeGaze Po připojení se Objekt GameObject při hledáku otočí.

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;

        ...
    }
}

Úplný seznam dostupných událostí pro rozhraní API najdete v dokumentaci k BaseEyeFocusHandlerrozhraní API:

  • OnEyeFocusStart: Aktivuje se, jakmile se paprsky očí začnou protínat s uchličovačem tohoto cíle.
  • OnEyeFocusStay: Aktivuje se, když se paprsky pohledu protínají s uchličovačem tohoto cíle.
  • OnEyeFocusStop: Aktivuje se, jakmile se paprsky očí přestanou protínat s uchličovačem tohoto cíle.
  • OnEyeFocusDwell: Aktivuje se, jakmile se paprsky pohledu protínají s uchycením tohoto cíle po určitou dobu.

2. Nezávislý pohled eyeTrackingTarget

Nakonec vám poskytneme řešení, které vám prostřednictvím skriptu umožní zpracovávat vstup založený na očích zcela nezávisle na ostatních ukazatelích fokusu EyeTrackingTarget .

To má tři výhody:

  • Můžete se ujistit, že hologram reaguje pouze na pohled uživatele.
  • To je nezávislé na aktuálně aktivním primárním vstupu. Proto můžete zpracovat více vstupů najednou – například kombinací rychlého zacílení zrakem s gesty rukou.
  • Několik událostí Unity už bylo nastaveno tak, aby bylo rychlé a pohodlné zpracovávat a opakovaně používat existující chování v Unity Editoru nebo prostřednictvím kódu.

Má to také několik nevýhod:

  • Větší úsilí při individuálním zpracování samostatných vstupů.
  • Žádné elegantní snížení výkonu: Podporuje pouze cílení na oči. Pokud sledování očí nefunguje, budete potřebovat další náhradní řešení.

Podobně jako BaseFocusHandler je EyeTrackingTarget připravený s několika událostmi Unity specifickými pro pohled, které si můžete pohodlně poslechnout buď prostřednictvím Unity Editoru (viz příklad níže), nebo pomocí addListener() v kódu:

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

V následujícím příkladu vás provedeme několika příklady použití EyeTrackingTarget.

Příklad č. 1: Inteligentní oznámení s podporou očí

V EyeTrackingDemo-02-TargetSelection souboru (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) najdete příklad inteligentních pozorných oznámení , která reagují na pohled očí. Jedná se o 3D textová pole, která se dají umístit do scény a která se při hledění hladce zvětší a otočí směrem k uživateli, aby se usnadnila čitelnost. Během čtení oznámení se informace zobrazují jasně a jasně. Po přečtení a odhlédnutí od oznámení se oznámení automaticky zavře a zmizí. Abyste toho všeho dosáhli, existuje několik obecných skriptů chování, které vůbec nejsou specifické pro sledování očí, například:

Výhodou tohoto přístupu je, že stejné skripty mohou být opakovaně používány různými událostmi. Hologram může například začít směřovat k uživateli na základě hlasových příkazů nebo po stisknutí virtuálního tlačítka. Chcete-li aktivovat tyto události, můžete jednoduše odkazovat na metody, které by měly být provedeny ve EyeTrackingTarget skriptu, který je připojen k vašemu Objektu GameObject.

V příkladu inteligentních pozorných oznámení se stane toto:

  • OnLookAtStart(): Oznámení začne...

    • FaceUser.Engage: ... otočit směrem k uživateli.
    • ChangeSize.Engage: ... zvětšení velikosti (až do zadaného maximálního měřítka)
    • BlendOut.Engage: ... začne více splynout (po jemnější nečinnosti).
  • OnDwell(): Informuje skript BlendOut , že oznámení bylo dostatečně prohlédnutí.

  • OnLookAway(): Oznámení začne...

    • FaceUser.Disengage: ... zpět na původní orientaci.
    • ChangeSize.Disengage: ... zmenšit zpět na původní velikost.
    • BlendOut.Disengage: ... začne splynout – pokud se aktivuje onDwell(), úplně se promíchá a zničí, jinak se vrátí do stavu nečinnosti.

Aspekty návrhu: Klíčem k příjemnému prostředí je pečlivě vyladit rychlost jakéhokoli z těchto chování, abyste se vyhnuli nepohodlí tím, že budete reagovat na pohled uživatele příliš rychle po celou dobu. Jinak se to může rychle zdát velmi ohromující.

Cílové oznámení

Příklad č. 2: Holografický gem se při pohledu na něj otáčí pomalu.

Podobně jako v příkladu č. 1 můžeme snadno vytvořit zpětnou vazbu k najetí myší pro naše holografické drahokamy ve EyeTrackingDemo-02-TargetSelection scéně (Assets/MRTK/Examples/Demos/EyeTracking/Scene), která se bude pomalu otáčet v konstantním směru a konstantní rychlostí (na rozdíl od výše uvedeného příkladu otočení). Vše, co potřebujete, je aktivovat rotaci holografického gemu z události WhileLookingAtTarget()eyeTrackingTarget(). Tady je několik dalších podrobností:

  1. Vytvořte obecný skript, který obsahuje veřejnou funkci pro otáčení objektu GameObject, ke kterému je připojený. Níže je příklad z souboru RotateWithConstSpeedDir.cs , kde můžeme upravit směr a rychlost otáčení z Unity Editoru.

    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. Přidejte skript do cílového objektu EyeTrackingTarget GameObject a odkazujte na funkci RotateTarget() v triggeru UnityEvent, jak je znázorněno na následujícím snímku obrazovky:

    Ukázka EyeTrackingTarget

Příklad č. 3: Zasunutí těchto drahokamů neboli multimodální výběr cíle s podporou zrakového pohledu

V předchozím příkladu jsme ukázali, jak snadné je zjistit, jestli se na cíl dívá, a jak na něj aktivovat reakci. Dále pojďme, aby drahokamy explodovaly pomocí události OnSelected() z EyeTrackingTarget. Zajímavá část je , jak se výběr aktivuje. Umožňuje EyeTrackingTarget rychlé přiřazení různých způsobů vyvolání výběru:

  • Gesto stažení prstů: Při nastavení možnosti Vybrat akci na Vybrat se výběr aktivuje pomocí výchozího gesta rukou. To znamená, že uživatel může jednoduše zvednout ruku a stažením palce a ukazováčku k sobě potvrdit výběr.

  • Řekněte "Vybrat": Pro výběr hologramu použijte výchozí hlasový příkaz "Vybrat" .

  • Řekněte "Explode" nebo "Pop": Pokud chcete použít vlastní hlasové příkazy, musíte provést dva kroky:

    1. Nastavení vlastní akce, například DestroyTarget

      • Přechod na MRTK –> Vstup –> Vstupní akce
      • Klikněte na Přidat novou akci.
    2. Nastavte hlasové příkazy, které tuto akci aktivují, například "Explodovat" nebo "Pop".

      • Přechod na MRTK –> Vstup –> Řeč
      • Klikněte na Přidat nový hlasový příkaz.
        • Přidružení akce, kterou jste právě vytvořili
        • Přiřazení klíče , který umožní aktivaci akce stisknutím tlačítka

Ukázka hlasových příkazů EyeTrackingTarget

Když je vybrán drahokam, vybuchne, vytvoří zvuk a zmizí. O to se stará HitBehaviorDestroyOnSelect skript. Máte dvě možnosti:

  • V Unity Editoru: Skript, který je připojený ke každé z našich šablon gemů, můžete jednoduše propojit s událostí Unity OnSelected() v Unity Editoru.
  • V kódu: Pokud nechcete objekty GameObjects přetahovat, můžete také jednoduše přidat naslouchací proces událostí přímo do skriptu.
    Tady je příklad toho, jak jsme to udělali HitBehaviorDestroyOnSelect ve skriptu:
/// <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
    }
}

Příklad č. 4: Společné použití paprsků rukou a pohledu

Paprsky rukou mají přednost před zacílením pohledu na hlavu a oči. To znamená, že pokud jsou povoleny paprsky rukou, v okamžiku, kdy ruce přijdou na pohled, bude paprsek ruky fungovat jako primární ukazatel. Mohou však nastat situace, kdy budete chtít používat paprsky rukou a přitom stále zjišťovat, jestli se uživatel dívá na určitý hologram. Snadné! V podstatě potřebujete dva kroky:

1. Povolit paprsek ruky: Chcete-li povolit paprsek ruky, přejděte na Mixed Reality Toolkit -> Vstup -> Ukazatele. V EyeTrackingDemo-00-RootScene, kde je sada Mixed Reality Toolkit nakonfigurovaná jednou pro všechny ukázkové scény sledování očí, byste měli vidět soubor EyeTrackingDemoPointerProfile. Můžete buď vytvořit nový vstupní profil od začátku, nebo přizpůsobit aktuální profil sledování očí:

  • Úplně od začátku: Na kartě Ukazatele vyberte z místní nabídky soubor DefaultMixedRealityInputPointerProfile . Toto je výchozí profil ukazatele, který už má zapnutý paprsek ruky! Pokud chcete změnit výchozí kurzor (neprůkaznou bílou tečku), jednoduše naklonujte profil a vytvořte vlastní profil ukazatele. Potom v části Prefab kurzoru pohledu nahraďte DefaultCursor hodnotou EyeGazeCursor.
  • Na základě existujícího souboru EyeTrackingDemoPointerProfile: Poklikejte na eyeTrackingDemoPointerProfile a v části Možnosti ukazatele přidejte následující položku:
    • Typ kontroleru: "Artikulovaná ruka", "Windows Mixed Reality"
    • Rukou: Libovolný
    • Prefab ukazatele: DefaultControllerPointer

2. Zjištění, že se dívá na hologram: Pomocí EyeTrackingTarget skriptu můžete zjistit, že se na hologram díváte, jak je popsáno výše. Můžete se FollowEyeGaze také inspirovat ukázkovým skriptem, který ukazuje hologram za pohledem očí (například kurzorem), ať už jsou paprsky ruky povolené nebo ne.

Teď, když spustíte ukázkové scény sledování očí, měli byste vidět paprsek přicházející z vašich rukou. Například v ukázce výběru cíle sledování očí je poloprůhledný kruh stále za vaším pohledem a drahokamy reagují na to, zda se na ně díváte, nebo ne, zatímco tlačítka nabídky horní scény používají primární vstupní ukazatel (vaše ruce).


Zpět na "Sledování očí v mixedrealityToolkit"