Gester i Unity

Det finns två viktiga sätt att vidta åtgärder i Unity, handgester och rörelsekontroller i HoloLens och Avancerad HMD. Du kommer åt data för båda källorna för rumsliga indata via samma API:er i Unity.

Unity tillhandahåller två huvudsakliga sätt att komma åt rumsliga indata för Windows Mixed Reality. De vanliga INPUT.GetButton/Input.GetAxis-API:erna fungerar över flera Unity XR-API:er, medan INTERACTIONManager/GestureRecognizer-API:et som är specifikt för Windows Mixed Reality exponerar den fullständiga uppsättningen rumsliga indata.

Sammansatta gester-API:er på hög nivå (GestureRecognizer)

Namnrymd: UnityEngine.xr.wsa.input
Typer: GestureRecognizer, GestureSettings, InteractionSourceKind

Din app kan också identifiera sammansatta gester på högre nivå för rumsliga indatakällor, gester för tryck, håll, manipulering och navigering. Du kan känna igen dessa sammansatta gester över både hand- och rörelsekontroller med hjälp av GestureRecognizer.

Varje gesthändelse på GestureRecognizer tillhandahåller SourceKind för indata samt målhuvudsbilden vid tidpunkten för händelsen. Vissa händelser ger ytterligare sammanhangsspecifik information.

Det krävs bara några få steg för att samla in gester med hjälp av en gest recognizer:

  1. Skapa en ny gest recognizer
  2. Ange vilka gester som ska bevakas
  3. Prenumerera på händelser för dessa gester
  4. Börja samla in gester

Skapa en ny gest recognizer

Om du vill använda GestureRecognizer måste du ha skapat en GestureRecognizer:

GestureRecognizer recognizer = new GestureRecognizer();

Ange vilka gester som ska bevakas

Ange vilka gester du är intresserad av via SetRecognizableGestures():

recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);

Prenumerera på händelser för dessa gester

Prenumerera på händelser för de gester som du är intresserad av.

void Start()
{
    recognizer.Tapped += GestureRecognizer_Tapped;
    recognizer.HoldStarted += GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}

Anteckning

Gester för navigering och manipulering utesluter varandra på en instans av en GestureRecognizer.

Börja samla in gester

Som standard övervakar en GestureRecognizer inte indata förrän StartCapturingGestures() anropas. Det är möjligt att en gesthändelse kan genereras efter att StopCapturingGestures() anropas om indata utfördes innan den ram där StopCapturingGestures() bearbetades. GestureRecognizer kommer ihåg om den var på eller av under föregående bildruta där gesten faktiskt inträffade, och därför är det tillförlitligt att starta och stoppa gestövervakning baserat på den här ramens blickmål.

recognizer.StartCapturingGestures();

Sluta samla in gester

Så här stoppar du gesterigenkänning:

recognizer.StopCapturingGestures();

Ta bort en gest recognizer

Kom ihåg att avbryta prenumerationen på händelser som prenumererar innan du förstör ett GestureRecognizer-objekt.

void OnDestroy()
{
    recognizer.Tapped -= GestureRecognizer_Tapped;
    recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}

Rendering av modellen för rörelsekontroll i Unity

Modell för rörelsestyrenhet och teleportering
Modell för rörelsestyrenhet och teleportering

Om du vill återge rörelsekontroller i din app som matchar de fysiska styrenheter som dina användare håller och formulerar när olika knappar trycks ned kan du använda MotionController-prefab i Mixed Reality Toolkit. Den här prefab-enheten läser in rätt mallmodell vid körning från systemets installerade rörelsestyrenhetsdrivrutin. Det är viktigt att läsa in dessa modeller dynamiskt i stället för att importera dem manuellt i redigeraren, så att din app visar fysiskt korrekta 3D-modeller för alla aktuella och framtida kontrollanter som användarna kan ha.

  1. Följ anvisningarna Komma igång för att ladda ned Mixed Reality Toolkit och lägga till den i ditt Unity-projekt.
  2. Om du ersatte kameran med prefab-programmet MixedRealityCameraParent som en del Komma igång stegen är du redo! Den prefab-enheten omfattar återgivning av rörelsekontroller. Annars lägger du till Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab i scenen Project fönstret. Du bör lägga till den prefab-enheten som underordnad det överordnade objekt som du använder för att flytta kameran när användaren teleporterar i scenen, så att kontrollanterna kommer med användaren. Om din app inte involverar teleportering lägger du bara till prefab i roten av scenen.

