Göz desteği olan hedef seçimi

MRTK

Bu sayfada, MRTK'da hedefleri seçmek için göz bakışı verilerine erişmeye yönelik farklı seçenekler ve belirli olaylara göz bakışı açıklanmaz. Göz izleme, kullanıcının el izleme ve sesli komutlar gibi ek girişlerle neye bakıyor olduğuyla ilgili bilgilerin bir birleşimini kullanarak hızlı ve zahmetsiz hedef seçimlerine olanak sağlar:

  • "&" diyelim (varsayılan sesli komut)
  • "&" veya "Pop" (özel sesli komutlar) gibi bir ifadeye bakın
  • Görünüm & Bluetooth düğmesi
  • Sıkıştırma & bakın (yani, ön taraftan ellerinizi tutun ve başparmak ile dizin parmaklarınızı bir araya getirin)

Göz bakışı kullanarak holografik içerik seçmek için birkaç seçenek vardır:

1. Birincil odak işaretçisini kullanın:

Bu, öncelikli imleç olarak anlaşılabilir. Varsayılan olarak, eller görünümde ise bu el rayları olur. Hiçbir el görünümde yoksa, öncelik sırasına göre işaretçi baş veya göz bakışı olur. Bu nedenle, el rayları kullanılıyorsa, geçerli tasarım baş veya göz bakışına bağlı olarak imleç girişi olarak gizlenen bir uyarı olduğunu lütfen unutmayın.

Örnek:

Kullanıcı uzak bir holografik düğme seçmek istiyor. Geliştirici olarak, kullanıcının çeşitli koşullarda bu görevleri gerçekleştirmelerine olanak sağlayan esnek bir çözüm sağlamak istiyor siniz:

  • Düğmeye kadar inin ve düğmeyi seçin
  • Uzaktan bakarak "seç" diyelim
  • El ışığını kullanarak düğmeye hedefle ve sıkıştırma gerçekleştir. Bu durumda en esnek çözüm birincil odak işleyicisini kullanmaktır çünkü öncelik sırasına sahip olan birincil odak işaretçisi bir olayı tetikleyene zaman size bildirecek. El rayları etkinse, el ile görünüme gelir gelmez baş veya göz bakışı odak işaretçisinin devre dışı bırakılmıştır.

Önemli

El rayları etkinse, el ile görünüme gelir gelmez baş veya göz bakışı odak işaretçisinin devre dışı bırakılmıştır. 'Görünüm ve sıkıştırma' etkileşimini desteklemek için el grafisini devre dışı bırakmanız gerekir. Göz izleme örnek sahnelerimizde, göz + el hareketlerini kullanarak daha zengin etkileşimleri göstermek için el ışığını devre dışı bırakılmıştır. Örneğin, Göz DesteğineSahip Konumlandırma .

2. Aynı anda hem göz odağı hem de el rayları kullanın:

Hangi tür odak işaretçilerinin belirli olayları tetikleyene kadar birden çok etkileşim tekniğini eşzamanlı olarak kullanmasına izin verilebilecek daha net olmak istediğiniz örnekler olabilir.

Örneğin: Uygulamanıza bir kullanıcı uzak el rayları kullanarak holografik mekanik bir kurulumu iş gibi uzak holografik motor parçalarını alıp tutabilir ve bunları yerinde tutabilir. Bunu yaparken kullanıcının bir dizi yönergeleri takip etmek ve bazı onay kutularını işaretleyerek ilerlemesini kaydetmesi gerekir. Kullanıcının elleriyle meşgul olması, yalnızca onay kutusuna dokunmak veya el grafiti kullanarak seçmek oldukça kolay olurdu. Ancak, bizim durumumuza göre kullanıcının holografik altyapı parçalarının yerinde olduğu gibi, kullanıcının göz bakışıyla yönergeleri sorunsuz bir şekilde kaydırmasını ve yalnızca bir onay kutusuna bakarak ve "onay" deerek yönergeleri kaydırmasını sağlamak istiyorsanız.

