Delen via


Interactiearchitectuur — MRTK3

MRTK bouwt voort op de set interactie die wordt aangeboden door de XR Interaction Toolkit van Unity. Mixed reality-functies, zoals gearticuleerde handtracering, staren en knijpen, vereisen meer uitgebreide interactie dan de set die standaard is geleverd met XRI. MRTK definieert nieuwe interactieinterfaces, die over het algemeen zijn gecategoriseerd op basis van de modaliteit van invoer en de bijbehorende implementaties.

Samenvatting en beoordeling

Voor ontwikkelaars die niet bekend zijn met XRI, raden we u aan eerst de XRI-architectuurdocumentatie van Unity te raadplegen. MRTK-interactors zijn subklassen van bestaande XRI-interactors of implementaties van de XRI-interactieinterfaces. Raadpleeg de documentatie van Unity over hun interactiearchitectuur die ook van toepassing is op MRTK.

Goede burgers van XRI

De aangepaste MRTK-interactors zijn goed gevoed met betrekking tot de standaard XRI-interactieinterfaces; vanuit het perspectief van XRI-systemen zijn ze niet te onderscheiden van "vanille"-interacties. De inverse is ook waar; bij het bouwen van geavanceerde interactiebare functies in MRTK werken de standaard XRI-interacties nog steeds voor eenvoudige aanwijzen en selecteren. Het maakt deel uit van de MRTK-inspanning om volledig compatibel te zijn met bestaande XRI-projecten. Als u een XRI-toepassing hebt, werken MRTK-interactie- en UI-besturingselementen met uw bestaande XRI-installatie van 'vanille'.

Abstractie van input modaliteit

Het invoerapparaat, de interactie die de interactie uitvoert en de interactie-gebeurtenissen die ze genereren, zijn allemaal architectonisch geïsoleerd in XRI. Deze isolatie is essentieel voor de strategie voor invoerabstractie in MRTK3 en stelt ons in staat om platformoverschrijdende en cross-device interacties te schrijven die goed functioneren in alle contexten.

Van MRTK v2 is er een gemeenschappelijk instinct voor code-interacties die specifiek zijn voor een bepaald invoertype of apparaat. Veel ontwikkelaars zijn gewend aan het schrijven van interacties die specifiek reageren op een bijna-grijper, een verre straal of een ander specifiek invoertype.

Hoewel MRTK3 nog steeds de ondubbelzinnigheid en detectie van afzonderlijke invoermodi mogelijk maakt, is hardcoderingsinteractie voor specifieke afzonderlijke invoertypen kunstmatig beperkt en vermindert de flexibiliteit van uw interacties. Meer informatie hierover vindt u in de documentatie over de interactiebare architectuur, maar de sleutel voor interactie is dat ze over het algemeen niet 1:1 hoeven toe te wijzen aan invoerapparaten.

AttachTransform en Inversion of Control

Veel van wat MRTK v2 deed in 'verplaatsingslogica' als onderdeel van ObjectManipulator, Sliderenzovoort, is nu de verantwoordelijkheid van de interactie zelf. De interactie bepaalt nu de attachTransform om te definiëren hoe een specifiek type manipulatie zich gedraagt. U hoeft geen complexe interactielogica meer te schrijven over de interactie die verschilt tussen invoermodaliteiten; In plaats daarvan kan uw geïntegreerde manipulatielogica luisteren naar de houding van de attachTransformmens, ongeacht de modaliteit van de invoer of het apparaat dat het aansturen.

Een 's attachTransform bevindt zich bijvoorbeeld GrabInteractorop het pakpunt op de hand/controller. Een XRRayInteractor's attachTransform bevindt zich op het hitpunt aan het einde van de ray. De CanvasProxyInteractor's attachTransform bevinden zich op de plaats waar de muis heeft geklikt. Voor al deze verschillende interacties hoeft het interactiebaar niet om het type interactie te geven om op de juiste wijze te reageren op manipulaties.

De interactiebare query's worden uitgevoerd attachTransform en kunnen elk attachTransform hetzelfde behandelen, ongeacht het type interactie.

Deze aanpak is essentieel voor compatibiliteit met bestaande XRI-interactie en het toekomstbestendig maken van uw interacties voor invoermodaliteiten die nog niet zijn ontwikkeld. Als er een nieuwe invoermethode wordt geïntroduceerd, hoeft u bestaande interactiemethoden niet te wijzigen als de nieuwe interactie een geldige en goed gedragende attachTransforminteractie genereert.

