Delen via


Bewegingen in Unity

Er zijn twee belangrijke manieren om actie te ondernemen op uw blik in Unity, handbewegingen en bewegingscontrollers in HoloLens en Immersive HMD. U opent 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 in meerdere Unity XR SDK's, terwijl de InteractionManager/GestureRecognizer-API 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, Manipulatie en Navigatiebewegingen. U kunt deze samengestelde bewegingen herkennen tussen beide handen en bewegingscontrollers met behulp van de GestureRecognizer.

Elke gebarengebeurtenis op de GestureRecognizer biedt de SourceKind voor de invoer en de gerichte hoofdstraal op het moment van de gebeurtenis. Sommige gebeurtenissen bieden aanvullende contextspecifieke informatie.

Er zijn slechts enkele stappen vereist voor het vastleggen van bewegingen met behulp van een Gebarenherkenning:

  1. Een nieuwe Gebarenherkenning maken
  2. Opgeven voor welke bewegingen moet worden gezocht
  3. Abonneren op gebeurtenissen voor deze bewegingen
  4. Beginnen met het vastleggen van bewegingen

Een nieuwe Gebarenherkenning maken

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

GestureRecognizer recognizer = new GestureRecognizer();

Opgeven voor welke bewegingen moet worden gezocht

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

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

Abonneren op gebeurtenissen voor deze bewegingen

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

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 bewegingen

Standaard bewaakt een GestureRecognizer geen invoer totdat StartCapturingGestures() wordt aangeroepen. Het is mogelijk dat een bewegingsgebeurtenis wordt gegenereerd nadat StopCapturingGestures() wordt aangeroepen als invoer is uitgevoerd vóór het frame waarin StopCapturingGestures() is verwerkt. De GestureRecognizer zal onthouden of het was in- of uitgeschakeld tijdens het vorige frame waarin het gebaar daadwerkelijk plaatsvond, en het is dus betrouwbaar om bewegingscontrole te starten en stoppen op basis van de gerichtheid van dit frame.

recognizer.StartCapturingGestures();

Stoppen met het vastleggen van bewegingen

Bewegingherkenning stoppen:

recognizer.StopCapturingGestures();

Een gebarenherkenning verwijderen

Vergeet niet om u af te melden bij geabonneerde gebeurtenissen voordat u een GestureRecognizer-object vernietigt.

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

Het bewegingscontrollermodel weergeven in Unity

Bewegingscontrollermodel en teleportatie
Bewegingscontrollermodel en teleportatie

Als u bewegingscontrollers in uw app wilt weergeven die overeenkomen met de fysieke controllers die uw gebruikers vasthouden en verwoorden omdat er verschillende knoppen worden ingedrukt, kunt u de MotionController-prefab gebruiken in de Mixed Reality Toolkit. Met deze prefab laadt het juiste glTF-model dynamisch tijdens runtime vanuit het geïnstalleerde bewegingscontrollerstuurprogramma van het systeem. Het is belangrijk om deze modellen dynamisch te laden in plaats van ze handmatig te importeren in de editor, zodat uw app fysiek nauwkeurige 3D-modellen weergeeft voor eventuele huidige en toekomstige controllers die uw gebruikers mogelijk hebben.

  1. Volg de instructies 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 de MixedRealityCameraParent prefab als onderdeel van de Stappen Aan de slag, kunt u aan de slag! Deze prefab omvat motion controller rendering. Anders voegt u Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab toe aan uw scène vanuit het deelvenster Project. U wilt deze prefab toevoegen als een onderliggend object dat u gebruikt om de camera te verplaatsen wanneer de gebruiker teleporteert binnen uw scène, zodat de controllers bij de gebruiker komen. Als uw app geen teleporteert, voegt u de prefab toe aan de hoofdmap van uw scène.

Objecten gooien

Het gooien van objecten in virtual reality is een moeilijker probleem dan het in eerste instantie lijkt. Net als bij de meeste fysiek gebaseerde interacties, wanneer het gooien in het spel op een onverwachte manier optreedt, is het onmiddellijk duidelijk en breekt de onderdompeling. We hebben enige tijd besteed aan het diep nadenken over het vertegenwoordigen van een fysiek correct gooiend gedrag en hebben een paar richtlijnen bedacht, mogelijk gemaakt via updates voor ons platform, die we graag met u willen delen.

