Szem által támogatott cél kiválasztása – MRTK2

MRTK

Ez az oldal a szem tekintetadatokhoz való hozzáférésének különböző lehetőségeit ismerteti, valamint a szemszemekre vonatkozó eseményeket, amelyek céljait az MRTK-ban választja ki. A szemkövetés lehetővé teszi a gyors és könnyű célkiválasztást a felhasználó által a további bemenetekkel, például a kézkövetéssel és a hangparancsokkal kapcsolatos információk kombinációjával:

  • Nézze meg & Say "Select" (alapértelmezett hangparancs)
  • Nézd meg & Say "Explode" vagy "Pop" (egyéni hangparancsok)
  • & Bluetooth-gomb megjelenítése
  • Nézd meg & Csippentés (azaz tartsa a kezét előtted, és hozza össze a hüvelykujját és a mutatóujját)

A holografikus tartalom szempillantásos kiválasztásához több lehetőség is rendelkezésre áll:

1. Használja az elsődleges fókuszmutatót:

Ezt a kurzort a rangsorban meghatározott kurzorként értelmezhetjük. Alapértelmezés szerint, ha a kezek nézetben vannak, akkor ez a kéz sugarai. Ha nincs kéz a nézetben, akkor a rangsorban szereplő mutató a fej vagy a szem tekintete lesz. Ezért vegye figyelembe, hogy a jelenlegi kialakítás alapján a fej vagy a szem tekintete el van tiltva kurzor bemenetként, ha kézi sugarakat használ.

Például:

A felhasználó egy távoli holografikus gombot szeretne kiválasztani. Fejlesztőként olyan rugalmas megoldást szeretne biztosítani, amely lehetővé teszi a felhasználó számára, hogy ezeket a feladatokat különböző feltételek mellett hajtsa végre:

  • Lépjen fel a gombra, és szúrja be
  • Nézze meg távolról, és mondja ki a "select" szót
  • A gomb megcélzása kézi sugár használatával és csippentés végrehajtása Ebben az esetben a legrugalmasabb megoldás az elsődleges fókuszkezelő használata, mivel az értesítést küld, amikor az aktuálisan rangsorban lévő elsődleges fókuszmutató eseményt aktivál. Vegye figyelembe, hogy ha a kéz sugarai engedélyezve vannak, a fej vagy a szem tekintetének fókuszmutatója le lesz tiltva, amint a kezek a nézetbe kerülnek.

Fontos

Vegye figyelembe, hogy ha a kéz sugarai engedélyezve vannak, a fej vagy a szem tekintetének fókuszmutatója le lesz tiltva, amint a kezek a nézetbe kerülnek. Ha támogatni szeretné a "megjelenés és csippentés" interakciót, le kell tiltania a kézi sugarat. A szemkövetési mintajeleneteinkben letiltottuk a kézsugarat, hogy a szemek és a kézmozdulások használatával gazdagabb interakciókat jelenítsünk meg – lásd például a szem által támogatott pozicionálást.

2. Egyidejűleg használja a szemfókuszt és a kéz sugarait is:

Előfordulhatnak olyan példányok, ahol pontosabban szeretné megállapítani, hogy mely típusú fókuszmutatók aktiválhatnak bizonyos eseményeket, és lehetővé teszik több távoli interakciós technika egyidejű használatát.

Például: Az alkalmazásban a felhasználó távoli sugarakkal manipulálhat néhány holografikus mechanikus beállítást , például megragadhat és visszatarthat néhány távoli holografikus motorrészt, és a helyén tarthatja őket. Ennek során a felhasználónak végig kell mennie néhány utasításon, és rögzítenie kell az előrehaladását bizonyos jelölőnégyzetek jelölésével. Ha a felhasználó nem foglalt a kezével, ösztönös lenne egyszerűen megérinteni a jelölőnégyzetet, vagy kézi sugár használatával kijelölni. Ha azonban a felhasználónak elfoglalt a keze, mint a mi esetünkben, holografikus motoralkatrészeket tart a helyén, lehetővé szeretné tenni a felhasználó számára, hogy zökkenőmentesen görgessen végig az utasításokon a szemük tekintetével, és egyszerűen nézze meg a jelölőnégyzetet, és mondja ki a "check it!".

