Gesta v Unity

Existují dva klíčové způsoby, jak v Unity jednat se svým pohledem: gesta rukou a ovladače pohybu v HoloLensu a Immersive HMD. K datům pro oba zdroje prostorového vstupu přistupujete prostřednictvím stejných rozhraní API v Unity.

Unity poskytuje dva hlavní způsoby přístupu k prostorových vstupním datům pro Windows Mixed Reality. Běžná rozhraní API Input.GetButton/Input.GetAxis fungují ve více sadách Unity XR SDK, zatímco rozhraní API InteractionManager/GestureRecognizer specifické pro Windows Mixed Reality zveřejňuje úplnou sadu prostorových vstupních dat.

Rozhraní API pro složená gesta vysoké úrovně (GestureRecognizer)

Obor názvů:UnityEngine.XR.WSA.Input
Typy: GestureRecognizer, GestureSettings, InteractionSourceKind

Vaše aplikace dokáže také rozpoznat složená gesta vyšší úrovně pro prostorová vstupní gesta, gesta klepnutí, podržení, manipulace a navigace. Tato složená gesta můžete rozpoznat na rukou i na ovladačích pohybu pomocí GestureRecognizer.

Každá událost Gesture na GestureRecognizer poskytuje SourceKind pro vstup a také head ray cílení v době události. Některé události poskytují další kontextové informace.

K zachycení gest pomocí Rozpoznávání gest je potřeba jen několik kroků:

  1. Vytvoření nového rozpoznávání gest
  2. Určení gest, která se mají watch
  3. Přihlášení k odběru událostí pro tato gesta
  4. Zahájení pořizování gest

Vytvoření nového rozpoznávání gest

Pokud chcete použít GestureRecognizer, musíte mít vytvořenou gestognizer:

GestureRecognizer recognizer = new GestureRecognizer();

Určení gest, která se mají watch

Pomocí rutiny SetRecognizableGestures() určete, která gesta vás zajímají:

recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);

Přihlášení k odběru událostí pro tato gesta

Přihlaste se k odběru událostí pro gesta, která vás zajímají.

void Start()
{
    recognizer.Tapped += GestureRecognizer_Tapped;
    recognizer.HoldStarted += GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}

Poznámka

Navigace a manipulace gesta se vzájemně vylučují na instanci GestureRecognizer.

Zahájení pořizování gest

Ve výchozím nastavení gestognizer nemonitoruje vstup, dokud není volána funkce StartCapturingGestures(). Je možné, že po zavolání metody StopCapturingGestures() může být vygenerována událost gesta, pokud byl vstup proveden před rámcem, ve kterém byla zpracována funkce StopCapturingGestures(). Gestognizer si bude pamatovat, jestli bylo zapnuté nebo vypnuté během předchozího snímku, ve kterém se gesto skutečně objevilo, a proto je spolehlivé spustit a zastavit sledování gest na základě zaměření pohledu tohoto snímku.

recognizer.StartCapturingGestures();

Zastavení zachytávání gest

Zastavení rozpoznávání gest:

recognizer.StopCapturingGestures();

Odebrání rozpoznávání gest

Před zničením objektu GestureRecognizer nezapomeňte zrušit odběr odebíraných událostí.

void OnDestroy()
{
    recognizer.Tapped -= GestureRecognizer_Tapped;
    recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}

Vykreslování modelu ovladače pohybu v Unity

Model a teleportace ovladače pohybu
Model ovladače pohybu a teleportace

Pokud chcete v aplikaci vykreslit ovladače pohybu, které odpovídají fyzickým ovladačům, které vaši uživatelé drží a které jsou artikulované při stisknutí různých tlačítek, můžete použít prefab MotionController v sadě nástrojů Mixed Reality Toolkit. Tento prefab dynamicky načte správný model glTF za běhu z ovladače pohybu nainstalovaného v systému. Místo ručního importu v editoru je důležité tyto modely načítat dynamicky, aby aplikace zobrazovala fyzicky přesné 3D modely pro všechny aktuální a budoucí kontrolery, které vaši uživatelé mohou mít.

  1. Podle pokynů pro Začínáme stáhněte sadu nástrojů Mixed Reality a přidejte ji do projektu Unity.
  2. Pokud jste v rámci Začínáme kroků nahradili kameru prefab MixedRealityCameraParent, můžete začít! Tento prefab zahrnuje vykreslování ovladače pohybu. Jinak přidejte assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab do scény z podokna Projekt. Tento prefab budete chtít přidat jako podřízený objekt nadřazeného objektu, který používáte k přesouvání kamery, když se uživatel teleportuje v rámci scény, aby ovladače byly spolu s uživatelem. Pokud vaše aplikace nezahrnuje teleportování, stačí přidat prefab do kořenového adresáře scény.

Vyvolávání objektů

