Gesta v Unity

Existují dva klíčové způsoby, jak v Unity provést akci, ruční gesta a ovladače pohybu v HoloLens a Imerzivní HMD. K datům pro oba zdroje prostorového vstupu se přistupuje prostřednictvím stejných rozhraní API v Unity.

Unity poskytuje dva hlavní způsoby přístupu k prostorovým vstupním datům pro Windows Mixed Reality. Běžná rozhraní API Input.GetButton/Input.GetAxis fungují napříč několika sadami 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 složených gest vysoké úrovně (GestureRecognizer)

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

Aplikace dokáže také rozpoznávat složená gesta vyšší úrovně pro prostorové vstupní zdroje, gesta klepnutí, podržení, manipulace a navigace. Tato složená gesta napříč rukou i ovladači pohybu můžete rozpoznat pomocí gestRecognizer.

Každá událost gesta v gestu GestureRecognizer poskytuje sourceKind pro vstup a také zacílený hlavní paprsk v době události. Některé události poskytují další kontextové informace.

K zachycení gest pomocí Služby rozpoznávání gest je potřeba provést pouze několik kroků:

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

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

Pokud chcete používat GestureRecognizer, musíte mít vytvořený GestureRecognizer:

GestureRecognizer recognizer = new GestureRecognizer();

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

Pomocí 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

Gesta navigace a manipulace se vzájemně vylučují u instance GestureRecognizer.

Zahájení zachytávání gest

Ve výchozím nastavení gestRecognizer ne monitoruje vstup, dokud není volána metoda StartCapturingGestures(). Je možné, že po zavolána událost gesta StopCapturingGestures() byla provedena vstup před rámcem, kde byl zpracován StopCapturingGestures(). GestRecognizer si bude pamatovat, jestli byl v předchozím snímku, ve kterém k gestu skutečně došlo, zamíří nebo vypne monitorování gest, a proto je spolehlivé spustit a zastavit monitorování gest na základě cílení na pohled 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 odběru událostí.

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

Vykreslení modelu ovladače pohybu v Unity

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

Pokud chcete v aplikaci vykreslit ovladače pohybu, které odpovídají fyzickým řadičům, které vaši uživatelé drží a vykreslují při stisknutí různých tlačítek, můžete použít předfab MotionControlleru v Mixed Reality Toolkit . Toto předfab dynamicky načte správný model glTF za běhu z ovladače nainstalovaného ovladače ovladače pohybu systému. Je důležité tyto modely dynamicky načítat, nikoli je importovat ručně v editoru, aby vaše aplikace pro všechny aktuální a budoucí kontrolery, které vaši uživatelé budou mít, budou zobrazovat fyzicky přesné 3D modely.

  1. Postupujte podle Začínáme a stáhněte si Mixed Reality Toolkit a přidejte ho do projektu Unity.
  2. Pokud jste v rámci následujících kroků nahradili fotoaparát předfab MixedRealityCameraParent Začínáme, můžete se do toho účastnit! Toto předběžnéfab zahrnuje vykreslování ovladače pohybu. V opačném případě přidejte do scény soubor Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab z Project panelu. Toto předfab budete chtít přidat jako podřízený objekt jakéhokoli nadřazeného objektu, který použijete k přesunutí fotoaparátu, když se uživatel teleportuje ve vaší scéně, aby kontrolery šly s uživatelem. Pokud vaše aplikace nezahrnuje teleportaci, stačí přidat předfab do kořenového adresáře scény.

Vyvolání objektů

Házení objektů ve virtuální realitě je obtížnější, než by se na první pohled mohlo zdát. Stejně jako u většiny fyzicky založených interakcí se při házení ve hře chová neočekávaným způsobem, je to okamžitě zřejmé a ponoří se do ponoření. Strávili jsme nějaký čas hlouběji přemýšlením o tom, jak reprezentovat fyzicky správné chování při házení, a přišli jsme s několika pokyny, které nám umožnily aktualizace naší platformy, o které bychom se s vámi chtěli podělit.

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

  • Použijte rychlost kontroleru místo pozice. V listopadové aktualizaci na Windows jsme zavedli změnu chování ve stavu přibližného sledování pozice. V tomto stavu se budou informace o rychlosti kontroleru hlásit i nadále, dokud budeme mít za to, že jeho vysoká přesnost je často delší, než je i nadále vysoká přesnost pozice.

  • Začleňuje rychlost angular kontroleru. Tato logika je obsažená v throwing.cs souboru ve GetThrownObjectVelAngVel statické metodě v balíčku uvedeném výše:

    1. Při úspořové rychlosti musí vyvolaný objekt udržovat stejnou angular rychlost jako v okamžiku hodu: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Vzhledem k tomu, že střed vyvolaných objektů pravděpodobně není na počátku pozice úchytu, má pravděpodobně jinou rychlost než kontroler v referenčním rámci uživatele. Podíl rychlosti objektu tímto způsobem představuje okamžitou tangensovou rychlost středu vyvolaného objektu kolem původu kontroleru. Tato tangensní rychlost je křížovým součtem angular rychlosti kontroleru s vektorem představujícím vzdálenost mezi původem kontroleru a středem vyvolaného objektu.

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

  • Věnujte pozornost času, ve kterém rychlost aplikujeme. Při stisknutí tlačítka může trvat až 20 ms, než se tato událost Bluetooth do operačního systému. To znamená, že pokud se dotazíte na změnu stavu kontroleru z stisknutí na nestisknutou nebo naopak, bude kontroler představovat informace, které s ním získáte, ve skutečnosti před touto změnou stavu. Dále se předpovídá pozice kontroleru prezentované rozhraním API pro cyklické dotazování tak, aby odrážela pravděpodobnou pozici v době, kdy se snímek zobrazí, což může být v budoucnu více než 20 ms. To je vhodné pro vykreslení ložených objektů, ale při výpočtu vlastnosti trajectory pro okamžik, kdy uživatel uvolnil hod, zomeňuje náš časový problém při cílení na objekt. Když se naštěstí v listopadové aktualizaci odesílala událost Unity, jako je InteractionSourcePressed nebo InteractionSourceReleased, stav obsahuje historická data o pozici zpět při stisknutí nebo uvolnění tlačítka. Pokud chcete získat nejpřesnější vykreslování kontroleru a cílení kontroleru během vyvolání, musíte správně použít dotazování a eventing podle potřeby:

  • Použijte pozici sekce. Angular rychlost a rychlost jsou hlásit relativní vzhledem k pozice úchytu, nikoli k pozici ukazatele.

V budoucích aktualizacích se bude Windows a můžete očekávat, že o ní najdete další informace.

Gesta a ovladače pohybu v MRTK

K gestu a ovladači pohybu můžete přistupovat ze správce vstupu.

Postupujte podle kurzů.

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

MR Input 213 – Ovladač pohybu
MR Input 213 – Ovladač pohybu

Další vývojový kontrolní bod

Pokud postupujete podle cesty vývoje Unity, kterou jsme si nachysnuli, jste v prostředcích k prozkoumání základních stavebních bloků MRTK. Odtud můžete pokračovat k dalšímu stavebnímu bloku:

Nebo můžete přejít Mixed Reality platformy a rozhraní API:

Kdykoli se můžete vrátit k vývojových kontrolních bodům Unity.

Viz také