Utlösa objekt

Att utlösa objekt i virtuell verklighet är ett svårare problem än vad det först kan verka. Precis som med de flesta fysiskt baserade interaktioner är det omedelbart uppenbart att spelet fungerar på ett oväntat sätt och att det bryter ned tiden. Vi har ägnat lite tid åt att tänka djupt på hur vi ska representera ett fysiskt korrekt beteende och har kommit fram till några riktlinjer, aktiverade via uppdateringar till vår plattform, som vi vill dela med dig.

Du hittar ett exempel på hur vi rekommenderar att du implementerar throwing här. Det här exemplet följer dessa fyra riktlinjer:

  • Använd kontrollantens hastighet i stället för position . I novemberuppdateringen för Windows introducerade vi en ändring i beteendet vid positionspårningstillståndet "Ungefärlig". I det här tillståndet fortsätter hastighetsinformationen om kontrollanten att rapporteras så länge vi tror att den höga noggrannheten, som ofta är längre än positionen, förblir hög noggrannhet.

  • Införliva kontrollantens angularhastighet. Den här logiken finns i filen throwing.cs i den GetThrownObjectVelAngVel statiska metoden, i paketet som är länkat ovan:

    1. När angularhastigheten bevaras måste det utkastade objektet ha samma angularhastighet som det hade vid tidpunkten för utkastet: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Eftersom mitten av massan av det utslängda objektet troligen inte ligger i ursprunget för handtagsställningen har den förmodligen en annan hastighet än kontrollantens i referensramen för användaren. Den del av objektets hastighet som bidrar på det här sättet är den omedelbara tangenshastigheten i mitten av massan för det utlösta objektet runt kontrollantens ursprung. Den här tangenshastigheten är kryssprodukten för kontrollantens vinkelhastighet med vektorn som representerar avståndet mellan kontrollantens ursprung och mitten av massan för det utslängda objektet.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. Den totala hastigheten för det utslängda objektet är summan av kontrollantens hastighet och denna tangenshastighet: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Var noga med den tid då vi tillämpar hastigheten. När du trycker på en knapp kan det ta upp till 20 ms innan händelsen bubblar upp Bluetooth till operativsystemet. Det innebär att om du söker efter en ändring av kontrollantens tillstånd från nedtryckt till inte nedtryckt eller tvärtom, kommer kontrollantens poseringsinformation som du får med den att ligga före den här ändringen av tillståndet. Dessutom förutsägs kontrollantens attityd som presenteras av vårt avsöknings-API att återspegla en trolig attityd vid den tidpunkt då tidsramen visas, vilket kan vara mer än 20 ms i framtiden. Det här är bra för rendering av kvarhållna objekt, men gör tidsproblemet mer mål för objektet när vi beräknar målet för den tidpunkt då användaren släppte utkastet. Som tur är innehåller tillståndet historiska attityddata från bakåt när en Unity-händelse som InteractionSourcePressed eller InteractionSourceReleased skickas med novemberuppdateringen. För att få den mest korrekta återgivningen av kontrollanten och kontrollantens mål vid utkast måste du använda avsökning och händelsesökning på rätt sätt, efter behov:

  • Använd handtagsposet. Angular hastighet och hastighet rapporteras i förhållande till handtagsställningen, inte pekare.

Att utlösa kommer att fortsätta att förbättras med Windows uppdateringar, och du kan förvänta dig att hitta mer information om det här.

Gester och rörelsekontroller i MRTK

Du kan komma åt gester och rörelsekontroller från indatahanteraren.

Följ med i självstudierna

Stegvisa självstudier, med mer detaljerade anpassningsexempel, finns i Mixed Reality Academy:

MR Input 213 – Rörelsestyrenhet
MR Input 213 – Rörelsestyrenhet

Nästa kontrollpunkt för utveckling

Om du följer den Unity-utvecklingsresa som vi har skapat är du i färd med att utforska MRTK-kärnbyggstenarna. Härifrån kan du fortsätta till nästa byggblock:

Eller gå Mixed Reality plattformsfunktioner och API:er:

Du kan alltid gå tillbaka till kontrollpunkterna för Unity-utveckling när som helst.

Se även