U vindt hier een voorbeeld van hoe u het implementeren van gooit. Dit voorbeeld volgt deze vier richtlijnen:

  • Gebruik de snelheid van de controller in plaats van positie. In de update van november naar Windows hebben we een wijziging in gedrag geïntroduceerd in de status 'Bij benadering'. Wanneer deze status zich bevindt, blijft snelheidsinformatie over de controller gerapporteerd zolang we geloven dat de hoge nauwkeurigheid, die vaak langer is dan positie, hoge nauwkeurigheid blijft.

  • Neem de hoeksnelheid van de controller op. Deze logica is allemaal opgenomen in het throwing.cs bestand in de GetThrownObjectVelAngVel statische methode, binnen het bovenstaande pakket:

    1. Aangezien de hoeksnelheid wordt bespaard, moet het gegooid object dezelfde hoeksnelheid behouden als op het moment van de gooien: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Aangezien het midden van de massa van het geworpen object waarschijnlijk niet bij de oorsprong van de griphouding ligt, heeft het waarschijnlijk een andere snelheid dan die van de controller in het referentiekader van de gebruiker. Het deel van de snelheid van het object heeft op deze manier bijgedragen, is de onmiddellijke tangensieve snelheid van het midden van de massa van het gegenereerde object rond de oorsprong van de controller. Deze tangensiële snelheid is het kruisproduct van de hoeksnelheid van de controller met de vector die de afstand vertegenwoordigt tussen de oorsprong van de controller en het midden van de massa van het gegooide object.

      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 tangensiële snelheid: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Let goed op het tijdstip waarop we de snelheid toepassen. Wanneer een knop wordt ingedrukt, kan het tot 20 ms duren voordat die gebeurtenis via Bluetooth naar het besturingssysteem opbelt. Dit betekent dat als u pollt naar een controllerstatus verandert van ingedrukt naar niet ingedrukt of andersom, de controller informatie vormt die u ermee krijgt, deze wijziging daadwerkelijk voorkomt. Verder wordt de controllerhouding die door onze polling-API wordt gepresenteerd, voorspeld dat deze een waarschijnlijke houding weerspiegelt op het moment dat het frame wordt weergegeven, wat in de toekomst meer dan 20 ms kan zijn. Dit is handig voor het weergeven van vastgehouden objecten, maar vormt ons tijdprobleem voor het richten van het object op het moment dat de gebruiker de gooi heeft vrijgegeven. Gelukkig bevat de status met de update van november, wanneer een Unity-gebeurtenis zoals InteractionSourcePressed of InteractionSourceReleased wordt verzonden, de historische posegegevens van terug wanneer de knop werd ingedrukt of vrijgegeven. Als u de meest nauwkeurige controllerweergave en controller wilt krijgen tijdens worpen, moet u polling en eventing correct gebruiken, indien van toepassing:

    • Voor controllerweergave van elk frame moet uw app het GameObject van de controller op de doorstuur voorspelde controllerhouding plaatsen voor de fotontijd van het huidige frame. U krijgt deze gegevens van Polling-API's van Unity, zoals XR. InputTracking.GetLocalPosition of XR. WSA. Input.InteractionManager.GetCurrentReading.
    • Voor controller die gericht is op een pers of release, moet uw app raycasten en trajecten berekenen op basis van de historische controllerhouding voor die pers- of release-gebeurtenis. U krijgt deze gegevens van Unity-gebeurtenis-API's, zoals InteractionManager.InteractionSourcePressed.
  • Gebruik de griphouding. De snelheid en snelheid van Angular worden gerapporteerd ten opzichte van de houding van de grip, niet de aanwijzerpositie.

Het gooien zal blijven verbeteren met toekomstige Windows-updates en u kunt verwachten dat u hier meer informatie vindt.

Beweging en bewegingscontrollers in MRTK

U kunt beweging en bewegingscontroller openen vanuit de invoerbeheer.

Volg de zelfstudies

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

MR Input 213 - Bewegingscontroller
MR Input 213 - Bewegingscontroller

Volgend controlepunt voor ontwikkeling

Als u het Unity-ontwikkeltraject volgt dat we hebben opgesteld, bevindt u zich midden in het verkennen van de bouwstenen van de MRTK-kern. Vanaf hier kunt u doorgaan naar de volgende bouwsteen:

Of ga naar de mogelijkheden en API's van het Mixed Reality-platform:

U kunt altijd op elk gewenst moment teruggaan naar de Unity-ontwikkelingscontrolepunten .

Zie ook