Gebaren in Unity

Er zijn twee belangrijke manieren om actie te ondernemen op uw staren in Unity:handbewegingen en bewegingscontrollers in HoloLens en In immersieve HMD. U hebt toegang tot de gegevens voor beide bronnen van ruimtelijke invoer via dezelfde API's in Unity.

Unity biedt twee primaire manieren om toegang te krijgen tot ruimtelijke invoergegevens voor Windows Mixed Reality. De algemene API's Input.GetButton/Input.GetAxis werken op meerdere Unity XR SDK's, terwijl de Api InteractionManager/GestureRecognizer die specifiek is voor Windows Mixed Reality de volledige set ruimtelijke invoergegevens beschikbaar maakt.

API's voor samengestelde bewegingen op hoog niveau (GestureRecognizer)

Naamruimte: UnityEngine.XR.WSA.Input
Typen: GestureRecognizer, GestureSettings, InteractionSourceKind

Uw app kan ook samengestelde bewegingen op een hoger niveau herkennen voor ruimtelijke invoerbronnen, tikken, vasthouden, bewerken en navigatiebewegingen. U kunt deze samengestelde bewegingen op zowel handen- als bewegingscontrollers herkennen met behulp van de GestureRecognizer.

Elke gesture-gebeurtenis op de GestureRecognizer biedt het SourceKind voor de invoer en de doelhoofd ray op het moment van de gebeurtenis. Sommige gebeurtenissen bieden aanvullende contextspecifieke informatie.

Er zijn slechts enkele stappen vereist om gebaren vast te leggen met behulp van de Gesture Recognizer:

  1. Een nieuwe Gesture Recognizer maken
  2. Opgeven op welke gebaren u moet letten
  3. Abonneren op gebeurtenissen voor deze gebaren
  4. Beginnen met het vastleggen van gebaren

Een nieuwe Gesture Recognizer maken

Als u GestureRecognizer wilt gebruiken, moet u een GestureRecognizer hebben gemaakt:

GestureRecognizer recognizer = new GestureRecognizer();

Opgeven op welke gebaren u moet letten

Geef op in welke gebaren u geïnteresseerd bent via SetRecognizableGestures():

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

Abonneren op gebeurtenissen voor deze gebaren

Abonneer u op gebeurtenissen voor de gebaren waarin u bent geïnteresseerd.

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

Notitie

Navigatie en manipulatiebewegingen sluiten elkaar wederzijds uit op een exemplaar van een GestureRecognizer.

Beginnen met het vastleggen van gebaren

Standaard controleert een GestureRecognizer de invoer pas als StartCapturingGestures() wordt aangeroepen. Het is mogelijk dat er een bewegingsgebeurtenis wordt gegenereerd nadat StopCapturingGestures() is aangeroepen als invoer is uitgevoerd vóór het frame waarin StopCapturingGestures() is verwerkt. De GestureRecognizer onthoudt of deze aan of uit was tijdens het vorige frame waarin de beweging daadwerkelijk heeft plaatsgevonden. Het is dus betrouwbaar om de bewaking van gebaren te starten en stoppen op basis van de staringstargeting van dit frame.

recognizer.StartCapturingGestures();

Stoppen met het vastleggen van gebaren

Herkenning van gebaren stoppen:

recognizer.StopCapturingGestures();

Een kiezer voor gebaren verwijderen

Vergeet niet om u af te melden voor geabonneerde gebeurtenissen voordat u een GestureRecognizer-object vernietigd.

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

Het model van de bewegingscontroller weergeven in Unity

Bewegingscontrollermodel en teleportatie
Bewegingscontrollermodel en teleportatie

Als u bewegingscontrollers in uw app wilt renderen die overeenkomen met de fysieke controllers die uw gebruikers ingedrukt houden en verwoorden wanneer verschillende knoppen worden ingedrukt, kunt u de MotionController-prefab in de Mixed Reality Toolkit. Dit prefab laadt het juiste glTF-model dynamisch tijdens runtime van het geïnstalleerde stuurprogramma voor de bewegingscontroller van het systeem. Het is belangrijk dat u deze modellen dynamisch laadt in plaats van ze handmatig te importeren in de editor, zodat uw app fysiek nauwkeurige 3D-modellen laat zien voor alle huidige en toekomstige controllers die uw gebruikers mogelijk hebben.

  1. Volg de Aan de slag om de Mixed Reality Toolkit te downloaden en toe te voegen aan uw Unity-project.
  2. Als u uw camera hebt vervangen door het prefab MixedRealityCameraParent als onderdeel van de Aan de slag stappen, kunt u gaan. Dat prefab bevat rendering van bewegingscontrollers. Voeg anders Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab toe aan uw scène vanuit het Project deelvenster. U kunt dat prefab toevoegen als een onderliggend object van welk bovenliggend object u ook gebruikt om de camera te verplaatsen wanneer de gebruiker in uw scène teleporteert, zodat de controllers samen met de gebruiker worden gebruikt. Als uw app geen gebruik maakt van teleporteren, voegt u de prefab toe aan de hoofdmap van uw scène.

