Sdílet prostřednictvím


Kontrolery, ukazatele a fokus – MRTK2

Kontrolery, ukazatele a zaměření jsou koncepty vyšší úrovně, které staví na základech vytvořených základním vstupním systémem. Společně poskytují velkou část mechanismu pro interakci s objekty ve scéně.

Kontrolery

Kontrolery jsou reprezentace fyzického kontroleru (6 stupňů volnosti, kloubové ruky atd.). Vytvářejí je správci zařízení a zodpovídají za komunikaci s odpovídajícím podkladovým systémem a za jejich překlad do dat a událostí ve tvaru MRTK.a

Například na platformě Windows Mixed Reality je kontroler, WindowsMixedRealityArticulatedHand který zodpovídá za propojení se základními rozhraními API pro sledování rukou ve Windows, aby získal informace o kloubech, pozici a dalších vlastnostech ruky. Zodpovídá za přeměnu těchto dat na relevantní události MRTK (například voláním RaisePoseInputChanged nebo RaiseHandJointsUpdated) a aktualizací vlastního interního stavu tak, aby dotazy pro TryGetJointPose vrátily správná data.

Obecně platí, že životní cyklus kontroleru zahrnuje:

  1. Kontroler se vytvoří správcem zařízení po zjištění nového zdroje (například správce zařízení zjistí a začne sledovat ruku).

  2. Ve smyčce Update() kontroleru volá základní systém rozhraní API.

  3. Ve stejné aktualizační smyčce vyvolá změny vstupních událostí voláním přímo do samotného základního vstupního systému (například zvýšením HandMeshUpdated nebo HandJointsUpdated).

Ukazatele a fokus

Ukazatele se používají k interakci s herními objekty. Tato část popisuje, jak se vytvářejí ukazatele, jak se aktualizují a jak určují objekty, na které jsou fokus. Bude také pokrývat různé typy ukazatelů, které existují, a scénáře, ve kterých jsou aktivní.

Kategorie ukazatele

Ukazatele obecně spadají do jedné z následujících kategorií:

  • Ukazatele na dálku

    Tyto typy ukazatelů se používají k interakci s objekty, které jsou daleko od uživatele (daleko je definováno jako "není blízko"). Tyto typy ukazatelů obvykle přetypovávají čáry, které můžou jít daleko do světa a umožňují uživateli pracovat s objekty, které nejsou hned vedle nich, a manipulovat s nimi.

  • Blízké ukazatele

    Tyto typy ukazatelů se používají k interakci s objekty, které jsou uživateli dostatečně blízké, aby je mohl uchopit, dotýkat se ho a manipulovat s nimi. Obecně platí, že tyto typy ukazatelů interagují s objekty tím, že hledají objekty v blízkém okolí (buď prováděním paprskového vysílání na malé vzdálenosti, kulovým přetypováním objektů v okolí nebo výčtem seznamů objektů, které jsou považovány za uchopitelné nebo dotykové).

  • Teleportovat ukazatele

    Tyto typy ukazatelů se připojují do teleportačního systému, aby zvládly přesun uživatele do umístění, na které cílí ukazatel.

Zprostředkování ukazatele

Vzhledem k tomu, že jeden kontroler může mít více ukazatelů (například kloubová ruka může mít ukazatele blízké i vzdálené interakce), existuje komponenta, která je zodpovědná za zprostředkování toho, který ukazatel by měl být aktivní.

Například když se ruka uživatele přiblíží stisknutelnému tlačítku, ShellHandRayPointer mělo by se přestat zobrazovat a PokePointer mělo by se zapojit.

To je zpracováno pomocí DefaultPointerMediator, který je zodpovědný za určení, které ukazatele jsou aktivní, na základě stavu všech ukazatelů. Jednou z klíčových věcí, které to dělá, je zakázání vzdálených ukazatelů, když je ukazatel blízko objektu (viz DefaultPointerMediator).

Alternativní implementaci zprostředkovatele ukazatele je možné poskytnout změnou PointerMediator vlastnosti v profilu ukazatele.

Jak zakázat ukazatele

Vzhledem k tomu, že zprostředkovatel ukazatele spouští každý rámec, bude nakonec řídit aktivní / neaktivní stav všech ukazatelů. Proto pokud nastavíte vlastnost IsInteractionEnabled ukazatele v kódu, bude přepsána ukazatelem zprostředkovatele každý rámec. Místo toho můžete určit PointerBehavior , jestli mají být ukazatele zapnuté nebo vypnuté. Mějte na paměti, že to bude fungovat jenom v případě, že používáte výchozí FocusProvider a DefaultPointerMediator v MRTK.

Příklad: Zakázání paprsků rukou v MRTK

Následující kód vypne paprsky rukou v 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);

Následující kód vrátí paprsky rukou do výchozího chování v MRTK:

PointerUtils.SetHandRayPointerBehavior(PointerBehavior.Default);

Následující kód vynutí, aby byly paprsky rukou zapnuté, bez ohledu na to, jestli se blíží uchopení:

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

Další příklady najdete v tématu PointerUtils a TurnPointersOnOff .

FocusProvider

Je FocusProvider to tahoun, který je zodpovědný za iteraci seznamu všech ukazatelů a zjištění, co je fokusovaný objekt pro každý ukazatel.

V každém Update() volání to bude:

  1. Aktualizujte všechny ukazatele tak, že provedete raycasting a provedete detekci hitů nakonfigurovanou samotným ukazatelem (například ukazatel koule může určit sphereOverlap raycastMode, takže FocusProvider provede kolizi na základě koule).

  2. Aktualizujte fokusovaný objekt na základě ukazatele (tj. pokud by objekt získal fokus, aktivoval by také události pro tento objekt, pokud objekt ztratil fokus, aktivoval by ztrátu fokusu atd.).

Konfigurace ukazatele a životní cyklus

Ukazatele lze nakonfigurovat v části Ukazatele profilu vstupního systému.

Životnost ukazatele je obecně následující:

  1. Správce zařízení zjistí přítomnost ovladače. Tento správce zařízení pak vytvoří sadu ukazatelů přidružených k kontroleru prostřednictvím volání RequestPointers.

  2. FocusProvider ve své smyčce Update() iteruje všechny platné ukazatele a provede přidruženou logiku detekce raycastu nebo hitu. Používá se k určení objektu, který je zaostřený jednotlivými ukazateli.

    • Vzhledem k tomu, že je možné mít současně aktivních více zdrojů vstupu (například dvě ruce aktivní), je také možné mít více objektů, které mají fokus najednou.
  3. Správce zařízení po zjištění, že došlo ke ztrátě zdroje kontroleru, roztrhne ukazatele přidružené ke ztracenému kontroleru.