Wybór obiektów docelowych obsługiwanych przez oko — MRTK2

ZESTAW NARZĘDZI MRTK

Na tej stronie omówiono różne opcje uzyskiwania dostępu do danych wzroku i spojrzenia na konkretne zdarzenia w celu wybrania obiektów docelowych w zestawie narzędzi MRTK. Śledzenie oczu umożliwia szybkie i bezproblemowe wybieranie elementów docelowych przy użyciu kombinacji informacji o tym, co użytkownik patrzy z dodatkowymi danymi wejściowymi, takimi jak śledzenie rąk i polecenia głosowe:

  • Spójrz & powiedz "Select" (domyślne polecenie głosowe)
  • Spójrz & powiedz "Eksploduj" lub "Pop" (niestandardowe polecenia głosowe)
  • Przycisk Look & Bluetooth (Wyszukaj & Bluetooth)
  • Spójrz & Szczypta (tzn. przytrzymaj rękę przed tobą i połącz kciuk i palec wskazujący)

Aby wybrać zawartość holograficzną przy użyciu spojrzenia wzrokowego, dostępnych jest kilka opcji:

1. Użyj podstawowego wskaźnika fokusu:

Można to zrozumieć jako priorytetowy kursor. Domyślnie, jeśli ręce są w widoku, to byłoby to promienie dłoni. Jeśli nie ma rąk w widoku, priorytetowym wskaźnikiem byłoby spojrzenie głowy lub oka. Dlatego należy pamiętać, że w oparciu o bieżącą głowę projektową lub wzrok jest pomijany jako wejście kursora, jeśli są używane promienie ręczne.

Na przykład:

Użytkownik chce wybrać odległy przycisk holograficzny. Jako deweloper chcesz udostępnić elastyczne rozwiązanie, które umożliwia użytkownikowi wykonywanie tych zadań w różnych warunkach:

  • Przejdź do przycisku i wyśmieć go
  • Spójrz na to z daleka i powiedz "select"
  • Wyceluj przycisk za pomocą promienia ręcznego i wykonanie szczypty W tym przypadku najbardziej elastycznym rozwiązaniem jest użycie podstawowej procedury obsługi fokusu, ponieważ powiadomi Cię za każdym razem, gdy aktualnie priorytetowy podstawowy wskaźnik fokusu wyzwala zdarzenie. Należy pamiętać, że w przypadku włączenia promieni ręcznych wskaźnik koncentracji wzroku głowy lub wzroku jest wyłączony, gdy tylko ręce wejdą w widok.

Ważne

Należy pamiętać, że w przypadku włączenia promieni ręcznych wskaźnik koncentracji wzroku głowy lub wzroku jest wyłączony, gdy tylko ręce wejdą w widok. Jeśli chcesz obsługiwać interakcję "wygląd i szczypta", musisz wyłączyć promienie dłoni. W naszych scenach z próbkami śledzenia oczu wyłączyliśmy ray dłoni, aby umożliwić pokazywanie bogatszych interakcji za pomocą oczu i ruchów dłoni - zobacz na przykład Pozycjonowanie obsługiwane przez oko.

2. Używaj jednocześnie zarówno ostrości oka, jak i promieni dłoni:

Mogą istnieć wystąpienia, w których chcesz być bardziej szczegółowe, który typ wskaźników fokusu może wyzwalać określone zdarzenia i zezwalać na jednoczesne korzystanie z wielu technik interakcji.

Na przykład: W aplikacji użytkownik może używać promieni dalekiej ręki do manipulowania niektórymi holograficznej konfiguracji mechanicznej - np. chwycić i trzymać niektóre odległe części silnika holograficznego i trzymać je na miejscu. W ten sposób użytkownik musi wykonać szereg instrukcji i zarejestrować jej postęp, zaznaczając niektóre pola wyboru. Jeśli użytkownik ma jej/jego ręce nie zajęty, byłoby instynktowne po prostu dotknąć pola wyboru lub zaznaczyć go za pomocą promienia ręki. Jeśli jednak użytkownik ma swoje ręce zajęty, jak w naszym przypadku trzymając niektóre części silnika holograficznego, chcesz umożliwić użytkownikowi bezproblemowe przewijanie instrukcji za pomocą spojrzenia wzrokowego i po prostu spojrzeć na pole wyboru i powiedzieć "zaznacz to!".