Ennek engedélyezéséhez szemspecifikus EyeTrackingTarget-szkriptet kell használnia, amely független az alapvető MRTK FocusHandlerektől, és az alábbiakban tárgyaljuk.

1. Általános fókusz- és mutatókezelők használata

Ha a szemkövetés megfelelően van beállítva (lásd: Alapszintű MRTK beállítás a szemkövetés használatához), a hologramok a szemük használatával történő kiválasztásának engedélyezése a felhasználók számára ugyanaz, mint bármely más fókuszbemenetnél (például a fej tekintete vagy a kézi sugár). Ez a hologramok rugalmas kezelésének nagy előnye, hogy meghatározza a fő fókusztípust az MRTK bemeneti mutatóprofiljában a felhasználó igényeitől függően, miközben a kód érintetlen marad. Ez lehetővé teszi, hogy váltson a fej vagy a szem tekintete között anélkül, hogy módosítana egy kódsort, vagy lecseréli a kézsugarakat a szemcélzásra a távoli interakciókhoz.

Hologramra való összpontosítás

A hologramok fókuszált állapotának észleléséhez használja az IMixedRealityFocusHandler felületet, amely két felülettagot biztosít: Az OnFocusEnter és az OnFocusExit.

Íme egy egyszerű példa a ColorTap.cs fájlból a hologram színének módosítására, amikor megtekintik.

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

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

Szűrt hologram kiválasztása

A szűrt hologram kiválasztásához a PointerHandlerrel figyelheti a bemeneti eseményeket a kijelölés megerősítéséhez. Az IMixedRealityPointerHandler hozzáadásával például reagálni fognak az egyszerű mutatóbemenetre. Az IMixedRealityPointerHandler felülethez a következő három felülettagot kell implementálni: OnPointerUp, OnPointerDown és OnPointerClicked.

Az alábbi példában a hologram színét úgy módosítjuk, hogy megnézzük, majd csippentjük vagy kimondjuk a "select" (kiválasztás) szöveget. Az esemény aktiválásához szükséges műveletet az határozza eventData.MixedRealityInputAction == selectAction meg, hogy a Unity-szerkesztőben milyen típusú selectAction műveletet tudunk beállítani – alapértelmezés szerint ez a "Kiválasztás" művelet. A rendelkezésre álló MixedRealityInputActions típusok az MRTK-profilban konfigurálhatók az MRTK konfigurációs profil -Bemenet ->>Bemeneti műveletek segítségével.

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) { }
}

Szem-tekintet-specifikus BaseEyeFocusHandler

Tekintettel arra, hogy a szem tekintete nagyon eltérő lehet a többi mutató bemenetétől, érdemes lehet csak akkor reagálni a fókusz bemenetére, ha szemnézésről van szó, és jelenleg ez az elsődleges bemeneti mutató. Erre a célra a BaseEyeFocusHandler szemkövetésre BaseFocusHandlerjellemző és a . Ahogy korábban említettük, csak akkor aktiválódik, ha a szem tekintete jelenleg az elsődleges mutató bemenete (azaz nincs aktív kézi sugár). További információ : A szempillantás és kézmozdulatok támogatása.

Íme egy példa ( EyeTrackingDemo-03-Navigation Assets/MRTK/Examples/Demos/EyeTracking/Scenes). Ebben a bemutatóban két 3D-s hologram jelenik meg attól függően, hogy az objektum melyik részét nézi meg: Ha a felhasználó a hologram bal oldalára néz, akkor az a rész lassan halad a felhasználóval szemben álló előtér felé. Ha a jobb oldalt néztem, akkor ez a rész lassan halad előre. Ez egy olyan viselkedés, amelyet nem feltétlenül szeretne folyamatosan aktívvá tenni, és olyan dolgot is, amelyet nem szeretne véletlenül aktiválni egy kézi sugár vagy a fej tekintete által. Miután a OnLookAtRotateByEyeGaze csatolt, a GameObject fog forogni, miközben néztem.

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;

        ...
    }
}