Objecten gooien

Het is een moeilijker probleem om objecten in virtual reality te plaatsen dan het in eerste instantie lijkt. Net als bij de meeste fysiek gebaseerde interacties, is het onmiddellijk duidelijk wanneer het spel op een onverwachte manier wordt ingerichte en wordt de indompeling breekt. We hebben enige tijd besteed aan het diep nadenken over hoe we fysiek correct gedrag kunnen vertegenwoordigen en hebben een aantal richtlijnen opgesteld, mogelijk via updates voor ons platform, die we graag met u willen delen.

Hier vindt u een voorbeeld van hoe we het implementeren van throwing aanbevelen. Dit voorbeeld volgt deze vier richtlijnen:

  • Gebruik de snelheid van de controller in plaats van positie. In de update van november Windows we een wijziging in het gedrag geïntroduceerd in de positionele traceringstoestand ''Approximate'. In deze toestand blijven snelheidsinformatie over de controller worden gerapporteerd zolang we van mening zijn dat de hoge nauwkeurigheid, die vaak langer is dan de positie, een hoge nauwkeurigheid blijft.

  • Neem de angular-snelheid van de controller op. Deze logica is allemaal opgenomen in het throwing.cs bestand in de GetThrownObjectVelAngVel statische methode, binnen het pakket dat hierboven is gekoppeld:

    1. Omdat angular velocity wordt geconserveerd, moet het geworpen object dezelfde angular-snelheid behouden als op het moment van de worpen: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Omdat het midden van de massa van het geworpen object waarschijnlijk niet de oorsprong van de houding is, heeft het waarschijnlijk een andere snelheid dan die van de controller in het referentiekader van de gebruiker. Het gedeelte van de snelheid van het object dat op deze manier is bijgedragen, is de onmiddellijke tangensische snelheid van het middelpunt van de massa van het geworpen object rond de oorsprong van de controller. Deze tangensische snelheid is het kruisproduct van de angular-snelheid van de controller met de vector die de afstand tussen de oorsprong van de controller en het midden van de massa van het geworpen object vertegenwoordigt.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. De totale snelheid van het geworpen object is de som van de snelheid van de controller en deze tangensische snelheid: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Let goed op het tijdstip waarop we de snelheid toepassen. Wanneer u op een knop drukt, kan het tot 20 ms duren voor die gebeurtenis door het besturingssysteem Bluetooth bellen. Dit betekent dat als u pollt naar een wijziging in de status van de controller van ingedrukt naar niet ingedrukt of andersom, de controller-houdingsinformatie die u hiermee krijgt, in feite deze statuswijziging voor zijn. Bovendien wordt de controllerhouding die door onze polling-API wordt gepresenteerd, voorspeld om een waarschijnlijke houding weer te geven op het moment dat het frame wordt weergegeven, wat in de toekomst meer dan 20 ms kan zijn. Dit is goed voor het weergeven van vastgehouden objecten, maar het vereendt ons tijdprobleem voor het richten van het object op het moment dat we het traject berekenen voor het moment dat de gebruiker de throw heeft vrijgegeven. Gelukkig bevat de status met de update van november, wanneer een Unity-gebeurtenis zoals InteractionSourcePressed of InteractionSourceReleased wordt verzonden, de historische houdingsgegevens van toen de knop werd in- of uitgebracht. Als u wilt de meest nauwkeurige controller rendering en controller gericht tijdens throws, moet u correct polling en gebeurtenissen gebruiken, waar van toepassing:

  • Gebruik de houding . Angular snelheid en snelheid worden gerapporteerd ten opzichte van de houding van de greep, niet de pointer-houding.

Throwing wordt nog steeds verbeterd met toekomstige Windows updates en u kunt hier meer informatie over verwachten.

Bewegings- en bewegingscontrollers in MRTK

U kunt bewegings- en bewegingscontroller openen vanuit inputbeheer.

Volg de zelfstudies

Stapsgewijs zelfstudies, met meer gedetailleerde aanpassingsvoorbeelden, zijn beschikbaar in de Mixed Reality Academy:

MR Input 213 - Bewegingscontroller
MR Input 213 - Bewegingscontroller

Volgende controlepunt voor ontwikkeling

Als u het Unity-ontwikkelingstraject volgt dat we hebben verkend, bent u bezig met het verkennen van de bouwstenen van de MRTK-kern. Hier kunt u doorgaan naar de volgende bouwsteen:

Of ga naar Mixed Reality platformmogelijkheden en API's:

U kunt altijd op elk moment teruggaan naar de Controlepunten voor Unity-ontwikkeling.

Zie ook