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
, Slider
enzovoort, 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 attachTransform
mens, ongeacht de modaliteit van de invoer of het apparaat dat het aansturen.
Een 's attachTransform
bevindt zich bijvoorbeeld GrabInteractor
op 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 attachTransform
interactie 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 XRController
bindingen, maar dit gedrag kan worden overschreven om externe of alternatieve invoerbronnen te gebruiken.
Interfaces
XRI definieert de basisIXRInteractor
, IXRHoverInteractor
, en IXRActivateInteractor
IXRSelectInteractor
. 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. StatefulInteractable
Luistert 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 XRRayInteractor
en 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 XRDirectInteractor
subklassen .
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 IPokeInteractor
s, 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 PokeRadius
attachTransform
. 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 MRTKRayInteractor
rechtstreeks 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; ISpeechInteractor
s 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. IGazePinchInteractor
s 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 IRayInteractor
als 's attachTransform
; het wordt vastgemaakt aan het trefferpunt op het doel wanneer een selectie wordt gestart.
Wanneer meerdere IGazePinchInteractor
s deelnemen aan één interactie, worden de attachTransform
s verschoven door de verplaatsing van het mediaanpunt tussen alle deelnemende knijppunten. Interactiemogelijkheden kunnen deze attachTransform
s 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.