Architektura interakce – MRTK3
MRTK vychází ze sady interagátorů nabízených sadou nástrojů XR Interaction Toolkit pro Unity. Funkce hybridní reality, jako je kloubové sledování rukou, pohled a špendlík, vyžadují propracovanější interakce, než sada poskytovaná XRI ve výchozím nastavení. MRTK definuje nová rozhraní interagátoru, kategorizovaná obecně podle vstupního režimu a odpovídajících implementací.
Souhrn a revize
Pro vývojáře, kteří s XRI teprve začíná, doporučujeme nejprve zkontrolovat dokumentaci k architektuře XRI Unity. Interagátory MRTK jsou podtřídy existujících interagátorů XRI nebo implementací rozhraní interakce XRI. Viz dokumentace Unity k architektuře interakce, která platí také pro MRTK.
Dobré občany XRI
Vlastní interakce MRTK se dobře chovají s ohledem na výchozí rozhraní interakce XRI; z pohledu systémů XRI jsou nerozlišitelné od interagátorů "vanilla". Inverzní funkce je také pravdivá; Při sestavování pokročilých interaktivovatelných interaktivně v MRTK budou výchozí interaktivátory XRI stále fungovat pro základní najetí myší a vybrat. Je součástí úsilí MRTK, aby bylo plně kompatibilní s existujícími projekty XRI. Pokud máte aplikaci XRI, bude s existujícím nastavením XRI fungovat interakce MRTK a ovládací prvky uživatelského rozhraní.
Abstrakce vstupního způsobu
Vstupní zařízení, interagátor provádějící interakci a události interakce, které vygenerují, jsou všechny v XRI izolované architekturou. Tato izolace je důležitá pro strategii abstrakce vstupu v MRTK3 a umožňuje nám psát interakce mezi platformami a zařízeními, které dobře fungují ve všech kontextech.
Z MRTK v2 existuje běžný instinkt pro interakce kódu specifické pro konkrétní typ vstupu nebo zařízení. Mnoho vývojářů je zvyklé na psaní interakcí, které reagují konkrétně na blízkou chytání, daleko ray nebo nějaký jiný konkrétní typ vstupu.
I když MRTK3 stále umožňuje nejednoznačnost a detekci jednotlivých režimů vstupu, interakce s pevným kódováním na konkrétní jednotlivé vstupní typy se uměle omezují a snižují flexibilitu vašich interakcí. Další informace najdete v dokumentaci k interagovatelné architektuře, ale klíčem pro interagátory je, že obvykle nemusí mapovat 1:1 se vstupními zařízeními.
AttachTransform a Inversion of Control
Velká část toho, co MRTK v2 dělala v "přesouvání logiky" jako součást ObjectManipulator
, Slider
a tak dále, je nyní zodpovědností samotného interakce. Interagátor teď řídí svůj attachTransform a definuje, jak se chová konkrétní typ manipulace. Nikdo už nemusí psát složitou logiku interakce na interagovatelné, která se liší mezi vstupními způsoby; místo toho může jednotná logika manipulace naslouchat attachTransform
jejich představě bez ohledu na vstupní způsob nebo zařízení, které ho řídí.
Například GrabInteractor
písmeno 's attachTransform
se nachází v místě uchopení na rukou nebo kontroleru. Je XRRayInteractor
attachTransform
umístěn v místě hitu na konci paprsku. attachTransform
Nachází CanvasProxyInteractor
se všude, kde myš kliknula. U všech těchto různých interagátorů nemusí interakce zajímat typ interakce, aby mohla správně reagovat na manipulace.
Interagovatelné dotazy a attachTransform
mohou zacházet se attachTransform
stejnými typy bez ohledu na typ interakce.
Tento přístup je kritický pro kompatibilitu s existujícími interaktivátory XRI a také pro budoucí testování interakcí pro vstupní režimy, které ještě nebyly vyvinuty. Pokud je zavedena nová metoda zadávání, nemusíte měnit existující interagovatelné, pokud nový interagátor generuje platný a dobře se chovaný attachTransform
.
Tak, externě, attachTransform
je to logika interakce. U všech vlastních interakcí vždy dáváte přednost zápisu nového interakce s novou attachTransform
logikou místo přepsání nebo rozšíření interagovatelných možností pro vaši novou interakci. Díky tomu můžou všechny stávající interakce využívat výhody vaší nové interakce místo těch, které jste přepsali nebo rozšířili.
XRControllers a vstupní vazba
Většina interagátorů neváže přímo na vstupní akce. Většina je odvozena od XRBaseControllerInteractor
, která vyžaduje XRController
nad interakci v hierarchii. Vazby XRController
na vstupní akce a pak rozšíří příslušné akce (vybrat atd.) dolů do všech připojených interaktivátorů.
Některé interakce však mohou potřebovat speciální vstupní vazby nebo další vstup, které XRController
neposkytuje. V těchto případech mají interakce možnost svázat přímo s vlastními jedinečnými vstupními akcemi nebo dokonce použít jiné než vstupní zdroje pro logiku interakce. Základní třídy XRI dávají přednost naslouchání XRController
vazbám ', ale toto chování lze přepsat pro použití externích nebo alternativních vstupních zdrojů.
Rozhraní
XRI definuje základní IXRInteractor
, IXRHoverInteractor
, IXRSelectInteractor
a IXRActivateInteractor
. MRTK definuje další rozhraní pro interagátory. Některé zpřístupňují další informace o interakcích specifických pro MRTK a jiné jsou jednoduše pro kategorizaci a identifikaci. Tato rozhraní jsou všechna umístěná v balíčku Core , zatímco implementace se nacházejí v jiných balíčcích, včetně vstupu.
Důležité
I když tato rozhraní jsou užitečná v případě, že potřebujete filtrovat konkrétní typ interakce, doporučujeme, abyste pevně nezakódoval vaše interakce, abyste naslouchali těmto rozhraním konkrétně. V každé situaci vždy upřednostnit obecný XRI isSelected a isHovered, nikoli jakékoli rozhraní specifické pro interakci.
Pokud to není nutné, neměli byste odkazovat na konkrétní implementace MRTK těchto rozhraní v interagovatelných prostředích, pokud to není nezbytně nutné. Ve všech případech je lepší odkazovat na rozhraní. Explicitní odkazování na konkrétní typy omezí interakce tak, aby fungovaly pouze s aktuálními existujícími typy. Odkazováním pouze na rozhraní zajistíte kompatibilitu s budoucími implementacemi, které nemusí podtřídět stávající implementace.
IVariableSelectInteractor
Interagátory, které implementují toto rozhraní, mohou vydávat proměnné (tj. analogové) vybrané možnosti pro interakci. Proměnná select amount může být dotazována s SelectProgress
vlastností. Interakce MRTK, které implementují toto rozhraní, zahrnují a MRTKRayInteractor
GazePinchInteractor
. Základní interagovatelné objekty (výchozí interagovatelné XRI a MRTKBaseInteractable
) nebudou ovlivněny velikostí výběru proměnných, StatefulInteractable
ale naslouchá této hodnotě a vypočítá její Selectedness
výpočet na max()
základě všech zúčastněných proměnných a ne proměnných interagátorů.
IGazeInteractor
Interakce, které toto rozhraní implementují, představují pasivní pohled uživatele odděleně od jakékoli manipulace nebo záměru. Implementace MRTK je FuzzyGazeInteractor
, která dědí z XRI XRRayInteractor
a přidává přibližnou kuželovou logiku přetypování. XRBaseInteractable
označí příznakem IsGazeHovered
IGazeInteractor
při najetí myší.
IGrabInteractor
Interakce, které implementují toto rozhraní, představují fyzickou interakci s chytnutím téměř pole. Je attachTransform
definován jako bod pro uchopení. Implementace MRTK je GrabInteractor
, který podtřídy XRI XRDirectInteractor
je .
IPokeInteractor
Interakce, které implementují toto rozhraní, představují interakci s rukopisem. Všimněte si, že to nemusí nutně znamenat prst! Libovolné interagátory mohou implementovat toto rozhraní a nabízet interakce rukopisu z jiných zdrojů. V jedné z několika instancí, kde je kontrola rozhraní interagátoru dobrou myšlenkou, interagovatelné, jako PressableButton
je naslouchání s IPokeInteractor
, konkrétně pro řízení hlasitosti stisknutí. Každý interagátor, který implementuje IPokeInteractor
, vyvolá 3D stisknutí na tlačítkách.
IPokeInteractor
PokeRadius
zveřejňuje vlastnost, která definuje vlastnosti objektu poking. Poke je považován za střed na attachTransform
a rozšiřuje směrem ven od attachTransform
PokeRadius
okraji . Interagovatelné, jako je PressableButton
posun jejich 3D odsunutí vzdálenosti tímto poloměrem, což může být řízeno fyzickou tloušťkou prstu uživatele v případě tisků založených na prstech.
Implementace MRTK tohoto rozhraní je PokeInteractor
. V našem projektu šablony také poskytujeme další příklad IPokeInteractor
, který není řízený prstem. PenInteractor
Poskytuje interakce s poke rootem na špičce virtuálního 3D pera.
IRayInteractor
Interakce, které implementují toto rozhraní, představují interakci s bodováním na základě paprsku. Představuje attachTransform
umístění paprsku na povrchu cílového objektu během výběru.
Implementace MRTK tohoto rozhraní je MRTKRayInteractor
, dědění přímo z XRI XRRayInteractor
.
Poznámka:
XRI XRRayInteractor
neimplementuje toto rozhraní MRTK.
ISpeechInteractor
Interakce, které toto rozhraní implementují, představují interakce řízené řečí. Implementace MRTK je SpeechInteractor
.
MRTK SpeechInteractor
interně používá PhraseRecognitionSubsystem
a odebírá události interakce registrace z XRI XRInteractionManager
. Interakce však nemusí být znepokojena tím, jaký subsystém provádí zpracování řeči; ISpeechInteractor
s vygeneruje stejné události XRI (výběr atd.), které dělá jakýkoli jiný interagátor.
IGazePinchInteractor
Toto rozhraní je jednoduše specializace IVariableSelectInteractor
rozhraní. Interagátory, které implementují toto rozhraní, jsou implicitně, interakce s proměnnými a výběry. IGazePinchInteractor
s výslovně představují nepřímo cílenou vzdálenou manipulaci. Samostatný interagátor založený na pohledu řídí cíl interakce a manipulace je rukou nebo kontrolerem. attachTransform
chová se stejným způsobem, jako IRayInteractor
attachTransform
tomu je; přichytí se k bodu dosažení cíle při zahájení výběru.
Když se více IGazePinchInteractor
účastníků účastní jedné interakce, attachTransform
jejich s jsou posunuty posunutím z mediánu mezi všemi zúčastněnými body špendlíku. Interagovatelné tedy mohou interpretovat tyto attachTransform
hodnoty stejným způsobem jako pro jakoukoli jinou interakci s více rukama, jako jsou attachTransforms
interakce z chytání nebo interakce paprsků.
Implementace MRTK je .GazePinchInteractor
IHandedInteractor
Někteří interagátoři se můžou rozhodnout implementovat IHandedInteractor
rozhraní, aby explicitně určili, že jsou přidruženy k určité ruce na uživateli. Některé interakce nejsou spojené s předáním, a proto to neimplementují. Nejběžnější příklady by byly takové, jako SpeechInteractor
nebo FuzzyGazeInteractor
.
Interagátory MRTK, které implementují toto rozhraní, jsou HandJointInteractor
obecné, abstraktní XRDirectInteractor
řízené libovolnou rukou kloub, a GazePinchInteractor
MRTKRayInteractor
.
Interagovatelné v současné době toto rozhraní používají k vyvolání určitých efektů při výběru, které musí být nejednoznačné mezi levou nebo pravou rukou. Nejvýznamnějším příkladem je pulse efekt v knihovně komponent uživatelského rozhraní.