Kontrolery, wskaźniki i fokus — MRTK2

Kontrolery, wskaźniki i fokus to koncepcje wyższego poziomu, które opierają się 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 stopni swobody, ręki przegubowej itp.). Są one tworzone przez menedżerów urządzeń i są odpowiedzialne za komunikację z odpowiednim systemem bazowym i tłumaczenie tych danych na dane i zdarzenia w kształcie zestawu narzędzi MRTK.a

Na przykład na platformie WindowsMixedRealityArticulatedHand Windows Mixed Reality jest kontrolerem odpowiedzialnym za współdziałanie z podstawowymi interfejsami API śledzenia rąk systemu Windows w celu uzyskania informacji o stawach, pozowaniu i innych właściwościach strony. Jest on odpowiedzialny za przekształcenie tych danych w odpowiednie zdarzenia zestawu narzędzi MRTK (na przykład przez wywołanie metody RaisePoseInputChanged lub RaiseHandJointsUpdated) oraz zaktualizowanie własnego stanu wewnętrznego w celu zwrócenia poprawnych danych przez TryGetJointPose zapytania.

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 uruchamia śledzenie ręki).

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

  3. W tej samej pętli aktualizacji zgłasza zmiany zdarzeń wejściowych przez wywołanie bezpośrednio do podstawowego systemu wejściowego (na przykład wywoływanie metody HandMeshUpdated lub HandJointsUpdated).

Wskaźniki i fokus

Wskaźniki są używane do interakcji z obiektami gry. W tej sekcji opisano sposób tworzenia wskaźników, sposobu ich aktualizowania oraz określania obiektów, które znajdują się w fokusie. Obejmuje również różne typy wskaźników, które istnieją, oraz scenariusze, w których są aktywne.

Kategorie wskaźników

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

  • Skrajne wskaźniki

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

  • Wskaźniki zbliżone

    Te typy wskaźników są używane do interakcji z obiektami, które są wystarczająco blisko użytkownika, aby chwytać, dotykać i manipulować. Ogólnie rzecz biorąc, te typy wskaźników wchodzą w interakcje z obiektami, wyszukując obiekty w pobliżu w pobliżu (wykonując raycasting w małych odległościach, wykonując odlewanie sferyczne wyszukujące obiekty w pobliżu lub wyliczając listy obiektów, które są uważane za chwytalne/dotykowe).

  • Wskaźniki teleportu

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

Korygowanie wskaźnika

Ponieważ pojedynczy kontroler może mieć wiele wskaźników (na przykład przegubiona ręka może mieć zarówno wskaźniki interakcji zbliżone, jak i daleko), istnieje składnik odpowiedzialny za pośredniccę, który wskaźnik powinien być aktywny.

Na przykład gdy ręka użytkownika zbliża się do przycisku z możliwością naciśnięcia, ShellHandRayPointer element powinien przestać być wyświetlany, a element PokePointer powinien być zaangażowany.

Jest to obsługiwane przez element DefaultPointerMediator, który jest odpowiedzialny za określenie, które wskaźniki są aktywne, na podstawie stanu wszystkich wskaźników. Jedną z kluczowych czynności, które robi to, jest wyłączenie wskaźników o dużej odległości, gdy wskaźnik zbliżony jest do obiektu (zobacz DefaultPointerMediator).

Istnieje możliwość zapewnienia alternatywnej implementacji pośrednika wskaźnika poprzez zmianę PointerMediator właściwości na profilu wskaźnika.

Jak wyłączyć wskaźniki

Ponieważ pośrednik wskaźnika uruchamia każdą ramkę, kończy się kontrolowanie aktywnego/ nieaktywnego stanu wszystkich wskaźników. W związku z tym, jeśli ustawisz właściwość IsInteractionEnabled wskaźnika w kodzie, zostanie zastąpiona przez pośrednika wskaźnika każda ramka. Zamiast tego możesz określić, PointerBehavior czy wskaźniki powinny być włączone, czy wyłączone samodzielnie. Należy pamiętać, że będzie to działać tylko wtedy, gdy używasz wartości domyślnej FocusProvider i DefaultPointerMediator w zestawie narzędzi MRTK.

Przykład: Wyłącz promienie ręczne w zestawie narzędzi 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 zwróci promienie ręczne do domyślnego zachowania w zestawie narzędzi MRTK:

PointerUtils.SetHandRayPointerBehavior(PointerBehavior.Default);

Poniższy kod wymusi na promieniach dłoni, niezależnie od tego, czy zbliża się do chwytalnego:

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

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

FocusProvider

Jest FocusProvider to konia roboczego, który jest odpowiedzialny za iterowanie nad listą wszystkich wskaźników i ustalenie, co koncentruje się obiekt jest dla każdego wskaźnika.

W każdym Update() wywołaniu:

  1. Zaktualizuj wszystkie wskaźniki przez raycasting i wykrywanie trafień zgodnie z konfiguracją wskaźnika (na przykład wskaźnik sfery może określić sphereOverlap raycastMode, więc FocusProvider wykona kolizję opartą na sferze)

  2. Zaktualizuj obiekt fokusu na podstawie wskaźnika (tj. jeśli obiekt zyskał fokus, spowoduje to również wyzwolenie zdarzeń do tego obiektu, jeśli obiekt utraci fokus, spowoduje to utratę fokusu 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. Następnie menedżer urządzeń utworzy zestaw wskaźników skojarzonych z kontrolerem za pośrednictwem wywołania metody RequestPointers.

  2. Obiekt FocusProvider w pętli Update() wykonuje iterację po wszystkich prawidłowych wskaźnikach i wykonuje skojarzną logikę wykrywania promieni lub trafień. Służy do określania obiektu, który koncentruje się na każdym konkretnym wskaźniku.

    • Ponieważ istnieje wiele źródeł danych wejściowych w tym samym czasie (na przykład aktywne dwie ręce), istnieje również wiele obiektów, które mają fokus w tym samym czasie.
  3. Menedżer urządzeń po wykryciu, że źródło kontrolera zostało utracone, usunie wskaźniki skojarzone z utraconym kontrolerem.