Bunu etkinleştirmek için, temel MRTK FocusHandlers'dan bağımsız olan ve aşağıda daha fazla tartışılacak olan göz özgü EyeTrackingTarget betiği kullanabilirsiniz.

1. Genel odak ve işaretçi işleyicileri kullanma

Göz izleme doğru şekilde ayarlanmışsa (bkz. Göz izleme kullanmak için temel MRTKkurulumu), kullanıcıların kendi gözleriyle hologram seçmelerine olanak sağlamak, diğer odak girişleriyle (baş bakışı veya el grafisi gibi) aynıdır. Bu, kullanıcı gereksinimlerine bağlı olarak MRTK Giriş İşaretçisi Profilinizde ana odak türünü tanımlayarak ve kodunuzu dokunulmadan bırakarak hologramlarla etkileşim kurmanın esnek bir yolunun harika bir avantajını sağlar. Bu, bir kod satırı değiştirmeden baş veya göz bakışı arasında geçişe olanak sağlar veya el raylarını uzak etkileşimler için göz hedefleme ile değiştirir.

Holograma odaklanma

Bir hologramın ne zaman odaklanmış olduğunu algılamak için size iki arabirim üyesi sağlayan 'IMixedRealityFocusHandler' arabirimini kullanın: OnFocusEnter ve OnFocusExit.

Burada, bir holograma bakılamada hologram rengini değiştirmek için ColorTap.cs'den basit bir örnek ve sonrası ve bir örnek ve daha sonra açık ve net bir şekilde

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

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

Odaklanmış bir hologram seçme

Odaklanmış bir hologram seçmek için PointerHandler'ı kullanarak bir seçimi onaylamak üzere giriş olaylarını dinlenin. Örneğin, IMixedRealityPointerHandler eklemek basit işaretçi girişine tepki vermelerini sağlar. IMixedRealityPointerHandler arabirimi için şu üç arabirim üyesinin uygulanması gerekir: OnPointerUp, OnPointerDown ve OnPointerClicked.

Aşağıdaki örnekte holograma bakarak ve sıkıştırarak veya "seç" deerek hologramın rengini değiştiracağız. Olayı tetiklemek için gereken eylem, Unity Düzenleyicisi'nde türünü ayarlandığı şekilde tanımlanır. Varsayılan olarak eventData.MixedRealityInputAction == selectAction selectAction "Seç" eylemidir. Kullanılabilir MixedRealityInputActions türleri, MRTK Profilinde MRTK Yapılandırma Profili Giriş Eylemleri -> aracılığıyla -> yalıtabilirsiniz.

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

Göz bakışına özgü BaseEyeFocusHandler

Bu göz bakışı diğer işaretçi girişlerinden çok farklı olabilir, ancak göz bakışı ise ve şu anda birincil giriş işaretçisi ise odak girişine tepki verebilirsiniz. Bu amaçla, göz izlemeye özgü olan ve 'den BaseEyeFocusHandler türetilen 'i BaseFocusHandler kullanırsınız. Daha önce belirtildiği gibi, yalnızca göz bakışı hedefleme şu anda birincil işaretçi girişi ise tetiklenir (el ışığı etkin değil). Daha fazla bilgi için bkz. Göz bakışı + el hareketlerini destekleme.

Aşağıda EyeTrackingDemo-03-Navigation (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) bir örneği verilmiştir. Bu tanıtımda nesnenin hangi parçasına bakıldıklarına bağlı olarak iki 3D hologram açacağız: Kullanıcı hologramın sol tarafına bakacak olursa, o kısım yavaş bir şekilde kullanıcının ön tarafına doğru ilerler. Sağ tarafa baktığında bu kısım yavaş bir şekilde öne doğru ilerler. Bu davranış, her zaman etkin olmak istemey başka bir davranıştır ve el grafisi veya kafa bakışıyla yanlışlıkla tetiklemek istemeyilen bir davranıştır. Bir OnLookAtRotateByEyeGaze GameObject, ekli olduğunda, bakılırken döndürülür.

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;

        ...
    }
}

