Sdílet prostřednictvím


Gesta v Unity

Existují dva klíčové způsoby, jak na pohled v Unity provádět akce, gesta rukou a ovladače pohybu v HoloLens a Asistivní HMD. K datům pro oba zdroje prostorového vstupu přistupujete prostřednictvím stejných rozhraní API v Unity.

Unity poskytuje dva primární způsoby přístupu k prostorovými vstupními daty pro Windows Mixed Reality. Běžná rozhraní API Input.GetButton/Input.GetAxis fungují napříč několika sadami SDK Unity XR, 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

Vaše aplikace také dokáže rozpoznat složená gesta vyšší úrovně pro prostorové vstupní zdroje, klepnutí, přidržování, manipulaci a navigační gesta. Tato složená gesta můžete rozpoznat v rukou i ovladačích pohybu pomocí nástroje GestureRecognizer.

Každá událost gesta na GestoRecognizer poskytuje SourceKind pro vstup, stejně jako cílení head ray v době události. Některé události poskytují další kontextové informace.

K zachycení gest pomocí rozpoznávání gest je potřeba provést jen 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žít gestognizátor, musíte mít vytvořenou funkci GestureRecognizer:

GestureRecognizer recognizer = new GestureRecognizer();

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

Určete, která gesta vás zajímají prostřednictvím SetRecognizableGestures():

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:

Navigační a manipulační gesta se vzájemně vylučují na instanci gestaRecognizer.

Zahájení zachytávání gest

Ve výchozím nastavení gestorecognizer nemonitoruje vstup, dokud se nevolá StartCapturingGestures(). Je možné, že událost gesta může být vygenerována po zavolání StopCapturingGestures(), pokud byl vstup proveden před rámec, ve kterém byl zpracován StopCapturingGestures(). Gestognizátor si bude pamatovat, jestli byl 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ě cílení pohledu tohoto rámce.

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 odhlásit 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;
}

Vykreslení modelu ovladače pohybu v Unity

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

Chcete-li vykreslit ovladače pohybu ve vaší aplikaci, které odpovídají fyzickým řadičům, které uživatelé drží, a vyjádřit je při stisknutí různých tlačítek, můžete použít prefab MotionController v sadě nástrojů Mixed Reality. Tento prefab dynamicky načte správný model glTF za běhu z nainstalovaného ovladače ovladače ovladače pohybu systému. Je důležité načíst tyto modely dynamicky, nikoli je importovat ručně v editoru, aby aplikace zobrazovala fyzicky přesné 3D modely pro všechny aktuální a budoucí kontrolery, které vaši uživatelé můžou mít.

  1. Podle pokynů Začínáme stáhněte sadu nástrojů Mixed Reality a přidejte ji do projektu Unity.
  2. Pokud jste v rámci kroků Začínáme nahradili fotoaparát prefab MixedRealityCameraParent , můžete začít! Tento prefab zahrnuje vykreslování ovladače pohybu. V opačném případě přidejte prostředky/HoloToolkit/Input/Prefabs/MotionControllers.prefab do scény z podokna Projekt. Tento předpřipravený objekt budete chtít přidat jako dítě jakéhokoli nadřazeného objektu, který použijete k přesunutí kamery, když uživatel teleportuje ve vaší scéně, aby byly řadiče součástí uživatele. Pokud vaše aplikace nezahrnuje teleportování, stačí přidat prefab v kořenovém adresáři scény.

Vyvolávání objektů

Vyvolání objektů ve virtuální realitě je obtížnější problém, než se může zdát. Stejně jako u většiny fyzicky založených interakcí, při hodu do hry se chová neočekávaně, je okamžitě zřejmé a zlomí se ponořit. Strávili jsme určitou dobu přemýšlet o tom, jak reprezentovat fyzicky správné chování a připravili jsme několik pokynů, které jsme povolili prostřednictvím aktualizací naší platformy, které bychom s vámi rádi sdíleli.

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

  • Místo pozice použijte rychlost kontroleru. V listopadové aktualizaci systému Windows jsme zavedli změnu chování, když je ve stavu sledování pozice Přibližná hodnota. V tomto stavu budou informace o rychlosti o kontroleru nadále hlášeny, dokud se domníváme, že jeho vysoká přesnost, která je často delší než pozice, zůstává vysoká přesnost.

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

    1. Vzhledem k zachování úhlové rychlosti musí hozený objekt zachovat stejnou úhlovou rychlost, jakou měl v okamžiku hodu: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Vzhledem k tomu, že střed hmotnosti vyvolaného objektu pravděpodobně není na počátku pozice úchytu, má pravděpodobně jinou rychlost než kontroler v rámci odkazu uživatele. Část rychlosti objektu tímto způsobem přispěla je okamžitá tangenciální rychlost středu hmoty 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í vzdálenost mezi původem kontroleru a středem hmotnosti 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 tangenciální rychlosti: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Věnujte úzkou pozornost času , kdy používáme rychlost. Když je tlačítko stisknuto, může to trvat až 20 ms, než se tato událost přehodí přes Bluetooth do operačního systému. To znamená, že pokud se dotazujete na změnu stavu kontroleru z stisknutí na nestisknutou nebo naopak, zobrazí kontroler informace, které s ním získáte, bude ve skutečnosti před touto změnou ve stavu. Dále se predikuje, že kontroler představuje naše rozhraní API pro dotazování tak, aby odrážel pravděpodobné pozice v době zobrazení rámce, což může být v budoucnu více než 20 ms. To je vhodné pro vykreslení uložených objektů, ale sloučí náš problém s časem, kdy cílíme na objekt při výpočtu trajektorie pro okamžik, kdy uživatel vyvolil hod. Při listopadové aktualizaci se naštěstí odešle událost Unity, jako je InteractionSourcePressed nebo InteractionSourceReleased , stav obsahuje historická data o tom, kdy bylo tlačítko stisknuto nebo vydáno. 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 události podle potřeby:

    • Pro vykreslení každého snímku by vaše aplikace měla umístit GameObject kontroleru na předpovězený řadič pro aktuální čas foton času. Tato data získáte z rozhraní API pro dotazování Unity, jako je XR. InputTracking.GetLocalPosition nebo XR. WSA. Input.InteractionManager.GetCurrentReading.
    • Pro kontroler, který cílí na tisk nebo uvolnění, by vaše aplikace měla raycast a vypočítat trajektorie na základě historického kontroleru pro danou událost tisku nebo uvolnění. Tato data získáte z rozhraní API pro události Unity, jako je InteractionManager.InteractionSourcePressed.
  • Použijte pozici úchytu. Úhlová rychlost a rychlost jsou hlášeny vzhledem k pozici úchytu, nikoli k pozici ukazatele.

Vyvolání bude pokračovat v vylepšování s budoucími aktualizacemi Windows a můžete očekávat, že najdete další informace o této aktualizaci.

Gesta a ovladače pohybu v MRTK

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

Řiďte se kurzy

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

Kontrolní bod dalšího vývoje

Pokud sledujete cestu vývoje Unity, kterou jsme vytvořili, 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 možnosti platformy a rozhraní API hybridní reality:

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

Viz také