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

MRTK

Ez az oldal a szemkitekintési adatok elérésének különböző lehetőségeit ismerteti, és a szemszemek adott eseményeit ismerteti a célértékek MRTK-ban való kiválasztásához. A szemkövetés lehetővé teszi a gyors és könnyű célkiválasztást a felhasználók által a további bemenetekkel, például kézkövetéssel és hangparancsokkal kapcsolatos információk kombinációjával:

  • Look & Say "Select" (alapértelmezett hangparancs)
  • Look & Say "Explode" vagy "Pop" (egyéni hangparancsok)
  • Bluetooth gomb megjelenítése &
  • Nézd & 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ás használatával történő kiválasztásához több lehetőség is rendelkezésre áll:

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

Ez a rangsorban szereplő kurzorként értelmezhető. Alapértelmezés szerint, ha a kezek nézetben vannak, akkor ez kézsugarak. Ha nincs kéz a nézetben, akkor a rangsorban szereplő mutató a fej vagy a szem tekintete lesz. Ezért kérjük, vegye figyelembe, hogy a jelenlegi kialakítás alapján a fej vagy a szem tekintete nem lesz kurzorbemenetként, ha kézi sugarakat használnak.

Például:

A felhasználó távoli holografikus gombot szeretne vá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 értesítést küld, ha a jelenleg rangsorban lévő elsődleges fókuszmutató eseményt aktivál. Vegye figyelembe, hogy ha a kézsugarak engedélyezve vannak, a fej vagy a szem tekintetének fókuszmutatója le lesz tiltva, amint a kéz megjelenik.

Fontos

Vegye figyelembe, hogy ha a kézsugarak engedélyezve vannak, a fej vagy a szem tekintetének fókuszmutatója le lesz tiltva, amint a kéz megjelenik. Ha támogatni szeretné a "megjelenés és csippentés" interakciót, le kell tiltania a kézsugarat. A szemkövetési mintajeleneteinkben letiltottuk a kézsugarat, hogy a szem + 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. Használjon egyszerre szemfókuszt és kézsugarat is:

Előfordulhatnak olyan esetek, amikor pontosabban szeretné megadni, 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 valamilyen holografikus mechanikus beállítást – például megragadhat és visszatarthat néhány távoli holografikus motor alkatré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 néhány jelölőnégyzet bejelö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ézzel kijelölni. Ha azonban a felhasználónak elfoglalt a keze, mint esetünkben néhány holografikus motor alkatrész a helyén, lehetővé szeretné tenni a felhasználó számára, hogy zökkenőmentesen végiggörgetjen az utasításokon a szem 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 részletesebben 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), akkor a felhasználók a szemük használatával választhatnak hologramokat, ugyanaz, mint bármely más fókusz bemenetnél (például fej tekintete vagy kézsugara). Ez nagy előnye, hogy rugalmasan kezelheti a hologramokat azáltal, 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ódot érintetlenül hagyja. Ez lehetővé teszi a váltást 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.

Fókuszban a hologram

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 felületet.

Í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

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ületi tagot 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 "kiválasztás" szót. Az esemény aktiválásához szükséges műveletet az határozza meg eventData.MixedRealityInputAction == selectAction , hogy a Unity-szerkesztőben milyen típusú selectAction műveletet állíthatunk be – alapértelmezés szerint ez a "Kiválasztás" művelet. Az elérhető MixedRealityInputActions típusokat az MRTK-profilban lehet konfigurálni az MRTK konfigurációs profil -Input ->>Input 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 különbözhet a többi mutató bemenetétől, érdemes lehet csak akkor reagálni a fókusz bemenetére, ha az a szem tekintete , és jelenleg ez az elsődleges bemeneti mutató. Erre a célra a szemkövetésre jellemző és BaseFocusHandlera BaseEyeFocusHandler . Ahogy korábban említettük, ez 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ó : Hogyan támogathatja a tekintetet és a kézmozdulatokat.

Í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 ez a rész lassan mozog a felhasználóval szemben álló előtér felé. Ha a jobb oldalt néztem, akkor ez a rész lassan halad az elejére. Ez egy olyan viselkedés, amelyet nem feltétlenül szeretne minden alkalommal aktívnak lennie, és olyan 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 forog, miközben megtekintik.

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át az alábbi események teljes listájáért BaseEyeFocusHandler:

  • OnEyeFocusStart: Akkor aktiválódik, ha a szemkörnyéki sugár elkezd metszeni ennek a célpontnak a ütközőjével.
  • OnEyeFocusStay: Akkor aktiválódik, amikor a szemkörnyéki sugár keresztezi a célpont ütközőjét.
  • OnEyeFocusStop: Akkor aktiválódik, ha a szemkörnyéki sugár nem metszi a célpont ütközőjét.
  • OnEyeFocusDwell: Akkor aktiválódik, ha a szemkörnyéki sugár kereszteződött a célpont ütközőjével egy bizonyos ideig.

2. Független szem-tekintet-specifikus EyeTrackingTarget

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

