Aracılığıyla paylaş


Gözle desteklenen hedef seçimi — MRTK2

MRTK

Bu sayfada, MRTK'da hedefleri seçmek için göz bakışı verilerine ve göz bakışına özgü olaylara erişmek için farklı seçenekler ele alınmaktadır. Gözle izleme, el izleme ve sesli komutlar gibi ek girişlerle kullanıcının neye baktığıyla ilgili bilgilerin bir bileşimini kullanarak hızlı ve zahmetsiz hedef seçimleri yapılmasını sağlar:

  • " Seç" deyin & bakın (varsayılan sesli komut)
  • "Patla" veya "Pop" (özel sesli komutlar) deyin & bakın
  • Bluetooth düğmesine & bak
  • & Sıkıştır'a bakın (örneğin, elinizi önünüzde tutun ve başparmağını ve işaret parmağınızı bir araya getirin)

Göz bakışı kullanarak holografik içerik seçmek için çeşitli seçenekler vardır:

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

Bu, önceliklendirilmiş imleciniz olarak anlaşılabilir. Varsayılan olarak, eller görüntüdeyse, bu el ışınları olacaktır. Hiçbir el görünümde değilse, önceliklendirilmiş işaretçi baş veya göz bakışı olacaktır. Bu nedenle, el ışınları kullanılıyorsa, geçerli tasarım başlığına veya göz bakışına göre imleç girişi olarak gizlendiğini lütfen unutmayın.

Örnek:

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

  • Düğmeye kadar yürüyün ve dürtün
  • Uzaktan bakın ve "seç" deyin
  • El ışınını kullanarak düğmeyi hedefleme ve sıkıştırma gerçekleştirme Bu durumda, en esnek çözüm birincil odak işleyicisini kullanmaktır, bu nedenle önceliklendirilmiş birincil odak işaretçisi bir olayı her tetiklediğinden sizi bilgilendirir. El ışınları etkinse, eller görüntüye gelir gelmez baş veya göz bakışı odak işaretçisinin devre dışı bırakıldığını lütfen unutmayın.

Önemli

El ışınları etkinse, eller görüntüye gelir gelmez baş veya göz bakışı odak işaretçisinin devre dışı bırakıldığını lütfen unutmayın. Bir 'görünüm ve sıkıştırma' etkileşimini desteklemek istiyorsanız, el ışınını devre dışı bırakmanız gerekir. Göz izleme örnek sahnelerimizde, göz + el hareketleri kullanarak daha zengin etkileşimlerin gösterilmesine olanak sağlamak için el ışınını devre dışı bırakılmıştır. Bkz. Gözle Desteklenen Konumlandırma.

2. Hem göz odağını hem de el ışınlarını aynı anda kullanın:

Belirli olayları tetikleyebilen ve birden çok uzak etkileşim tekniğini eşzamanlı olarak kullanmaya izin veren odak işaretçisi türlerinin daha belirgin olmasını istediğiniz örnekler olabilir.

Örneğin: Uygulamanızda, bir kullanıcı uzak el ışınlarını kullanarak bazı holografik mekanik kurulumları işleyebilir; örneğin, bazı uzak holografik motor parçalarını alıp tutabilir ve yerinde tutabilir. Bunu yaparken kullanıcının bir dizi yönergeyi gözden geçirip bazı onay kutularını işaretleyerek ilerleme durumunu kaydetmesi gerekir. Kullanıcının elleri meşgul değilse, onay kutusuna dokunmak veya el ışınını kullanarak seçmek içgüdüsel olacaktır. Ancak, bazı holografik motor parçalarının bulunduğu durumlarda olduğu gibi kullanıcının elleri meşgulse, kullanıcının göz bakışını kullanarak yönergelerde sorunsuz bir şekilde gezinmesini ve bir onay kutusuna bakıp "işaretleyin!" demesini istiyorsunuz.

Bunu etkinleştirmek için, temel MRTK FocusHandlers'dan bağımsız olan ve aşağıda daha fazla tartışılacak olan eyetrackingTarget betiğini kullanmanız gerekir.

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

Gözle izleme doğru ayarlanmışsa (bkz. Gözle izlemeyi kullanmak için temel MRTK kurulumu), kullanıcıların gözlerini kullanarak hologramları seçmesine olanak sağlamak, diğer odak girişleriyle (örneğin, baş bakışı veya el ışını) aynıdır. Bu, kullanıcınızın ihtiyaçlarına bağlı olarak MRTK Giriş İşaretçisi Profilinizde ana odak türünü tanımlayarak hologramlarınızla etkileşim kurmanın esnek bir yolunun büyük avantajını sağlar ve kodunuzun dokunulmasını engeller. Bu, bir kod satırını değiştirmeden baş veya göz bakışı arasında geçiş yapılmasını sağlar veya uzak etkileşimler için el ışınlarını göz hedefleme ile değiştirir.