Tekintse meg az API dokumentációjában a rendelkezésre álló események teljes listáját:BaseEyeFocusHandler

  • OnEyeFocusStart: Akkor aktiválódik, amikor a szemsugár elkezd metszeni ennek a célpontnak a ütközőjével.
  • OnEyeFocusStay: Akkor aktiválódik, amikor a szemsugár keresztezi ennek a célpontnak a ütközőjét.
  • OnEyeFocusStop: Akkor aktiválódik, ha a szemsugár nem metszik egymást a célpont ütközőjével.
  • OnEyeFocusDwell: Akkor aktiválódik, ha a szempillantó sugara egy adott ideig kereszteződött a célütközőjével.

2. Független szem-tekintet-specifikus EyeTrackingTarget

Végül egy olyan megoldást biztosítunk, amely lehetővé teszi, hogy a szkripttel teljesen függetlenül kezelje a szemalapú bemenetet a EyeTrackingTarget többi fókuszmutatótól.

Ennek három előnye van:

  • Győződjön meg arról, hogy a hologram csak a felhasználó tekintetére reagál.
  • Ez független a jelenleg aktív elsődleges bemenettől. Ezért egyszerre több bemenetet is feldolgozhat , például a gyors szem célzást kézmozdulatokkal kombinálva.
  • Számos Unity-esemény már be van állítva, hogy gyors és kényelmes legyen a meglévő viselkedések kezelése és újrafelhasználása a Unity-szerkesztőben vagy kódon keresztül.

Vannak hátrányai is:

  • Nagyobb erőfeszítést igényel a különálló bemenetek egyenkénti kezelése.
  • Nincs elegáns leromlás: Csak a szem célzását támogatja. Ha a szemkövetés nem működik, további tartalékot igényel.

A BaseFocusHandlerhez hasonlóan az EyeTrackingTarget számos szem-tekintetspecifikus Unity-eseményt tartalmaz, amelyeket kényelmesen meghallgathat a Unity-szerkesztőn keresztül (lásd az alábbi példát), vagy az AddListener() használatával a kódban:

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

Az alábbiakban bemutatunk néhány példát az EyeTrackingTarget használatára.

1. példa: Szem által támogatott intelligens értesítések

A EyeTrackingDemo-02-TargetSelection (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) (Eszközök/MRTK/Examples/Demos/EyeTracking/Scenes) területen talál egy példát az "intelligens figyelmes értesítésekre" , amelyek reagálnak a tekintetére. Ezek 3D-s szövegdobozok, amelyek elhelyezhetők a jelenetben, és zökkenőmentesen nagyítják, és a felhasználó felé fordulnak az olvashatóság megkönnyítése érdekében. Miközben a felhasználó elolvassa az értesítést, az információk folyamatosan élesen és tisztán jelennek meg. Az értesítés elolvasása és az értesítéstől való eltávolodása után az értesítés automatikusan el lesz utasítva, és elhalványul. Mindezek eléréséhez van néhány általános viselkedési szkript, amelyek egyáltalán nem specifikusak a szemkövetésre, például:

Ennek a megközelítésnek az az előnye, hogy ugyanazokat a szkripteket különböző események újra felhasználhatják. Előfordulhat például, hogy egy hologram hangparancsok alapján vagy egy virtuális gomb megnyomása után kezdi el a felhasználó felé nézni. Az események aktiválásához egyszerűen hivatkozhat a GameObjecthez csatolt szkriptben EyeTrackingTarget végrehajtandó metódusokra.

