Delen via


Controllers, aanwijzers en focus — MRTK2

Controllers, pointers en focus zijn concepten op een hoger niveau die voortbouwen op de basis die door het kerninvoersysteem is vastgesteld. Samen vormen ze een groot deel van het mechanisme voor interactie met objecten in de scène.

Controllers

Controllers zijn representaties van een fysieke controller (6 vrijheidsgraden, gearticuleerde hand, enz.). Ze worden gemaakt door apparaatbeheerders en zijn verantwoordelijk voor de communicatie met het bijbehorende onderliggende systeem en het vertalen van die gegevens in MRTK-vormige gegevens en gebeurtenissen.a

Op het Windows Mixed Reality-platform is de WindowsMixedRealityArticulatedHand bijvoorbeeld een controller die verantwoordelijk is voor de interactie met de onderliggende Windows-API's voor handtracering om informatie op te halen over de gewrichten, houding en andere eigenschappen van de hand. Het is verantwoordelijk voor het omzetten van deze gegevens in relevante MRTK-gebeurtenissen (bijvoorbeeld door RaisePoseInputChanged of RaiseHandJointsUpdated aan te roepen) en door de eigen interne status bij te werken, zodat query's voor TryGetJointPose de juiste gegevens retourneren.

Over het algemeen omvat de levenscyclus van een controller het volgende:

  1. Een controller wordt gemaakt door een apparaatbeheerder bij detectie van een nieuwe bron (het apparaatbeheer detecteert bijvoorbeeld een hand en begint met het volgen van een hand).

  2. In de update()-lus van de controller wordt het onderliggende API-systeem aangeroepen.

  3. In dezelfde updatelus worden wijzigingen in invoergebeurtenissen gegenereerd door rechtstreeks aan te roepen in het kerninvoersysteem zelf (bijvoorbeeld Door HandMeshUpdated of HandJointsUpdated te verhogen).

Aanwijzers en focus

Aanwijzers worden gebruikt om te communiceren met gameobjecten. In deze sectie wordt beschreven hoe aanwijzers worden gemaakt, hoe ze worden bijgewerkt en hoe ze bepalen welke objecten de focus hebben. Het behandelt ook de verschillende soorten aanwijzers die bestaan en de scenario's waarin ze actief zijn.

Aanwijzercategorieën

Aanwijzers vallen over het algemeen in een van de volgende categorieën:

  • Verre aanwijzers

    Deze typen aanwijzers worden gebruikt om te communiceren met objecten die zich ver van de gebruiker bevinden (ver weg wordt gedefinieerd als gewoon 'niet dichtbij'). Met dit soort aanwijzers worden meestal lijnen weergegeven die ver in de wereld kunnen gaan en de gebruiker in staat stellen om objecten te bewerken die zich niet direct ernaast bevinden.

  • Aanwijzers in de buurt

    Deze typen aanwijzers worden gebruikt om te communiceren met objecten die dicht genoeg bij de gebruiker liggen om te grijpen, aan te raken en te bewerken. Over het algemeen communiceren deze typen aanwijzers met objecten door te zoeken naar objecten in de nabije omgeving (door raycasting op kleine afstanden uit te voeren, bolvormige cast uit te voeren op zoek naar objecten in de omgeving of lijsten op te sommen met objecten die als pakbaar/aanraakbaar worden beschouwd).

  • Teleport-aanwijzers

    Deze typen aanwijzers worden aangesloten op het teleportatiesysteem om het verplaatsen van de gebruiker naar de locatie waarop de aanwijzer is gericht te verwerken.

Aanwijzerbemiddeling

Omdat een enkele controller meerdere aanwijzers kan hebben (de gelede hand kan bijvoorbeeld zowel aanwijzers voor interactie in de buurt als op afstand hebben), bestaat er een onderdeel dat verantwoordelijk is voor het bemiddelen van de aanwijzer die actief moet zijn.