Holograma odaklanma

Hologramın ne zaman odaklandığını algılamak için size iki arabirim üyesi sağlayan 'IMixedRealityFocusHandler' arabirimini kullanın: OnFocusEnter ve OnFocusExit.

Burada, bir holograma bakılırken rengini değiştirmek için ColorTap.cs dosyasından basit bir örnek verilmiştir.

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

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

Odaklanmış hologram seçme

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

Aşağıdaki örnekte, holograma bakarak ve sıkıştırarak veya "seç" diyerek hologramın rengini değiştiriyoruz. Olayı tetiklemenin gerekli eylemi Unity Düzenleyicisi'nde türünü selectAction ayarlayabildiğimiz şekilde tanımlanıreventData.MixedRealityInputAction == selectAction; varsayılan olarak "Seç" eylemidir. Kullanılabilir MixedRealityInputActions türleri MRTK Profilinde MRTK Yapılandırma Profili -Giriş ->>Giriş Eylemleri aracılığıyla yapılandırılabilir.

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ı olabileceğinden, odak girişine yalnızca göz bakışıysa ve şu anda birincil giriş işaretçisiyse tepki vermek isteyebilirsiniz. Bu amaçla, gözle izlemeye özgü olan ve 'den BaseFocusHandlertüretilen öğesini kullanabilirsinizBaseEyeFocusHandler. Daha önce belirtildiği gibi, yalnızca göz bakışı hedeflemesi şu anda birincil işaretçi girişiyse tetiklenir (örneğin, el ışınları etkin değildir). Daha fazla bilgi için bkz. Göz bakışı + el hareketlerini destekleme.

Buradan bir örnek EyeTrackingDemo-03-Navigation verilmiştir (Assets/MRTK/Examples/Demos/EyeTracking/Scenes). Bu tanıtımda, nesnenin hangi bölümüne bakıldığına bağlı olarak açılacak iki 3B hologram vardır: Kullanıcı hologramın sol tarafına bakarsa, bu bölüm yavaşça kullanıcıya bakan öne doğru hareket eder. Sağ tarafa bakılırsa, o kısım yavaşça öne doğru hareket eder. Bu, her zaman etkin olmasını istemeyebileceğin bir davranıştır ve ayrıca yanlışlıkla bir el ışını veya baş bakışıyla tetiklemesini istemeyebileceğin bir davranıştır. OnLookAtRotateByEyeGaze Ekli olduğunda, bir GameObject 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;

        ...
    }
}

API belgelerine göz atarak kullanılabilir olayların BaseEyeFocusHandlertam listesini bulun:

  • OnEyeFocusStart: Göz bakışı ışını bu hedefin çarpıştırıcısıyla kesişmeye başladığında tetiklenmiş.
  • OnEyeFocusStay: Göz bakışı ışını bu hedefin çarpıştırıcısıyla kesişirken tetikleniyor.
  • OnEyeFocusStop: Göz bakışı ışını bu hedefin çarpıştırıcısıyla kesiştiğinde tetiklenmiş .
  • OnEyeFocusDwell: Göz bakışı ışını bu hedefin collider'ıyla belirli bir süre kesiştiğinde tetiklenmiş.

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

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

Bunun üç avantajı vardır:

  • Hologramın yalnızca kullanıcının bakışlarına tepki vermesini sağlayabilirsiniz.
  • Bu, şu anda etkin olan birincil girişten bağımsızdır. Bu nedenle, hızlı göz hedeflemeyi el hareketleriyle birleştirme gibi birden çok girişi aynı anda işleyebilirsiniz.
  • Unity Düzenleyicisi'nin içinden veya kod aracılığıyla mevcut davranışların işlenmesini ve yeniden kullanılmasını hızlı ve kullanışlı hale getirmek için birçok Unity olayı zaten ayarlanmıştır.

Bazı dezavantajları da vardır:

  • Ayrı girişleri tek tek işlemek için daha fazla çaba.
  • Zarif bozulma yok: Yalnızca göz hedeflemeyi destekler. Gözle izleme çalışmıyorsa ek geri dönüşe ihtiyacınız vardır.

BaseFocusHandler'a benzer şekilde EyeTrackingTarget, Unity Düzenleyicisi aracılığıyla (aşağıdaki örneğe bakın) veya kodda AddListener() kullanarak rahatça dinleyebileceğiniz göz bakışına özgü birkaç Unity olayıyla birlikte hazır olur:

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