Az "intelligens figyelmes értesítések" példájában a következők történnek:

  • OnLookAtStart(): Az értesítés...

    • FaceUser.Engage: ... irányt a felhasználó felé.
    • ChangeSize.Engage: ... méretének növelése (egy megadott maximális méretig).
    • BlendOut.Engage: ... elkezd többbe keveredni (finomabb tétlenségi állapotban).
  • OnDwell(): Tájékoztatja a BlendOut-szkriptet , hogy az értesítést megfelelően megvizsgálták.

  • OnLookAway(): Az értesítés kezdete...

    • FaceUser.Disengage: ... vissza az eredeti tájolásra.
    • ChangeSize.Disengage: ... vissza az eredeti méretére.
    • BlendOut.Disengage: ... elkezdi a keverést – Ha az OnDwell() aktiválódott, keverje ki teljesen, és semmisítse meg, egyébként vissza a tétlen állapotba.

Tervezési szempont: Az élvezetes élmény kulcsa az, hogy gondosan finomhangolja az ilyen viselkedések sebességét, hogy elkerülje a kényelmetlenséget azáltal, hogy túl gyorsan reagál a felhasználó szemének tekintetére. Ellenkező esetben ez nagyon elsöprőnek érezheti magát.

Célértesítés

2. példa: A holografikus drágakő lassan forog, amikor megtekinti

Az 1. példához hasonlóan könnyedén hozhatunk létre rámutatási visszajelzést a holografikus drágaköveinkhez a (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) jelenetben EyeTrackingDemo-02-TargetSelection , amely lassan, állandó irányban és állandó sebességgel forog (a fenti forgatási példával ellentétben), amikor megtekintjük. Mindössze annyit kell tudnia, hogy elindítja a holografikus drágakő elforgatását az EyeTrackingTargetWhileLookingAtTarget() eseményéből. Íme néhány további részlet:

  1. Hozzon létre egy általános szkriptet, amely tartalmaz egy nyilvános függvényt a csatolt GameObject elforgatásához. Az alábbi példa a RotateWithConstSpeedDir.cs fájlból származik, ahol a Unity Szerkesztőből módosíthatjuk a forgatás irányát és sebességét.

    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. Adja hozzá a EyeTrackingTarget szkriptet a cél GameObject elemhez, és hivatkozzon a RotateTarget() függvényre a UnityEvent eseményindítóban az alábbi képernyőképen látható módon:

    EyeTrackingTarget-minta

3. példa: Pop ezeket a drágaköveket, más néven multi-modális szem-tekintet-támogatott cél kiválasztása

Az előző példában bemutattuk, milyen egyszerű észlelni, hogy a célokat megtekintik-e, és hogyan lehet reagálni erre. Következő lépésként robbantsuk fel a drágaköveket a OnSelected() eseményével a EyeTrackingTargetkövetkezőből: . Az érdekes rész az, hogyan aktiválódik a kiválasztás. A EyeTrackingTarget lehetővé teszi a kijelölés meghívásának különböző módjainak gyors hozzárendelését:

  • Csippentés kézmozdulat: Ha a "Művelet kiválasztása" beállítást "Kiválasztás" értékre állítja, az alapértelmezett kézmozdulat aktiválja a kijelölést. Ez azt jelenti, hogy a felhasználó egyszerűen felemelheti a kezét, és összecsukhatja a hüvelykujját és a mutatóujját a kijelölés megerősítéséhez.

  • Mondja ki a "Kiválasztás" parancsot: Hologram kiválasztásához használja az alapértelmezett "Kiválasztás" hangparancsot.

  • Mondja ki a "Robbantás" vagy a "Pop" parancsot: Egyéni hangparancsok használatához két lépést kell követnie:

    1. Egyéni művelet, például "DestroyTarget" beállítása

      • Lépjen az MRTK –> Bemenet –> Bemeneti műveletek elemre
      • Kattintson az "Új művelet hozzáadása" gombra
    2. Állítsa be azokat a hangparancsokat, amelyek aktiválják ezt a műveletet, például "Robbantás" vagy "Pop"

      • Lépjen az MRTK –> Bemenet –> Beszéd elemre
      • Kattintson az "Új beszédfelismerési parancs hozzáadása" elemre
        • Társítsa az imént létrehozott műveletet
        • KeyCode hozzárendelése a művelet gombnyomással történő aktiválásához