Ennek három előnye van:

  • Győződjön meg arról, hogy a hologram csak a felhasználó szemére reagál.
  • Ez független a jelenleg aktív elsődleges bemenettől. Így egyszerre több bemenetet is feldolgozhat – például kombinálhatja a gyorsszem-célzást kézmozdulatokkal.
  • Számos Unity-esemény már be van állítva, hogy gyorsan és kényelmesen kezelhesse és újra felhasználhassa a meglévő viselkedéseket 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 lebomlás: Csak a szemcélzást támogatja. Ha a szemkövetés nem működik, további tartalékot kell igényelnie.

A BaseFocusHandlerhez hasonlóan az EyeTrackingTarget számos szemre szabott Unity-eseményt is tartalmaz, amelyeket kényelmesen meghallgathat a Unity Szerkesztőben (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

Az EyeTrackingDemo-02-TargetSelection (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) területen talál egy példát az "intelligens figyelmes értesítésekre" , amelyek reagálnak a szem tekintetére. Ezek olyan térhatású szövegdobozok, amelyek elhelyezhetők a jelenetben, és zökkenőmentesen nagyíthatják és a felhasználó felé fordulnak, amikor megtekintik az olvashatóság megkönnyítése érdekében. Miközben a felhasználó felolvassa 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 eltűnik, és elhalványul. Mindezek eléréséhez van néhány általános viselkedési szkript, amelyek egyáltalán nem jellemzőek 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 szembesül a felhasználóval. 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 kezdete...

    • 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 olvadni (miután finomabb tétlen állapotban van).
  • 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ására.
    • ChangeSize.Disengage: ... vissza az eredeti méretére.
    • BlendOut.Disengage: ... elkezd kiolvadni - Ha az OnDwell() aktiválódott, teljesen elolvad, és megsemmisíti, egyébként vissza a tétlen állapotba.

Kialakítási szempont: Az élvezetes élmény kulcsa, 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.

Target Notification

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

Az 1. példához hasonlóan könnyen létrehozhatunk egy rámutatási visszajelzést a holografikus drágaköveinkhez a (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) jelenetben EyeTrackingDemo-02-TargetSelection , amelyek lassan, állandó irányban és állandó sebességgel forognak (ellentétben a fenti forgatási példával). Mindössze annyit kell tudnia, hogy aktiválja a holografikus drágakő forgatá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 egy nyilvános függvényt tartalmaz 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 forgá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 sample

3. példa: A drágakövek felugrása, más néven több modális szem-tekintet által támogatott cél kiválasztása

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

  • Csippentő kézmozdulat: A "Művelet kiválasztása" beállítás "Kijelölés" értékre állítása az alapértelmezett kézmozdulat használatával aktiválja a kijelölést. Ez azt jelenti, hogy a felhasználó egyszerűen emelje fel a kezét, és csippentse össze 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: A 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 beállítása, például "DestroyTarget"

      • Navigálás az MRTK-hoz –> Bemenet –> Bemeneti műveletek
      • Kattintson az "Új művelet hozzáadása" elemre
    2. Állítsa be azokat a hangparancsokat, amelyek elindítják ezt a műveletet, például a "Robbanás" vagy a "Pop"

      • Navigálás az MRTK-hoz –> Bemenet –> Beszéd
      • Kattintson az "Új beszédparancs hozzáadása" elemre
        • Az imént létrehozott művelet társítása
        • Kulcskód hozzárendelése a művelet aktiválásához gombnyomással

Voice commands EyeTrackingTarget sample

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

  • A Unity Szerkesztőben: Egyszerűen csatolhatja az egyes gemsablonokhoz csatolt szkriptet az OnSelected() Unity eseményhez a Unity Szerkesztőben.
  • Kódban: Ha nem szeretné áthúzni a GameObjects objektumokat, 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: Kézsugarak és szempillantás 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, abban a pillanatban, amikor a kezek megjelennek, 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 elemre. Az EyeTrackingDemo-00-RootScene-ben, ahol a Mixed Reality Eszközkészlet egyszer van konfigurálva az összes szemkövetési bemutató jelenethez, látnia kell az EyeTrackingDemoPointerProfile-t. 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 (á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 helyére az EyeGazeCursor elemet a Gaze Cursor Prefab 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"
    • Kezűség: Bármely
    • Mutató előtagja: DefaultControllerPointer

2. Észleli, hogy a rendszer egy hologramot keres: A szkripttel EyeTrackingTarget engedélyezheti annak észlelését, hogy a hologramot a fent leírtak szerint tekinti meg. A mintaszkriptet is megtekintheti FollowEyeGaze inspirációként, mivel ez egy hologramot mutat a szem előtt (például egy kurzort) követve, hogy engedélyezve vannak-e a kézsugarak.

Most, amikor elindítja a szemkövetési bemutató jeleneteket, látnia kell egy sugarat a kezéből. Például a szemkövetés célválasztási bemutatójában 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 beviteli mutatót (a kezét) használják.


Vissza a "Eye Tracking in the MixedRealityToolkit" (Szemkövetés a MixedRealityToolkitben) című szakaszhoz