Aşağıda , EyeTrackingTarget'in nasıl kullanılacağına ilişkin birkaç örnek için size yol gösteririz.

Örnek 1: Gözle desteklenen akıllı bildirimler

EyeTrackingDemo-02-TargetSelection (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) içinde, göz bakışınıza tepki veren 'akıllı özenli bildirimler' için bir örnek bulabilirsiniz. Bunlar, sahneye yerleştirilebilen ve okunabilirliği kolaylaştırmak için bakıldığında sorunsuz bir şekilde büyütüp kullanıcıya doğru dönecek 3B metin kutularıdır. Kullanıcı bildirimi okurken bilgiler net ve net bir şekilde görüntülenmeye devam eder. Bunu okuduktan ve bildirimden uzaklaştıktan sonra, bildirim otomatik olarak kapatılır ve kaybolur. Tüm bunları başarmak 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ılabilmesidir. Örneğin bir hologram, sesli komutlara göre veya sanal düğmeye bastıktan sonra kullanıcıyla karşılaşmaya başlayabilir. Bu olayları tetikleyebilmek için, GameObject'inize bağlı betikte EyeTrackingTarget yürütülmesi gereken yöntemlere başvurmanız yeterlidir.

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

  • OnLookAtStart(): Bildirim şu şekilde başlar:...

    • FaceUser.Engage: ... kullanıcıya doğru çevirin.
    • ChangeSize.Engage: ... boyutu artırın (belirtilen en yüksek ölçeğe kadar).
    • BlendOut.Engage: ... daha fazla karıştırmaya başlar (daha hafif bir boşta durumunda olduktan sonra).
  • OnDwell(): BlendOut betiğine bildirime yeterince bakıldığını bildirir.

  • OnLookAway(): Bildirim şu şekilde başlar:...

    • FaceUser.Disengage: ... özgün yönüne geri dönün.
    • ChangeSize.Disengage: ... özgün boyutuna geri küçültün.
    • BlendOut.Disengage: ... karıştırmaya başlar - OnDwell() tetiklendiyse tamamen karıştırıp yok edin, aksi takdirde boşta durumuna geri dönün.

Tasarımda dikkat edilmesi gerekenler: Burada keyifli bir deneyimin anahtarı, kullanıcının göz bakışına her zaman çok hızlı tepki vererek rahatsızlığa neden olmaması için bu davranışlardan herhangi birinin hızını dikkatli bir şekilde ayarlamaktır. Aksi takdirde bu hızlı bir şekilde aşırı derecede bunaltıcı hissedebilir.

Hedef Bildirimi

Örnek 2: Holografik mücevhere bakarken yavaş dönüyor

Örnek 1'e benzer şekilde, bakılırken yavaş bir şekilde sabit yönde ve sabit bir hızda (yukarıdan döndürme örneğinin aksine) dönecek olan (Varlıklar/MRTK/Örnekler/Tanıtımlar/EyeTracking/Sahneler) sahnesindeki holografik mücevherlerimiz EyeTrackingDemo-02-TargetSelection için kolayca bir vurgulama geri bildirimi oluşturabiliriz. Tek yapmanız gereken EyeTrackingTarget'inWhileLookingAtTarget() olayından holografik mücevherin dönüşünü tetiklemenizdir. İşte birkaç ayrıntı daha:

  1. Eklendiği GameObject'i döndürmek için genel bir işlev içeren genel bir betik oluşturun. Aşağıda, Unity Düzenleyicisi'nden döndürme yönünü ve hızını değiştirebileceğimiz 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. EyeTrackingTarget Betiği hedef GameObject'inize ekleyin ve aşağıdaki ekran görüntüsünde gösterildiği gibi UnityEvent tetikleyicisindeki RotateTarget() işlevine başvurun:

    EyeTrackingTarget örneği

Örnek #3: Bu mücevherleri çok modallı göz bakışı destekli hedef seçimi olarak ayarlayın