Házení objektů ve virtuální realitě je těžší problém, než se může na první pohled zdát. Stejně jako u většiny fyzických interakcí, při hodu do hry jedná neočekávaným způsobem, je to okamžitě zřejmé a přeruší ponoření. Nějakou dobu jsme důkladně přemýšleli o tom, jak vyjádřit fyzicky správné chování při hodu, a připravili jsme několik pokynů, které jsme povolili prostřednictvím aktualizací naší platformy a o které bychom se s vámi rádi podělili.

Příklad toho, jak doporučujeme implementovat vyvolání, najdete tady. Tato ukázka se řídí těmito čtyřmi pokyny:

  • Místo polohy použijte rychlost ovladače. V listopadové aktualizaci windows jsme zavedli změnu v chování ve stavu přibližného sledování pozice. V tomto stavu se informace o rychlosti kontroleru budou hlásit tak dlouho, dokud se domníváme, že je její vysoká přesnost, která je často delší než poloha zůstává vysoká přesnost.

  • Začleňte úhlovou rychlost ovladače. Tato logika je obsažená v throwing.cs souboru ve GetThrownObjectVelAngVel statické metodě v rámci výše uvedeného balíčku:

    1. Při zachování úhlové rychlosti musí hozený objekt udržovat stejnou úhlovou rychlost jako v okamžiku hodu: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Vzhledem k tomu, že střed hmotnosti hozeného objektu pravděpodobně není na počátku pozice úchytu, má pravděpodobně jinou rychlost než ovladač v referenčním rámci uživatele. Část rychlosti objektu, ke které se tímto způsobem přispívá, je okamžitá tangenciální rychlost středu hmotnosti vyhozeného objektu kolem původu kontroleru. Tato tangenciální rychlost je křížovým součinem úhlové rychlosti kontroleru s vektorem představujícím vzdálenost mezi počátkem ovladače a hmotnostním středem hozeného objektu.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. Celková rychlost hozeného objektu je součet rychlosti ovladače a této tangenciální rychlosti: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Věnujte velkou pozornost času , ve kterém používáme rychlost. Když stisknete tlačítko, může trvat až 20 ms, než se událost probublá přes Bluetooth do operačního systému. To znamená, že pokud se dotazujete na změnu stavu kontroleru ze stisknutého na nestisknuté nebo naopak, zobrazí se informace kontroleru, které s ním získáte, ve skutečnosti před touto změnou stavu. Dále se předpokládá, že pozice kontroleru prezentovaná naším rozhraním API pro dotazování bude odrážet pravděpodobnou pozici v okamžiku zobrazení rámce, který by v budoucnu mohl být delší než 20 ms. To je vhodné pro vykreslování držených objektů, ale problém s časem pro cílení na objekt se prokomplikuje při výpočtu trajektorie pro okamžik, kdy uživatel uvolnil hod. Naštěstí v listopadové aktualizaci platí, že když se odešle událost Unity, jako je InteractionSourcePressed nebo InteractionSourceReleased , tento stav zahrnuje historická data pozice zezadu, když bylo tlačítko stisknuto nebo uvolněno. Pokud chcete dosáhnout co nejpřesnějšího vykreslování kontroleru a cílení na řadič během hodů, musíte správně použít dotazování a vytváření událostí podle potřeby:

    • Aby ovladač vykresloval jednotlivé snímky, měla by vaše aplikace umístit gameObject ovladače na pozici ovladače předpovězené dopředu pro fotonový čas aktuálního snímku. Tato data získáte z rozhraní API pro dotazování Unity, jako je XR. InputTracking.GetLocalPosition nebo XR. WSA. Input.InteractionManager.GetCurrentReading.
    • Pokud chcete ovladač cílit na tisk nebo vydání, měla by vaše aplikace přenastavovat a vypočítat trajektorii na základě historické pozice kontroleru pro danou tiskovou nebo uvolňovací událost. Tato data získáte z rozhraní API událostí Unity, jako je InteractionManager.InteractionSourcePressed.
  • Použijte pozici rukojeti. Angular rychlost a rychlost jsou hlášeny vzhledem k pozici úchopu, nikoli pozice ukazatele.

Vyvolání se bude s budoucími aktualizacemi Windows dál zlepšovat a můžete očekávat, že další informace najdete tady.

Gesta a ovladače pohybu v MRTK

Ke gestům a ovladači pohybu se dostanete ze Správce vstupu.

Postupujte podle kurzů.

Podrobné kurzy s podrobnějšími příklady přizpůsobení jsou k dispozici v Mixed Reality Academy:

MR vstup 213 - Ovladač pohybu
MR vstup 213 - Ovladač pohybu

Další vývojový kontrolní bod

Pokud sledujete cestu vývoje Unity, kterou jsme nastavili, jste uprostřed zkoumání základních stavebních bloků MRTK. Odtud můžete pokračovat k dalšímu stavebnímu bloku:

Nebo přejděte na Mixed Reality možností platformy a rozhraní API:

Ke kontrolním bodům vývoje Unity se můžete kdykoli vrátit.

Viz také