kullanılabilir olayların tam listesi için API belgelerine BaseEyeFocusHandler bakın:

  • OnEyeFocusStart: Göz bakışı grafisi bu hedefin harmanlayıcıyla kesiştirmaya başladığında tetiklenir.
  • OnEyeFocusStay: Göz bakışı ray bu hedefin harmanlayıcıyla kesişirken tetiklenir.
  • OnEyeFocusStop: Göz bakışı ray bu hedefin harmanlayıcıyla kesişimini durduran bir kez tetiklenir.
  • OnEyeFocusDwell: Göz bakışı grafisi belirli bir süre için bu hedefin harmanlayıcıyla kesiştirimini tetikler.

2. Bağımsız göz bakışına özgü EyeTrackingTarget

Son olarak, betik aracılığıyla diğer odak işaretçilerinden tamamen bağımsız olan göz tabanlı girişleri değerlendirmenizi sağlayan bir çözüm EyeTrackingTarget sağlariz.

Bunun üç avantajı vardır:

  • Hologram'ın yalnızca kullanıcının göz bakışına tepki gösterdiğindan emin olun.
  • Bu, şu anda etkin olan birincil girişten bağımsızdır. Bu nedenle, aynı anda birden çok girişi işleyesiniz; örneğin, hızlı göz hedeflemeyi el hareketleriyle birleştirin.
  • Unity Düzenleyicisi'nde veya kod aracılığıyla mevcut davranışların hızlı ve kullanışlı bir şekilde ele alınarak yeniden kullanılması için birkaç Unity olay zaten ayarlanmıştır.

Bazı dezavantajları da vardır:

  • Ayrı girişleri ayrı ayrı işlemek için daha fazla çaba.
  • Zarif performans düşüşü yoktur: Yalnızca göz hedeflemeyi destekler. Göz izleme çalışmıyorsa bazı ek geri dönüşler gerekir.

BaseFocusHandler'a benzer şekilde, EyeTrackingTarget de Unity Düzenleyicisi aracılığıyla (aşağıdaki örneğine bakın) veya kodda AddListener() kullanarak rahatça dinleyilebilecek göz bakışına özgü çeşitli Unity olaylarıyla hazır olarak gelir:

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

Aşağıda, EyeTrackingTarget'i nasıl kullanabileceğiniz hakkında birkaç örnek verilmiştir.

Örnek #1: Göz tarafından desteklenen akıllı bildirimler

EyeTrackingDemo-02-TargetSelection(Assets/MRTK/Examples/Demos/EyeTracking/Scenes) içinde, göz bakışınıza tepki veren 'akıllı bildirim bildirimleri' için bir örnek bulabilirsiniz. Bunlar, okunaklılığı kolaylaştırmak için bakıldıklarında sorunsuz bir şekilde büyütülecek ve kullanıcıya doğru dönüşecek olan 3D metin kutularıdır. Kullanıcı bildirimi okurken bilgiler net bir şekilde görüntülenmeye devam ediyor. Bu bildirim okunduktan ve bildirimden uzaklaştıktan sonra, bildirim otomatik olarak kapanır ve kaybolur. Tüm bu özellikleri elde etmek için göz izlemeye özgü olmayan birkaç genel davranış betikleri vardır, örneğin:

Bu yaklaşımın avantajı, aynı betiklerin çeşitli olaylar tarafından yeniden kullanılabilir olmasıdır. Örneğin, bir hologram ses komutlarını temel alarak veya bir sanal düğmeye basıldığında kullanıcıyla karşı karşıya başlayabilir. Bu olayları tetiklemek için, GameObject'inize eklenmiş olan EyeTrackingTarget betikte yürütülecek yöntemlere başvurebilirsiniz.