Önceki örnekte, bir hedefe bakılıp bakılmadığını algılamanın ne kadar kolay olduğunu ve buna karşı bir tepkinin nasıl tetiklendiğini göstermiştik. Ardından, gems'in içinden OnSelected() olayını kullanarak patlamasını sağlayacağız EyeTrackingTarget. İlginç olan, seçimin nasıl tetiklenmiş olduğudur. , EyeTrackingTarget bir seçimi çağırmak için farklı yolların hızla atanmasına olanak tanır:

  • Sıkıştırma hareketi: 'Eylem Seç'i 'Seç' olarak ayarlamak, seçimi tetiklemek için varsayılan el hareketini kullanır. Bu, kullanıcının seçimi onaylamak için elini kaldırıp başparmak ve işaret parmağını birbirine sıkıştırabileceği anlamına gelir.

  • "Seç" deyin: Hologram seçmek için varsayılan "Seç" sesli komutunu kullanın.

  • "Patla" veya "Pop" deyin: Özel sesli komutları kullanmak için iki adımı izlemeniz gerekir:

    1. "DestroyTarget" gibi özel bir eylem ayarlama

      • MRTK - Giriş ->> Giriş Eylemleri'ne gidin
      • "Yeni eylem ekle" seçeneğine tıklayın
    2. "Patla" veya "Pop" gibi bu eylemi tetikleyen sesli komutları ayarlama

      • MRTK -> Giriş -> Konuşma'ya gidin
      • "Yeni konuşma komutu ekle" seçeneğine tıklayın
        • Yeni oluşturduğunuz eylemi ilişkilendirme
        • Bir düğmeye basarak eylemi tetiklemenizi sağlamak için bir KeyCode atayın

EyeTrackingTarget örneği sesli komutları

Bir mücevher seçildiğinde patlar, ses çıkarır ve kaybolur. Bu, betik tarafından HitBehaviorDestroyOnSelect işlenir. İki seçeneğiniz vardır:

  • Unity Düzenleyicisi'nde: Gem şablonlarımızın her birine eklenen betiği Unity Düzenleyicisi'ndeki OnSelected() Unity olayına bağlamanız yeterlidir.
  • Kodda: GameObjects'i sürükleyip bırakmak istemiyorsanız betiğinize doğrudan bir olay dinleyicisi de ekleyebilirsiniz.
    Aşağıda betikte bunu nasıl yaptığımıza HitBehaviorDestroyOnSelect ilişkin bir örnek verilmiştir:
/// <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 ışınlarını ve göz bakışı girişini birlikte kullanma

El ışınları, kafa ve göz bakışı hedeflemeye göre önceliklidir. Bu, el ışınları etkinleştirilirse, eller görüntüye geldiği anda el ışınlarının birincil işaretçi olarak hareket edeceği anlamına gelir. Ancak, bir kullanıcının belirli bir holograma bakıp bakmadığını algılarken el ışınlarını kullanmak istediğiniz durumlar olabilir. Kolay! Temelde iki adıma ihtiyacınız vardır:

1. El ışınını etkinleştirin: El ışınını etkinleştirmek için Karma Gerçeklik Araç Seti - Giriş ->> İşaretçiler'e gidin. Karma Gerçeklik Toolkit'in tüm göz izleme tanıtım sahneleri için bir kez yapılandırıldığı EyeTrackingDemo-00-RootScene'daEyeTrackingDemoPointerProfile dosyasını görmeniz gerekir. Sıfırdan yeni bir Giriş Profili oluşturabilir veya geçerli göz izleme profilini uyarlayabilirsiniz:

  • Sıfırdan:İşaretçiler sekmesinde bağlam menüsünden DefaultMixedRealityInputPointerProfile öğesini seçin. Bu, el ışınını zaten etkinleştirmiş olan varsayılan işaretçi profilidir! Varsayılan imleci (opak beyaz nokta) değiştirmek için profili kopyalamanız ve kendi özel işaretçi profilinizi oluşturmanız yeterlidir. Ardından DefaultCursor değerini Bakış İmleci ÖnSeçim'in altındaki EyeGazeCursor ile değiştirin.
  • Mevcut EyeTrackingDemoPointerProfile temelinde:EyeTrackingDemoPointerProfile öğesine çift tıklayın ve İşaretçi Seçenekleri'nin altına aşağıdaki girdiyi ekleyin:
    • Denetleyici Türü: 'Eklemli El', 'Windows Mixed Reality'
    • Elle Kullanım: Herhangi biri
    • İşaretçi Prefab: DefaultControllerPointer

2. Bir holograma bakıldığını algılama: Yukarıda açıklandığı gibi bir holograma EyeTrackingTarget bakıldığını algılamak için betiği kullanın. Ayrıca, el ışınlarının FollowEyeGaze etkinleştirilip etkinleştirilmediğine bakılmaksızın göz bakışınızı takip eden bir hologram (örneğin, bir imleç) gösterdiğinden, ilham almak için örnek betiği de görebilirsiniz.

Göz izleme tanıtım sahnelerine başladığınızda, ellerinizden gelen bir ışın görmeniz gerekir. Örneğin, göz izleme hedef seçimi tanıtımında yarı saydam daire göz bakışınızı takip etmeye devam eder ve taşlar bakılıp bakılmadığına yanıt verirken, üstteki sahne menü düğmeleri bunun yerine birincil giriş işaretçisini (elleriniz) kullanır.


"MixedRealityToolkit'te göz izleme"