Aby to włączyć, należy użyć skryptu EyeTrackingTarget specyficznego dla oka, który jest niezależny od podstawowych procedur mrTK FocusHandlers i zostanie omówiony poniżej.

1. Użyj ogólnych procedur obsługi fokusu i wskaźnika

Jeśli śledzenie oczu jest poprawnie skonfigurowane (zobacz Podstawowa konfiguracja zestawu NARZĘDZI MRTK do korzystania ze śledzenia oczu), umożliwienie użytkownikom wybierania hologramów przy użyciu oczu jest taka sama jak w przypadku innych danych wejściowych ostrości (np. wzrok głowy lub promienia ręki). Zapewnia to doskonałą zaletę elastycznego sposobu interakcji z hologramami przez zdefiniowanie głównego typu fokusu w profilu wskaźnika danych wejściowych zestawu narzędzi MRTK w zależności od potrzeb użytkownika, pozostawiając kod nietknięty. Dzięki temu można przełączać się między spojrzeniem głowy lub oczu bez zmiany wiersza kodu lub zastąpienia promieni ręcznych celami wzroku w celu uzyskania dalekich interakcji.

Skupienie się na hologramie

Aby wykryć fokus hologramu, użyj interfejsu "IMixedRealityFocusHandler" , który zapewnia dwa elementy członkowskie interfejsu: OnFocusEnter i OnFocusExit.

Oto prosty przykład z pliku ColorTap.cs , aby zmienić kolor hologramu podczas patrzenia.

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

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

Wybieranie hologramu ukierunkowanego

Aby wybrać hologram ukierunkowany, użyj programu PointerHandler , aby nasłuchiwać zdarzeń wejściowych w celu potwierdzenia wyboru. Na przykład dodanie elementu IMixedRealityPointerHandler sprawi, że będą reagować na proste dane wejściowe wskaźnika. Interfejs IMixedRealityPointerHandler wymaga zaimplementowania następujących trzech elementów interfejsu: OnPointerUp, OnPointerDown i OnPointerClicked.

W poniższym przykładzie zmieniamy kolor hologramu, patrząc na niego i przypinając lub mówiąc "select". Wymagana akcja wyzwalania zdarzenia jest definiowana przez eventData.MixedRealityInputAction == selectAction ustawienie typu selectAction w Edytorze aparatu Unity — domyślnie jest to akcja "Wybierz". Typy dostępnych obiektów MixedRealityInputAction można skonfigurować w profilu zestawu narzędzi MRTK za pośrednictwem profilu konfiguracji zestawu narzędzi MRTK -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) { }
}

Funkcja BaseEyeFocusHandler specyficzna dla wzroku

Biorąc pod uwagę, że spojrzenie wzrokowe może różnić się od innych danych wejściowych wskaźnika, warto pamiętać, aby reagować tylko na dane wejściowe fokusu, jeśli jest to spojrzenie wzrokowe i jest obecnie podstawowym wskaźnikiem wejściowym. W tym celu należy użyć BaseEyeFocusHandler elementu, który jest specyficzny dla śledzenia oczu i który pochodzi z .BaseFocusHandler Jak wspomniano wcześniej, zostanie on wyzwolony tylko wtedy, gdy cel wzroku jest obecnie podstawowym wskaźnikiem wejściowym (tj. nie ma aktywnych rąk). Aby uzyskać więcej informacji, zobacz Jak obsługiwać wzrok i gesty dłoni.

Oto przykład z ( EyeTrackingDemo-03-Navigation Assets/MRTK/Examples/Demos/EyeTracking/Scenes). W tym pokazie istnieją dwa hologramy 3D, które będą włączać w zależności od tego, która część obiektu jest oglądana: Jeśli użytkownik patrzy po lewej stronie hologramu, ta część powoli będzie przesuwać się w kierunku przedniego użytkownika. Jeśli przyjrzymy się prawej stronie, ta część powoli przejdzie do przodu. Jest to zachowanie, które może nie być aktywne przez cały czas, a także coś, czego możesz nie chcieć przypadkowo wyzwolić przez promienie ręczne lub spojrzenie głowy. Po dołączeniu OnLookAtRotateByEyeGaze obiekt GameObject zostanie obrócony podczas patrzenia.

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;

        ...
    }
}