'Akıllı bildirim bildirimleri' örneği için aşağıdakiler gerçekleşir:

  • OnLookAtStart(): Bildirim...

    • FaceUser.Engage: ... kullanıcıya yönelin.
    • ChangeSize.Engage: ... boyut artışı (belirtilen en yüksek ölçeke kadar).
    • BlendOut.Engage: ... daha fazla karıştırmaya başlar (daha küçük bir boşta kalma durumuna geldikten sonra).
  • OnDwell(): BlendOut betiğine bildirimin yeterince bakıldı olduğunu bildiriyor.

  • OnLookAway(): Bildirim...

    • FaceUser.Disengage: ... özgün yönüne geri döner.
    • ChangeSize.Disengage: ... özgün boyutuna geri döner.
    • BlendOut.Disengage: ... karıştırmaya başlar - OnDwell() tetiklenirse, tamamen karıştırarak yok eder, aksi takdirde boşta durumuna geri döner.

Tasarımla ilgili dikkat edilmesi gerekenler: Burada eğlenceli bir deneyimin anahtarı, kullanıcının göz bakışına her zaman çok hızlı bir şekilde tepki göstererek tepki vermenin önüne geçerek bu davranışlardan herhangi biri hızını dikkatli bir şekilde ayarlamaktır. Aksi takdirde bu durum hızlı bir şekilde aşırı aşırıyaltıcı olabilir.

Target Notification

Örnek #2: Holographic gem, bakarak yavaş döner

Örnek #1'ye benzer şekilde, (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) sahnesinde holografik gemlerimiz için kolayca sabit bir yönde ve sabit hızda (yukarıdaki döndürme örneğinin aksine) geri bildirim EyeTrackingDemo-02-TargetSelection oluşturabiliriz. Tek ihtiyacınız olan, EyeTrackingTarget'in WhileLookingAtTarget() olayından holografik gem'in dönüşünü tetiklemektir. İşte birkaç ayrıntı daha:

  1. Eklendiği GameObject'i döndürmek için genel işlev içeren genel bir betik oluşturun. Aşağıda, Unity Düzenleyicisi'nde döndürme yönünü ve hızını değiştirerek RotateWithConstSpeedDir.cs'den bir örnek verilmiştir.

    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. Betiği hedef GameObject nesnenize ekleyin ve aşağıdaki ekran görüntüsünde gösterildiği gibi UnityEvent tetikleyicisinde EyeTrackingTarget RotateTarget() işlevine bakın:

    EyeTrackingTarget örneği

Örnek #3: Bu gem'leri çoklu modlu göz bakışı-desteklenen hedef seçimi olarak da ortaya çıkar

Önceki örnekte, bir hedefe bakıp bakmama ve buna tepki tetiklemenin ne kadar kolay olduğunu gösterdik. Şimdi, gems'i, 'den OnSelected() olayıyla daha fazla uzasın. EyeTrackingTarget İşin ilginç kısmı, seçimin nasıl tetiklenir olduğudır. , EyeTrackingTarget seçimi çağırmak için hızla farklı yollar atamaya olanak sağlar:

  • Sıkıştırma hareketi:'Eylem Seç'i 'Seç' olarak ayarlarsanız, seçimi tetiklemek için varsayılan el hareketi kullanılır. Bu, kullanıcının seçimi onaylamak için yalnızca elleriyle dokunarak parmaklarıyla dizin parmaklarını sıkıştırabilir.

  • "Seç" diyelim: Hologram seçmek için "Select" varsayılan ses komutunu kullanın.

  • "Yer" veya "Pop" de: Özel ses komutlarını kullanmak için iki adımı izlemeniz gerekir:

    1. "DestroyTarget" gibi özel bir eylem ayarlama

      • MRTK -> Giriş -> Eylemleri'ne gidin
      • "Yeni eylem ekle"ye tıklayın
    2. "Geç" veya "Pop" gibi bu eylemi tetikleyen ses komutlarını ayarlayın

      • MRTK -> Giriş -> Konuşma'ya gidin
      • "Yeni konuşma komutu ekle"ye tıklayın
        • Yeni oluşturduğunuz eylemi ilişkilendirme
        • Düğme tuşuna basarak eylemi tetiklemeye izin vermek için bir KeyCode atama