Dus, filosofisch, het is de attachTransform interactielogica. Geef voor aangepaste interacties altijd voorkeur aan het schrijven van een nieuwe interactie met nieuwe attachTransform logica in plaats van interactie te herschrijven of uit te breiden zodat deze kan worden aangepast voor uw nieuwe interactie. Op deze manier kunnen alle bestaande interactie-items profiteren van de voordelen van uw nieuwe interactie in plaats van alleen de interacties die u hebt herschreven of uitgebreid.

XRControllers en invoerbinding

De meeste interactiemiddelen binden niet rechtstreeks aan invoeracties. De meeste zijn afgeleid van XRBaseControllerInteractor, waarvoor een XRController boven de interactie in de hiërarchie vereist is. De XRController bindingen met invoeracties en geven vervolgens de relevante acties (selecteren enzovoort) door aan alle gekoppelde interacties.

Sommige interacties hebben echter mogelijk speciale invoerbindingen of extra invoer nodig die niet XRController worden opgegeven. In deze gevallen kunnen interactieders rechtstreeks verbinden met hun eigen unieke invoeracties of zelfs andere niet-invoersysteembronnen gebruiken voor interactielogica. De XRI-basisklassen luisteren liever naar de XRControllerbindingen, maar dit gedrag kan worden overschreven om externe of alternatieve invoerbronnen te gebruiken.

Interfaces

XRI definieert de basisIXRInteractor, IXRHoverInteractor, en IXRActivateInteractorIXRSelectInteractor. MRTK definieert extra interfaces voor interactie. Sommige geven aanvullende informatie weer over MRTK-specifieke interacties en andere zijn gewoon bedoeld voor categorisatie en identificatie. Deze interfaces bevinden zich allemaal in het Core-pakket , terwijl de implementaties zich in andere pakketten bevinden, inclusief invoer.

Belangrijk

Hoewel deze interfaces handig zijn als u wilt filteren op een specifiek type interactie, raden we u aan om uw interacties niet te codeeren om specifiek naar deze interfaces te luisteren. Geef in elke situatie altijd voorkeur aan de algemene XRI en wordtHovered, in plaats van elke interactiespecifieke interface.

Tenzij dat nodig is, moet u niet verwijzen naar de concrete MRTK-implementaties van deze interfaces in interactie, tenzij dit absoluut noodzakelijk is. In alle gevallen is het beter om naar de interfaces te verwijzen. Als u expliciet verwijst naar de betontypen, beperkt u uw interacties om alleen met de huidige, bestaande typen te werken. Door alleen naar de interfaces te verwijzen, zorgt u voor compatibiliteit met toekomstige implementaties die de bestaande implementaties mogelijk niet subklassen.

IVariableSelectInteractor

Interactie die deze interface implementeert, kan variabele (dat wil gezegd analoge) geselecteerdheid geven om te communiceren. Met de eigenschap kan een query worden uitgevoerd op het geselecteerde bedrag van de SelectProgress variabele. MRTK-interactors die deze interface implementeren, omvatten de MRTKRayInteractor en de GazePinchInteractor. Basisbewerkingen (de standaard-XRI-interactie en MRTKBaseInteractable) worden niet beïnvloed door de variabeleselectiehoeveelheid. StatefulInteractableLuistert echter naar deze waarde en berekent Selectedness de waarde ervan op basis van alle max() deelnemende variabelen en niet-variabele interactie.

IGazeInteractor

Interactie die deze interface implementeert, vertegenwoordigt de passieve blik van de gebruiker, gescheiden van elke manipulatie of intentie. De MRTK-implementatie is FuzzyGazeInteractor, die overkomt van de XRI XRRayInteractoren fuzzy cone-castinglogica toevoegt. XRBaseInteractable wordt een vlag weergegeven IsGazeHovered wanneer een IGazeInteractor muisaanwijzer aanwijst.

IGrabInteractor

Interactie die deze interface implementeert, vertegenwoordigt een fysieke interactie bij het pakken van velden. De attachTransform is gedefinieerd als het pakpunt. De MRTK-implementatie is GrabInteractor, die XRI's XRDirectInteractorsubklassen .

IPokeInteractor

