Kontrollanter, pekare och fokus – MRTK2

Kontrollanter, pekare och fokus är begrepp på högre nivå som bygger på den grund som grunderna för kärnindatasystemet har skapat. Tillsammans tillhandahåller de en stor del av mekanismen för att interagera med objekt i scenen.

Kontrollanter

Kontrollanter är representationer av en fysisk kontrollant (6 graders frihet, ledad hand osv.). De skapas av enhetshanterare och ansvarar för att kommunicera med motsvarande underliggande system och översätta dessa data till MRTK-formade data och händelser.a

På Windows Mixed Reality-plattformen WindowsMixedRealityArticulatedHand är till exempel en kontrollant som ansvarar för att interagera med underliggande API:er för windows-handspårning för att få information om lederna, poseringen och andra egenskaper för handen. Den ansvarar för att omvandla dessa data till relevanta MRTK-händelser (till exempel genom att anropa RaisePoseInputChanged eller RaiseHandJointsUpdated) och genom att uppdatera sitt eget interna tillstånd så att frågor för TryGetJointPose returnerar korrekta data.

I allmänhet omfattar en kontrollants livscykel:

  1. En kontrollant skapas av en enhetshanterare vid identifiering av en ny källa (till exempel identifierar och börjar enhetshanteraren spåra en hand).

  2. I kontrollantens Update()-loop anropas dess underliggande API-system.

  3. I samma uppdateringsloop genererar den indatahändelseändringar genom att anropa direkt till själva kärnindatasystemet (till exempel att höja HandMeshUpdated eller HandJointsUpdated).

Pekare och fokus

Pekare används för att interagera med spelobjekt. Det här avsnittet beskriver hur pekare skapas, hur de uppdateras och hur de avgör vilka objekt som är i fokus. Den kommer också att omfatta de olika typer av pekare som finns och de scenarier där de är aktiva.

Pekarkategorier

Pekare hamnar vanligtvis i någon av följande kategorier:

  • Långt pekare

    Dessa typer av pekare används för att interagera med objekt som är långt borta från användaren (långt borta definieras som helt enkelt "inte nära"). Dessa typer av pekare kastar vanligtvis linjer som kan gå långt ut i världen och tillåta användaren att interagera med och manipulera objekt som inte är omedelbart bredvid dem.

  • Nära pekare

    Dessa typer av pekare används för att interagera med objekt som är tillräckligt nära användaren för att hämta, röra och manipulera. I allmänhet interagerar dessa typer av pekare med objekt genom att leta efter objekt i närheten (antingen genom att göra raycasting på små avstånd, göra sfärisk gjutning och leta efter objekt i närheten eller räkna upp listor över objekt som anses vara grabbbara/beröringsbara).

  • Teleportpekare

    De här typerna av pekare ansluts till teleporteringssystemet för att hantera flytten av användaren till den plats som pekaren riktar in sig på.

Pekarmedling

Eftersom en enda kontrollant kan ha flera pekare (till exempel kan den ledade handen ha både nära och långt interaktionspekare) finns det en komponent som ansvarar för att förmedla vilken pekare som ska vara aktiv.

Till exempel, när användarens hand närmar sig en tryckbar knapp, ShellHandRayPointer bör sluta visa, och PokePointer bör vara engagerad.

Detta hanteras av DefaultPointerMediator, som ansvarar för att avgöra vilka pekare som är aktiva, baserat på tillståndet för alla pekare. En av de viktigaste sakerna som detta gör är att inaktivera långt pekare när en nära pekare är nära ett objekt (se DefaultPointerMediator).

Det går att tillhandahålla en alternativ implementering av pekarmedlaren genom att ändra PointerMediator egenskapen på pekarprofilen.

Inaktivera pekare

Eftersom pekarmedlaren kör varje bildruta styrs det aktiva/inaktiva tillståndet för alla pekare. Om du anger en pekares IsInteractionEnabled-egenskap i kod skrivs den därför över av pekarmedlaren varje bildruta. I stället kan du ange PointerBehavior för att styra om pekare ska vara på eller av dig själv. Observera att detta bara fungerar om du använder standardvärdet FocusProvider och DefaultPointerMediator i MRTK.

Exempel: Inaktivera handstrålar i MRTK

Följande kod inaktiverar handstrålarna i 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);

Följande kod returnerar handstrålar till standardbeteendet i MRTK:

PointerUtils.SetHandRayPointerBehavior(PointerBehavior.Default);

Följande kod tvingar handstrålar att vara på, oavsett om de är nära en grabbbar:

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

Se PointerUtils och TurnPointersOnOff för fler exempel.

FocusProvider

FocusProvider är arbetshästen som ansvarar för iterering över listan över alla pekare och ta reda på vad det fokuserade objektet är för varje pekare.

I varje Update() anrop kommer detta att:

  1. Uppdatera alla pekare genom att raycasting och göra träffidentifiering enligt konfigurationen av själva pekaren (till exempel kan sfärpekaren ange SphereOverlap raycastMode, så FocusProvider gör en sfärbaserad kollision)

  2. Uppdatera det fokuserade objektet per pekare (dvs. om ett objekt har fokus skulle det också utlösa händelser till objektet, om ett objekt förlorade fokus skulle det utlösa förlorade fokus osv.).

Konfiguration och livscykel för pekare

Pekare kan konfigureras i avsnittet Pekare i indatasystemprofilen.

Livslängden för en pekare är vanligtvis följande:

  1. En enhetshanterare identifierar förekomsten av en kontrollant. Den här enhetshanteraren skapar sedan den uppsättning pekare som är associerade med kontrollanten via ett anrop till RequestPointers.

  2. FocusProvider itererar i sin Update()-loop över alla giltiga pekare och gör den associerade raycast- eller träffidentifieringslogik. Detta används för att fastställa det objekt som är fokuserat av varje viss pekare.

    • Eftersom det är möjligt att ha flera indatakällor aktiva samtidigt (till exempel två händer aktiva) är det också möjligt att ha flera objekt som har fokus samtidigt.
  3. Enhetshanteraren kommer när den upptäcker att en kontrollantkälla har förlorats att ta bort pekarna som är associerade med den förlorade kontrollanten.