Gester i Unity

Det finns två viktiga sätt att vidta åtgärder mot din blick i Unity, handgester och rörelsestyrenheter 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 API:erna Input.GetButton/Input.GetAxis fungerar i flera Unity XR SDK:er, medan API:et InteractionManager/GestureRecognizer som är specifikt för Windows Mixed Reality exponerar den fullständiga uppsättningen rumsliga indata.

API:er för sammansatt gest på hög nivå (GestureRecognizer)

Namnområde:UnityEngine.XR.WSA.Input
Typer: GestureRecognizer, GestureSettings, InteractionSourceKind

Din app kan också känna igen sammansatta gester på högre nivå för spatiala indatakällor, tryck-, håll-, manipulerings- och navigeringsgester. Du kan känna igen dessa sammansatta gester över både händer och rörelsekontrollanter med hjälp av GestureRecognizer.

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

Det krävs bara några steg för att fånga gester med hjälp av en gestigenkänning:

  1. Skapa en ny gestigenkänning
  2. Ange vilka gester som ska watch för
  3. Prenumerera på händelser för dessa gester
  4. Börja fånga gester

Skapa en ny gestigenkänning

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

GestureRecognizer recognizer = new GestureRecognizer();

Ange vilka gester som ska watch för

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

Navigerings- och manipulationsgester är ömsesidigt uteslutande på en instans av en GestureRecognizer.

Börja fånga 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 ramen där StopCapturingGestures() bearbetades. GestureRecognizer kommer ihåg om den var på eller av under den föregående ramen där gesten faktiskt inträffade, så det är tillförlitligt att starta och stoppa gestövervakning baserat på den här ramens blickmål.

recognizer.StartCapturingGestures();

Sluta fånga gester

Så här stoppar du gestigenkänning:

recognizer.StopCapturingGestures();

Ta bort en gestigenkänning

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;
}

Återge modellen för rörelsestyrenhet i Unity

Rörelsestyrenhetsmodell och teleportering
Rörelsestyrenhetsmodell och teleportering

Om du vill rendera rörelsestyrenheter i din app som matchar de fysiska kontrollanter som användarna håller i och formulerar när olika knappar trycks ned kan du använda Prefab MotionController i Mixed Reality Toolkit. Den här prefab läser dynamiskt in rätt glTF-modell 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 Komma igång instruktioner för att ladda ned Mixed Reality Toolkit och lägga till den i Ditt Unity-projekt.
  2. Om du ersatte kameran med MixedRealityCameraParent-prefab som en del av Komma igång steg är det bra att gå! Den prefab innehåller rörelsestyrenhetsåtergivning. Annars lägger du till Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab i scenen från projektfönstret. Du vill lägga till prefab som underordnad det överordnade objekt som du använder för att flytta runt kameran när användaren teleportera i din scen, så att kontrollanterna följer med användaren. Om din app inte omfattar teleportering lägger du bara till prefab i roten av din scen.

Kasta objekt

Att kasta objekt i virtuell verklighet är ett svårare problem än det kan verka först. Precis som med de flesta fysiskt baserade interaktioner är det omedelbart uppenbart och bryter nedsänkningen när du kastar in spel på ett oväntat sätt. Vi har ägnat lite tid åt att tänka djupt på hur vi ska representera ett fysiskt korrekt kastbeteende och har kommit med några riktlinjer, aktiverade genom uppdateringar av vår plattform, som vi vill dela med dig.

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

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

  • Införliva styrenhetens vinkelhastighet. Den här logiken throwing.cs finns i filen i den GetThrownObjectVelAngVel statiska metoden i paketet som länkas ovan:

    1. När vinkelhastigheten sparas måste det utslängda objektet upprätthålla samma vinkelhastighet som det hade vid tidpunkten för kastet: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Eftersom mitten av massan för det utslängda objektet sannolikt inte är vid greppets ursprung, har det sannolikt en annan hastighet än kontrollantens i referensramen för användaren. Den del av objektets hastighet som bidragit på detta sätt är den ögonblickliga tangentiella hastigheten i mitten av massan av det kastade objektet runt kontrollantens ursprung. Denna tangentiella hastighet är korsprodukten av styrenhetens vinkelhastighet med vektorn som representerar avståndet mellan kontrollantens ursprung och mitten av massan för det kastade objektet.

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

  • Var uppmärksam på den tidpunkt då vi tillämpar hastigheten. När en knapp trycks in kan det ta upp till 20 ms för händelsen att bubbla upp via Bluetooth till operativsystemet. Det innebär att om du söker efter en kontrollants tillståndsändring från pressad till inte pressad eller tvärtom, kommer kontrollantens poseinformation som du får med den faktiskt att ligga före den här ändringen i tillstånd. Dessutom förutsägs den kontrollantposition som presenteras av vårt avsöknings-API att återspegla en trolig pose när ramen visas som kan vara mer än 20 ms i framtiden. Detta är bra för återgivning av lagrade objekt, men förvärrar vårt tidsproblem för att rikta in objektet när vi beräknar banan för det ögonblick som användaren släppte kastet. Lyckligtvis med novemberuppdateringen, när en Unity-händelse som InteractionSourcePressed eller InteractionSourceReleased skickas, innehåller tillståndet historiska posedata från tillbaka när knappen trycktes ned eller släpptes. För att få den mest exakta kontrollantåtergivningen och kontrollantens mål vid kast måste du använda avsökning och händelser korrekt, beroende på vad som är lämpligt:

  • Använd greppställningen. Angular hastighet och hastighet rapporteras i förhållande till greppställningen, inte pekarens pose.

Att kasta fortsätter att förbättras med framtida Windows-uppdateringar, och du kan förvänta dig att hitta mer information om det här.

Gest- och rörelsekontrollanter i MRTK

Du kan komma åt gest- och rörelsestyrenheten från indatahanteraren.

Följ med i självstudier

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

MR-indata 213 – Rörelsestyrenhet
MR-indata 213 – Rörelsestyrenhet

Nästa kontrollpunkt för utveckling

Om du följer unity-utvecklingsresan som vi har lagt fram är du mitt uppe i att utforska MRTK-kärnbyggnadsblocken. Härifrån kan du fortsätta till nästa byggblock:

Eller gå till Mixed Reality plattformsfunktioner och API:er:

Du kan alltid gå tillbaka till Unity-utvecklingskontrollerna när som helst.

Se även