Zapoznaj się z dokumentacją interfejsu API, aby uzyskać pełną listę dostępnych zdarzeń :BaseEyeFocusHandler

  • OnEyeFocusStart: Wyzwalane, gdy promienie wzroku zaczynają przecinać się z zderzaczem tego celu.
  • OnEyeFocusStay: Wyzwalane , gdy promienie wzroku przecinają się z zderzaczem tego celu.
  • OnEyeFocusStop: Wyzwolony, gdy promienie wzroku przestają przecinać się z zderzaczem tego celu.
  • OnEyeFocusDwell: Wyzwolony po prześwietleniu wzroku przecina się z zderzaczem tego celu przez określony czas.

2. Niezależne eye-eye-specific EyeTrackingTarget

Na koniec udostępniamy rozwiązanie, które pozwala traktować dane wejściowe oparte na oczach całkowicie niezależne od innych wskaźników fokusu za pośrednictwem skryptu EyeTrackingTarget .

Ma to trzy zalety:

  • Możesz upewnić się, że hologram reaguje tylko na wzrok użytkownika.
  • Jest to niezależne od obecnie aktywnych danych wejściowych podstawowych. W związku z tym można przetwarzać wiele danych wejściowych jednocześnie — na przykład łącząc szybkie ukierunkowanie oka z gestami dłoni.
  • Skonfigurowano już kilka zdarzeń aparatu Unity, aby umożliwić szybkie i wygodne obsługę i ponowne używanie istniejących zachowań z poziomu edytora aparatu Unity lub za pośrednictwem kodu.

Istnieją również pewne wady:

  • Więcej wysiłku w celu obsługi osobnych danych wejściowych osobno.
  • Brak eleganckiego degradacji: Obsługuje tylko celowanie wzroku. Jeśli śledzenie oczu nie działa, wymagane jest dodatkowe rezerwowe.

Podobnie jak w przypadku programu BaseFocusHandler, funkcja EyeTrackingTarget jest gotowa z kilkoma zdarzeniami aparatu Unity specyficznymi dla wzroku, które można wygodnie nasłuchiwać za pośrednictwem edytora aparatu Unity (zobacz przykład poniżej) lub przy użyciu funkcji AddListener() w kodzie:

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

Poniżej przedstawiono kilka przykładów użycia rozwiązania EyeTrackingTarget.

Przykład nr 1: powiadomienia inteligentne obsługiwane przez oko

W EyeTrackingDemo-02-TargetSelection obszarze (Assets/MRTK/Examples/Demos/EyeTracking/Scenes) można znaleźć przykład "inteligentne powiadomienia uważne" , które reagują na wzrok. Są to pola tekstowe 3D, które można umieścić w scenie i które będą płynnie powiększać i zwracać się w kierunku użytkownika, gdy patrzy się, aby ułatwić czytelność. Gdy użytkownik odczytuje powiadomienie, informacje są wyświetlane w sposób ostry i przejrzysty. Po odczytaniu i odejściu od powiadomienia powiadomienie zostanie automatycznie odrzucone i zanika. Aby to osiągnąć, istnieje kilka ogólnych skryptów zachowania, które nie są specyficzne dla śledzenia oczu w ogóle, takie jak:

Zaletą tego podejścia jest to, że te same skrypty mogą być ponownie używane przez różne zdarzenia. Na przykład hologram może zacząć stawić czoła użytkownikowi na podstawie poleceń głosowych lub po naciśnięciu przycisku wirtualnego. Aby wyzwolić te zdarzenia, możesz po prostu odwołać się do metod, które należy wykonać w EyeTrackingTarget skrycie dołączonym do obiektu GameObject.