Interactie die deze interface implementeert, vertegenwoordigt een poking-interactie. Houd er rekening mee dat dit niet noodzakelijkerwijs een vinger impliceert! Willekeurige interactie kan deze interface implementeren en interactie bieden die afkomstig zijn van niet-vingerbronnen. In een van de weinige gevallen waar het controleren van interactieinterfaces een goed idee is, interactiebare functies zoals PressableButton luisteren naar IPokeInteractors, met name om volumetrische druk te sturen. Elke interactie die wordt geïmplementeerd IPokeInteractor , veroorzaakt 3D-druk op knoppen.

IPokeInteractor geeft de PokeRadius eigenschap weer, die de kenmerken van het poking-object definieert. De poke wordt beschouwd als gecentreerd op de attachTransform en strekt zich uit van de door de PokeRadiusattachTransform . Interactiemogelijkheden zoals PressableButton verschuiving van hun 3D-pushafstand door deze straal, die kan worden aangestuurd door de fysieke vingerdikte van de gebruiker in het geval van op vinger gebaseerde persen.

De MRTK-implementatie van deze interface is PokeInteractor. In ons sjabloonproject geven we ook een ander voorbeeld van IPokeInteractor dat niet vingergestuurd; PenInteractor biedt poke-interacties die zijn geroot op de tip van een virtuele 3D-stylus.

IRayInteractor

Interactie die deze interface implementeert, vertegenwoordigt een op ray gebaseerde pointing-interactie. De attachTransform vertegenwoordigt de trefferlocatie van de ray op het oppervlak van het doelobject tijdens een selectie.

De MRTK-implementatie van deze interface neemt MRTKRayInteractorrechtstreeks over van de XRI XRRayInteractor.

Notitie

De XRI XRRayInteractor implementeert deze MRTK-interface niet.

ISpeechInteractor

Interactie die deze interface implementeert, vertegenwoordigt spraakgestuurde interacties. De MRTK-implementatie is SpeechInteractor.

De MRTK SpeechInteractor, intern, gebruikt PhraseRecognitionSubsystem en abonneert zich op interactiebare registratie-gebeurtenissen van de XRI XRInteractionManager. Interactiebare onderdelen hoeven zich echter geen zorgen te maken over welk subsysteem spraakverwerking uitvoert; ISpeechInteractors genereren dezelfde XRI-gebeurtenissen (selecteer, enzovoort) die elke andere interactie heeft.

IGazePinchInteractor

Deze interface is gewoon een specialisatie van de IVariableSelectInteractor interface. Interactie die deze interface implementeert, zijn impliciet interactie tussen variabelen en selects. IGazePinchInteractors vertegenwoordigt uitdrukkelijk een indirect gerichte manipulatie op afstand. Een afzonderlijke interactie op basis van staren bepaalt het doel van de interactie en de manipulatie is door een hand of controller. attachTransform gedraagt zich op dezelfde manier IRayInteractorals 's attachTransform ; het wordt vastgemaakt aan het trefferpunt op het doel wanneer een selectie wordt gestart.

Wanneer meerdere IGazePinchInteractors deelnemen aan één interactie, worden de attachTransforms verschoven door de verplaatsing van het mediaanpunt tussen alle deelnemende knijppunten. Interactiemogelijkheden kunnen deze attachTransforms dus op dezelfde manier interpreteren als voor elke andere interactie met meerdere handen, zoals de attachTransforms interacties tussen grijpers of ray-interacties.

De MRTK-implementatie is de GazePinchInteractor.

IHandedInteractor

Sommige interacties kunnen ervoor kiezen om de interface te implementeren IHandedInteractor om expliciet op te geven dat ze zijn gekoppeld aan een bepaalde hand op een gebruiker. Sommige interacties zijn niet gekoppeld aan de handheid en implementeren dit dus niet. De meest voor de hand liggende voorbeelden zijn degenen zoals SpeechInteractor of FuzzyGazeInteractor.

De MRTK-interactors die deze interface implementeren, zijn de HandJointInteractor, een algemene, abstracte XRDirectInteractor aangedreven door een willekeurige handverbinding, de GazePinchInteractor, en de MRTKRayInteractor.

Interactables gebruiken deze interface momenteel om bepaalde effecten te activeren wanneer deze is geselecteerd die onderscheid moeten maken tussen een linker- of rechterhand. Het meest opvallende voorbeeld hiervan is het pulse-effect in de UX-onderdelenbibliotheek.