Hangparancsok EyeTrackingTarget-minta

Ha egy drágakő van kiválasztva, felrobban, így a hang és eltűnik. Ezt a HitBehaviorDestroyOnSelect szkript kezeli. Erre két lehetősége van:

  • A Unity Szerkesztőben: Egyszerűen csatolhatja az egyes drágaköves sablonjainkhoz csatolt szkriptet a Unity Szerkesztő OnSelected() Unity eseményéhez.
  • Kódban: Ha nem szeretné áthúzni a GameObjects elemet, egyszerűen hozzáadhat egy eseményfigyelőt közvetlenül a szkripthez.
    Íme egy példa arra, hogyan csináltuk a HitBehaviorDestroyOnSelect szkriptben:
/// <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
    }
}

4. példa: A kézi sugarak és a szem tekintetének együttes használata

A kézsugarak elsőbbséget élveznek a fej és a szem szemének célzása felett. Ez azt jelenti, hogy ha a kézsugarak engedélyezve vannak, a kéz képének pillanatában a kézsugár lesz az elsődleges mutató. Előfordulhatnak azonban olyan helyzetek, amikor kézi sugarakat szeretne használni, miközben továbbra is észleli, hogy egy felhasználó egy bizonyos hologramot néz-e. Könnyű! Alapvetően két lépésre van szükség:

1. A kézi sugár engedélyezése: A kézi sugár engedélyezéséhez lépjen Mixed Reality Eszközkészlet –> Bemenet –> Mutatók lapra. Az EyeTrackingDemo-00-RootScene területen, ahol Mixed Reality Toolkit egyszer van konfigurálva az összes szemkövetési bemutató jelenethez, meg kell jelennie az EyeTrackingDemoPointerProfile elemnek. Létrehozhat egy új bemeneti profilt az alapoktól, vagy módosíthatja az aktuális szemkövetést:

  • Semmiből: A Mutatók lapon válassza a DefaultMixedRealityInputPointerProfile elemet a helyi menüből. Ez az alapértelmezett mutatóprofil, amelyen már engedélyezve van a kézi sugár! Az alapértelmezett kurzor (egy átlátszatlan fehér pont) módosításához egyszerűen klónozza a profilt, és hozzon létre egy saját egyéni mutatóprofilt. Ezután cserélje le a DefaultCursor elemet eyeGazeCursor értékre a Tekintetmutató előtagja területen.
  • A meglévő EyeTrackingDemoPointerProfile alapján: Kattintson duplán az EyeTrackingDemoPointerProfile elemre , és adja hozzá a következő bejegyzést a Mutató beállításai területen:
    • Vezérlő típusa: "Csuklós kéz", "Windows Mixed Reality"
    • Kézitás: Bármely
    • Mutató előtagja: DefaultControllerPointer

2. Észlelje, hogy a rendszer megvizsgál egy hologramot: Használja a szkriptet annak EyeTrackingTarget észleléséhez, hogy a hologramot a fent leírtak szerint nézték-e meg. A mintaszkriptből FollowEyeGaze ihletet is meríthet, mivel ez egy hologramot mutat a szem tekintetét (például egy kurzort) követve, hogy engedélyezve vannak-e a kézi sugarak.

Most, amikor elindítja a szemkövető bemutató jeleneteket, látnia kell egy sugarat a kezéből. A szemkövető célválasztási bemutatóban például a félig átlátszó kör továbbra is követi a szem tekintetét, és a drágakövek válaszolnak arra, hogy megtekintik-e őket, vagy sem, míg a felső jelenet menügombjai az elsődleges bemeneti mutatót (a kezét) használják.


Vissza a következőhöz: "Szemkövetés a MixedRealityToolkitban"