Przykładowe "inteligentne powiadomienia uważne" są następujące:

  • OnLookAtStart(): Powiadomienie zaczyna się...

    • FaceUser.Engage: ... skręć w kierunku użytkownika.
    • ChangeSize.Engage: ... zwiększenie rozmiaru (do określonej maksymalnej skali).
    • BlendOut.Engage: ... zaczyna mieszać się w więcej (po byciu w bardziej subtelnym stanie bezczynności).
  • OnDwell(): informuje skrypt BlendOut o tym, że powiadomienie zostało wystarczająco przyjrzene.

  • OnLookAway(): Powiadomienie zaczyna się...

    • FaceUser.Disengage: ... wróć do oryginalnej orientacji.
    • ChangeSize.Disengage: ... zmniejsz rozmiar do pierwotnego rozmiaru.
    • BlendOut.Disengage: ... zaczyna się mieszać - jeśli OnDwell() został wyzwolony, wymieszania całkowicie i zniszczenia, w przeciwnym razie z powrotem do stanu bezczynności.

Zagadnienia dotyczące projektowania: Kluczem do przyjemnego środowiska jest staranne dostosowanie szybkości każdego z tych zachowań, aby uniknąć dyskomfortu, reagując na spojrzenie użytkownika zbyt szybko przez cały czas. W przeciwnym razie może to szybko czuć się bardzo przytłaczające.

Powiadomienie docelowe

Przykład nr 2: Klejnot Holographic obraca się powoli podczas przeglądania

Podobnie jak w przypadku przykładu #1, możemy łatwo utworzyć opinię na temat naszych klejnotów holograficznego ( EyeTrackingDemo-02-TargetSelection Assets/MRTK/Examples/Demos/EyeTracking/Scenes), która powoli obraca się w stałym kierunku i przy stałej prędkości (w przeciwieństwie do przykładu rotacji z powyższego) podczas przeglądania. Wystarczy wyzwolić rotację holograficznego klejnotu z zdarzenia WhileLookingAtTarget w eyeTrackingTarget. Oto kilka dodatkowych szczegółów:

  1. Utwórz ogólny skrypt zawierający funkcję publiczną w celu rotacji obiektu GameObject, do którego jest dołączony. Poniżej znajduje się przykład z pliku RotateWithConstSpeedDir.cs , w którym można dostosować kierunek obrotu i szybkość z edytora aparatu Unity.

    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 Dodaj skrypt do docelowego obiektu GameObject i odwołaj się do funkcji RotateTarget() w wyzwalaczu UnityEvent, jak pokazano na poniższym zrzucie ekranu:

    Przykład EyeTrackingTarget

Przykład nr 3: Pop te klejnoty toka wielomodalne oko-spojrzenie obsługiwane cel wyboru

W poprzednim przykładzie pokazano, jak łatwo jest wykryć, czy cel jest oglądany i jak wyzwolić reakcję na to. Następnie sprawimy, że klejnoty eksplodują przy użyciu zdarzenia OnSelected() z obiektu EyeTrackingTarget. Interesującą częścią jest sposób wyzwalania zaznaczenia. Umożliwia EyeTrackingTarget szybkie przypisywanie różnych sposobów wywoływania wyboru:

  • Gest szczypty: ustawienie opcji "Wybierz akcję" na "Wybierz" używa domyślnego gestu dłoni w celu wyzwolenia zaznaczenia. Oznacza to, że użytkownik może po prostu podnieść rękę i szczypnąć kciuk i palec indeksowy razem, aby potwierdzić wybór.

  • Powiedz "Select": Użyj domyślnego polecenia głosowego "Select" do wybrania hologramu.

  • Powiedz "Eksploduj" lub "Pop": Aby użyć niestandardowych poleceń głosowych, należy wykonać dwa kroki:

    1. Konfigurowanie akcji niestandardowej, takiej jak "DestroyTarget"

      • Przejdź do pozycji MRTK —> dane wejściowe —> akcje wejściowe
      • Kliknij pozycję "Dodaj nową akcję"
    2. Konfigurowanie poleceń głosowych, które wyzwalają tę akcję, taką jak "Eksploduj" lub "Pop"

      • Przejdź do zestawu NARZĘDZI MRTK — dane wejściowe —>> mowa
      • Kliknij pozycję "Dodaj nowe polecenie mowy"
        • Kojarzenie właśnie utworzonej akcji
        • Przypisywanie kodu klucza w celu umożliwienia wyzwalania akcji za pomocą naciśnięcia przycisku

