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:
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).
W pętli Update() kontrolera wywołuje on swój podstawowy system interfejsu API.
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:
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)
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:
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
.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.
Menedżer urządzeń po odkryniu, że źródło kontrolera zostało utracone, spowoduje odjęcie wskaźników skojarzonych z utraconym kontrolerem.