Kontrolery, wskaźniki i fokus

Kontrolery, wskaźniki i fokus to koncepcje wyższego poziomu, które bazują na podstawach ustanowionych przez podstawowy system wejściowy. Razem zapewniają dużą część mechanizmu interakcji z obiektami w scenie.

Kontrolery

Kontrolery są reprezentacjami kontrolera fizycznego (6-stopnie swobodnego działania, układowej ręki itp.). Są one tworzone przez menedżerów urządzeń i odpowiadają za komunikację z odpowiednim systemem bazowym oraz tłumaczenie tych danych na dane i zdarzenia w kształcie mrTK.a

Na przykład na platformie Windows Mixed Reality WindowsMixedRealityArticulatedHand jest kontrolerem odpowiedzialnym za połączenia z bazowymi interfejsami API śledzenia rąk platformy Windows w celu uzyskania informacji o pniu, pozy i innych właściwościach ręki. Jest on odpowiedzialny za przekształcanie tych danych w odpowiednie zdarzenia MRTK (na przykład przez wywołanie raisePoseInputChanged lub RaiseHandJointsUpdated) TryGetJointPose i zaktualizowanie własnego stanu wewnętrznego, aby zapytania zwracały prawidłowe dane.

Ogólnie rzecz biorąc, cykl życia kontrolera obejmuje:

  1. Kontroler jest tworzony przez menedżera urządzeń po wykryciu nowego źródła (na przykład menedżer urządzeń wykrywa i rozpoczyna śledzenie ręki).

  2. W pętli Update() kontrolera wywołuje on swój podstawowy system interfejsu API.

  3. W tej samej pętli aktualizacji wywołuje ona zmiany zdarzeń wejściowych, wywołując bezpośrednio podstawowy system wejściowy (na przykład wywołując element HandMeshUpdated lub HandJointsUpdated).

Wskaźniki i fokus

Wskaźniki służą do interakcji z obiektami gry. W tej sekcji opisano, jak są tworzone wskaźniki, jak są aktualizowane i jak określają obiekty, które mają fokus. Obejmuje również różne typy istniejących wskaźników i scenariusze, w których są aktywne.

Kategorie wskaźników

Wskaźniki zazwyczaj należą do jednej z następujących kategorii:

  • Wskaźniki daleko

    Tego typu wskaźniki są używane do interakcji z obiektami, które są daleko od użytkownika (daleko jest definiowane jako po prostu "nie blisko"). Tego typu wskaźniki zazwyczaj rzutują linie, które mogą przejść daleko w świat i umożliwiają użytkownikowi interakcję z obiektami, które nie znajdują się bezpośrednio obok nich, i manipulowanie nimi.

  • Wskaźniki blisko

    Tego typu wskaźniki są używane do interakcji z obiektami, które są wystarczająco zbliżone do użytkownika, aby chwycić, dotykać i manipulować nimi. Ogólnie rzecz biorąc, te typy wskaźników wchodzą w interakcje z obiektami, szukając obiektów w pobliżu (wykonując rzutowanie promieniowe z małej odległości, wykonując rzutowanie ferferyczne w celu szukania obiektów w sąsiedztwie lub wyliczając listy obiektów, które są uznawane za chwytalne/dotykalne).

  • Wskaźniki do zsypów

    Te typy wskaźników podłączają się do systemu teleportacji w celu obsługi przenoszenia użytkownika do lokalizacji docelowej przez wskaźnik.

Wskaźnik nachylić

Ponieważ pojedynczy kontroler może mieć wiele wskaźników (na przykład wyrażana ręka może mieć zarówno wskaźniki blisko, jak i dalekosiące interakcje), istnieje składnik odpowiedzialny za mediating, który powinien być aktywny.

Na przykład gdy użytkownik podchodzi do przycisku z naciśnięciem, ShellHandRayPointer przycisk powinien przestać być pokazywany, PokePointer a przycisk powinien być zaangażowany.

Jest to obsługiwane przez DefaultPointerMediator, który jest odpowiedzialny za ustalanie, które wskaźniki są aktywne, na podstawie stanu wszystkich wskaźników. Jedną z kluczowych czynności, które to robi, jest wyłączenie bardzo wielu wskaźników, gdy zbliża się on do obiektu (zobacz DefaultPointerMediator).

Można zapewnić alternatywną implementację wskaźnika wskaźnika przez zmianę PointerMediator właściwości w profilu wskaźnika.

Jak wyłączyć wskaźniki

Ponieważ wskaźnik jest uruchamiany w każdej ramce, steruje on aktywnym/nieaktywnym stanem wszystkich wskaźników. W związku z tym, jeśli ustawisz właściwość IsInteractionEnabled wskaźnika w kodzie, zostanie ona nadpisana przez wskaźnik od każdej ramki. Zamiast tego można określić , aby PointerBehavior określić, czy wskaźniki powinny być wł. czy wyłączone samodzielnie. Należy pamiętać, że ta opcja będzie działać tylko w przypadku używania wartości domyślnej i FocusProvider w plice DefaultPointerMediator MRTK.

Przykład: Wyłączanie promieni dłoni w mrTK

Poniższy kod wyłączy promienie dłoni w mrTK:

// Turn off all hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff);

// Turn off hand rays for the right hand only
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Right);

Poniższy kod spowoduje powrót promieni ręki do ich domyślnego zachowania w mrTK:

PointerUtils.SetHandRayPointerBehavior(PointerBehavior.Default);

Poniższy kod wymusi, że promienie dłoni będą wł., niezależnie od tego, czy można je podchwycić:

// Turn off all hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOn);

Zobacz PointerUtils i , TurnPointersOnOff aby uzyskać więcej przykładów.

FocusProvider

To FocusProvider kohorta, która jest odpowiedzialna za iterowanie po liście wszystkich wskaźników i ustalenie, jaki jest obiekt skoncentrowany dla każdego wskaźnika.

W każdym Update() wywołaniu:

  1. Zaktualizuj wszystkie wskaźniki, rzutując i wykonując wykrywanie trafień zgodnie z konfiguracją przez sam wskaźnik (na przykład wskaźnik sfery mógł określić tryb raycastMode SphereOverlap, więc focusProvider spowoduje kolizję opartą na sphere)

  2. Aktualizowanie obiektu ukierunkowanego na podstawie wskaźnika (tj. jeśli obiekt nabrał fokusu, wyzwoliłoby to również zdarzenia dla tego obiektu, jeśli obiekt utraci fokus, wyzwoli to utracony fokus itp.).

Konfiguracja i cykl życia wskaźnika

Wskaźniki można skonfigurować w sekcji Wskaźniki profilu systemu wejściowego.

Okres istnienia wskaźnika jest zazwyczaj następujący:

  1. Menedżer urządzeń wykryje obecność kontrolera. Ten menedżer urządzeń utworzy następnie zestaw wskaźników skojarzonych z kontrolerem za pośrednictwem wywołania funkcji RequestPointers.

  2. FocusProvider w pętli Update() będzie iterować po wszystkich prawidłowych wskaźnikach i wykonać skojarzoną logikę raycast lub wykrywania trafień. Służy do określania obiektu, który jest skoncentrowany przez każdy konkretny wskaźnik.

    • Ponieważ istnieje możliwość, że wiele źródeł danych wejściowych jest aktywnych w tym samym czasie (na przykład aktywne są dwie dłonie), istnieje również wiele obiektów, które mają fokus w tym samym czasie.
  3. Menedżer urządzeń po odkryniu, że źródło kontrolera zostało utracone, spowoduje odjęcie wskaźników skojarzonych z utraconym kontrolerem.