Ses komutları EyeTrackingTarget örneği

Bir gem seçildiğinde bir ses olur ve kaybolur. Bu, betik tarafından HitBehaviorDestroyOnSelect işleme. İki seçeneğiniz vardır:

  • Unity Düzenleyicisi'nde: Gem şablonlarımızın her biri için eklenen betiği Unity Düzenleyicisi'nde OnSelected() Unity olayına bağlamanız gerekir.
  • Kodda: GameObjects'i sürükleyip bırakmak istemiyorsanız doğrudan betiğinize bir olay dinleyicisi eklemeniz de gerekir.
    Betikte bunu nasıl yaptığının bir örneği aşağıdaki HitBehaviorDestroyOnSelect gibidir:
/// <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
    }
}

Örnek #4: El ışıklarını ve göz bakışı girişini birlikte kullanma

El rayları, baş ve göz bakışı hedeflemeden önceliklidir. Bu, el raylarının etkinleştirildiğinde el ışığının ilk işaretçi olarak davranacakları anlamına gelir. Ancak, bir kullanıcının belirli bir holograma bakıp bak olmadığını algılamaya devam ederken el raylarını kullanmak istediğiniz durumlar olabilir. Kolay! Temelde iki adım gerekir:

1. El grafisini etkinleştirme: El grafisini etkinleştirmek için Karma Gerçeklik Araç Seti -> Giriş -> İşaretçileri'ne gidin. Karma Gerçeklik Araç Seti'nin tüm göz izleme tanıtım sahneleri için bir kez yapılandırılan EyeTrackingDemo-00-RootScene'de EyeTrackingDemoPointerProfile dosyasını görüyoruz. Sıfırdan yeni bir Giriş Profili oluşturabilir veya geçerli göz izleme profilini uyarabilirsiniz:

  • Sıfırdan: İşaretçiler sekmesinde bağlam menüsünden DefaultMixedRealityInputPointerProfile öğesini seçin. Bu, el rayını zaten etkinleştirmiş olan varsayılan işaretçi profilidir! Varsayılan imleci (opak bir beyaz nokta) değiştirmek için profili kopyalamanız ve kendi özel işaretçi profilinizi oluşturmanız gerekir. Ardından, Bakış İmleci ÖnFazı altındaki DefaultCursor'ı EyeCureCursor ile değiştirin.
  • Mevcut EyeTrackingDemoPointerProfile'ı temel alarak: EyeTrackingDemoPointerProfile'a çift tıklayın ve İşaretçi Seçenekleri'nin altına aşağıdaki girdiyi ekleyin:
    • Denetleyici Türü: 'Açık El', 'Windows Mixed Reality'
    • Taraklılık: Herhangi bir
    • İşaretçi ÖnFab: DefaultControllerPointer

2. Bir holograma bakıldı olduğunu algıla: Bir holograma yukarıda açıklandığı gibi bakıldı olduğunu algılamak için EyeTrackingTarget betiği kullanın. Ayrıca, el raylarının etkin olup olmadığı, göz bakışınızı takip eden bir hologram (ör. bir imleç) gösterdiği için, ilham almak için örnek betiği de göz atarak göz bakışınızı FollowEyeGaze takip edin.

Şimdi göz izleme tanıtım sahnelerini başlatacak olurken ellerden bir ray geldiğini görüyoruz. Örneğin, göz izleme hedef seçimi tanıtımda yarı saydam daire hala göz bakışınızı takip eder ve gem'ler, bakmalarına veya bakmamalarına yanıt verirken, üst sahne menü düğmeleri bunun yerine birincil giriş işaretçisini (sizin ellerinizi) kullanır.


"MixedRealityToolkit'te göz izleme"