Als de hand van de gebruiker bijvoorbeeld een drukbare knop nadert, moet de ShellHandRayPointer niet meer worden weergegeven en moet de PokePointer worden ingeschakeld.

Dit wordt afgehandeld door de DefaultPointerMediator, die verantwoordelijk is voor het bepalen welke aanwijzers actief zijn, op basis van de status van alle aanwijzers. Een van de belangrijkste dingen die dit doet, is het uitschakelen van verre aanwijzers wanneer een bijna-aanwijzer zich dicht bij een object bevindt (zie DefaultPointerMediator).

Het is mogelijk om een alternatieve implementatie van de aanwijzerbemiddelaar te bieden door de PointerMediator eigenschap in het aanwijzerprofiel te wijzigen.

Aanwijzers uitschakelen

Omdat de aanwijzermediator elk frame uitvoert, wordt uiteindelijk de actieve/inactieve status van alle aanwijzers bepaald. Als u de eigenschap IsInteractionEnabled van een aanwijzer in code instelt, wordt deze daarom elk frame overschreven door de aanwijzerbemiddelaar. In plaats daarvan kunt u de PointerBehavior opgeven om te bepalen of aanwijzers zelf moeten worden in- of uitgeschakeld. Houd er rekening mee dat dit alleen werkt als u de standaardinstelling FocusProvider en DefaultPointerMediator in MRTK gebruikt.

Voorbeeld: Handstralen uitschakelen in MRTK

Met de volgende code worden de handstralen in MRTK uitgeschakeld:

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

// Turn off hand rays for the right hand only
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Right);

De volgende code retourneert handstralen naar hun standaardgedrag in MRTK:

PointerUtils.SetHandRayPointerBehavior(PointerBehavior.Default);

De volgende code dwingt af dat handstralen worden ingeschakeld, ongeacht of ze in de buurt zijn van een grijpbare:

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

Zie PointerUtils en TurnPointersOnOff voor meer voorbeelden.

FocusProvider

De FocusProvider is het werkpaard dat verantwoordelijk is voor het herhalen van de lijst met alle aanwijzers en het uitzoeken wat het object met prioriteit is voor elke aanwijzer.

In elke Update() aanroep doet dit het volgende:

  1. Werk alle aanwijzers bij door te raycasten en trefferdetectie uit te voeren zoals geconfigureerd door de aanwijzer zelf (de sphere-aanwijzer kan bijvoorbeeld de SphereOverlap raycastMode opgeven, zodat FocusProvider een bolgebaseerde botsing uitvoert)

  2. Werk het object met focus bij op basis van een aanwijzer (d.w.w. als een object de focus krijgt, worden er ook gebeurtenissen naar dat object geactiveerd, als een object de focus verliest, zou de focus verloren gaan, enzovoort).

Aanwijzerconfiguratie en levenscyclus

Aanwijzers kunnen worden geconfigureerd in de sectie Aanwijzers van het invoersysteemprofiel.

De levensduur van een aanwijzer is over het algemeen de volgende:

  1. Een apparaatbeheerder detecteert de aanwezigheid van een controller. Dit apparaatbeheer maakt vervolgens de set aanwijzers die aan de controller zijn gekoppeld via een aanroep naar RequestPointers.

  2. De FocusProvider, in de update()-lus, zal alle geldige aanwijzers herhalen en de bijbehorende raycast- of trefferdetectielogica uitvoeren. Dit wordt gebruikt om het object te bepalen dat is gericht door elke specifieke aanwijzer.

    • Omdat het mogelijk is om meerdere invoerbronnen tegelijk actief te hebben (bijvoorbeeld twee handen actief), is het ook mogelijk om meerdere objecten te hebben die tegelijkertijd de focus hebben.
  3. Wanneer het apparaatbeheer ontdekt dat een controllerbron verloren is gegaan, worden de aanwijzers die zijn gekoppeld aan de verloren controller, weggeraakt.