Przykład poleceń głosowych EyeTrackingTarget

Po wybraniu klejnotu eksploduje, co brzmi i zniknie. Jest to obsługiwane przez HitBehaviorDestroyOnSelect skrypt. Dostępne są dwie opcje:

  • W edytorze aparatu Unity: Możesz po prostu połączyć skrypt dołączony do każdego z naszych szablonów klejnotów do zdarzenia OnSelected() Unity w Edytorze aparatu Unity.
  • W kodzie: Jeśli nie chcesz przeciągać i upuszczać obiektów GameObject, możesz również po prostu dodać odbiornik zdarzeń bezpośrednio do skryptu.
    Oto przykład z tego, jak to zrobiliśmy w HitBehaviorDestroyOnSelect skrycie:
/// <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
    }
}

Przykład nr 4: Używanie promieni dłoni i spojrzenia wzrokowego razem

Promienie dłoni mają priorytet nad głową i spojrzeniem wzroku. Oznacza to, że jeśli promienie dłoni są włączone, moment, w którym ręce wejdą w widok, promienie ręki będą działać jako podstawowy wskaźnik. Jednak mogą wystąpić sytuacje, w których chcesz używać promieni dłoni, jednocześnie wykrywając, czy użytkownik patrzy na określony hologram. Łatwe! Zasadniczo wymagane są dwa kroki:

1. Włącz promienie dłoni: aby włączyć promienie dłoni, przejdź do Mixed Reality Toolkit - Input ->> Pointers. W aplikacji EyeTrackingDemo-00-RootScene, gdzie Mixed Reality Toolkit jest skonfigurowany raz dla wszystkich scen pokazowych śledzenia oczu, powinien zostać wyświetlony eyeTrackingDemoPointerProfile. Możesz utworzyć nowy profil wejściowy od podstaw lub dostosować bieżące śledzenie oczu:

  • Od podstaw: Na karcie Wskaźniki wybierz pozycję DefaultMixedRealityInputPointerProfile z menu kontekstowego. Jest to domyślny profil wskaźnika, który ma już włączony ray dłoni! Aby zmienić domyślny kursor (nieprzezroczystą białą kropkę), po prostu sklonuj profil i utwórz własny niestandardowy profil wskaźnika. Następnie zastąp element DefaultCursor ciągiem EyeGazeCursor w obszarze Prefab kursora.
  • Na podstawie istniejącego pliku EyeTrackingDemoPointerProfile: kliknij dwukrotnie plik EyeTrackingDemoPointerProfile i dodaj następujący wpis w obszarze Opcje wskaźnika:
    • Typ kontrolera: "Ręka przegubowa", "Windows Mixed Reality"
    • Rękojmia: Wszelki
    • Prefab wskaźnika: DefaultControllerPointer

2. Wykryj, że hologram jest oglądany: Użyj skryptu EyeTrackingTarget , aby umożliwić wykrywanie, że hologram jest sprawdzany zgodnie z powyższym opisem. Możesz również przyjrzeć się przykładowemu FollowEyeGaze skryptowi inspiracji, ponieważ pokazuje to hologram po spojrzeniu oka (np. kursor) niezależnie od tego, czy promienie dłoni są włączone, czy nie.

Teraz, gdy zaczniesz sceny pokazowe śledzenia oczu, powinien zostać wyświetlony ray pochodzący z rąk. Na przykład w pokazie wyboru docelowego śledzenia oczu półprzezroczyste kółko nadal podąża za spojrzeniem oka, a klejnoty reagują na to, czy są one oglądane, czy nie, podczas gdy przyciski menu górnej sceny używają podstawowego wskaźnika wejściowego (ręce) zamiast tego.


Powrót do "Śledzenie oczu w MixedRealityToolkit"