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 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 Input.GetButton/Input.GetAxis API's werken op 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, tik-, wacht-, manipulatie- en navigatiebewegingen. U kunt deze samengestelde bewegingen over beide handen en bewegingscontrollers herkennen met behulp van de GestureRecognizer.

Elke gebaargebeurtenis op de GestureRecognizer biedt het SourceKind voor de invoer, evenals de doelkopstraal op het moment van de gebeurtenis. Sommige gebeurtenissen bieden aanvullende contextspecifieke informatie.

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

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

Een nieuwe Gesture Recognizer maken

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

GestureRecognizer recognizer = new GestureRecognizer();

Opgeven voor welke bewegingen moet watch

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 uit op een instantie van een GestureRecognizer.

Beginnen met het vastleggen van bewegingen

Standaard controleert een GestureRecognizer de invoer pas als StartCapturingGestures() wordt aangeroepen. Het is mogelijk dat er een gebaargebeurtenis wordt gegenereerd nadat StopCapturingGestures() is aangeroepen als invoer is uitgevoerd vóór het frame waarin StopCapturingGestures() is verwerkt. De GestureRecognizer onthoudt of deze was in- of uitgeschakeld tijdens het vorige frame waarin het gebaar zich daadwerkelijk voordeed, en daarom is het betrouwbaar om bewegingscontrole te starten en te stoppen op basis van het staren van dit frame.

recognizer.StartCapturingGestures();

Stoppen met het vastleggen van bewegingen

Gebarenherkenning stoppen:

recognizer.StopCapturingGestures();

Een gebarenherkenning verwijderen

Vergeet niet om u af te melden voor 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

Motion Controller-model en teleportatie
Bewegingscontrollermodel en teleportatie

Als u bewegingscontrollers in uw app wilt weergeven die overeenkomen met de fysieke controllers die uw gebruikers vasthouden en uitspreken terwijl verschillende knoppen worden ingedrukt, kunt u de motioncontroller-prefab gebruiken in de Mixed Reality Toolkit. Met deze prefab wordt het juiste glTF-model tijdens runtime dynamisch geladen 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 van uw gebruikers.

  1. Volg de Aan de slag instructies om de Mixed Reality Toolkit te downloaden en toe te voegen aan uw Unity-project.
  2. Als u uw camera hebt vervangen door de prefab MixedRealityCameraParent als onderdeel van de Aan de slag stappen, kunt u aan de slag! Deze prefab bevat bewegingscontrollerrendering. Anders voegt u Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab toe aan uw scène vanuit het deelvenster Project. U moet die prefab toevoegen als een onderliggend object dat u gebruikt om de camera te verplaatsen wanneer de gebruiker binnen uw scène teleporteert, zodat de controllers met de gebruiker worden meegeteld. Als voor uw app geen teleportatie nodig is, 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 op het eerste gezicht lijkt. Net als bij de meeste fysiek gebaseerde interacties, wanneer het gooien in een game op een onverwachte manier werkt, is het onmiddellijk duidelijk en wordt de onderdompeling verbroken. We hebben lang nagedacht over hoe we een fysiek correct werpgedrag kunnen vertegenwoordigen en hebben een aantal richtlijnen bedacht, mogelijk gemaakt via updates van ons platform, die we graag met u willen delen.

Hier vindt u een voorbeeld van de wijze waarop het implementeren van throwing wordt aangeraden. Dit voorbeeld volgt deze vier richtlijnen:

  • Gebruik de snelheid van de controller in plaats van de positie. In de update van november voor Windows hebben we een wijziging geïntroduceerd in het gedrag bij het bijhouden van de positie bij benadering. In deze toestand blijft informatie over de snelheid van de controller worden gerapporteerd zolang we geloven dat de hoge nauwkeurigheid, die vaak langer is dan de 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, in het pakket dat hierboven is gekoppeld:

    1. Als de hoeksnelheid wordt behouden, moet het geworpen object dezelfde hoeksnelheid behouden als op het moment van de worp: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Omdat het massacentrum van het geworpen object waarschijnlijk niet aan de oorsprong van de greeppositie 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 dat op deze manier is bijgedragen, is de onmiddellijke tangensiële snelheid van het massacentrum van het opgeslagen object rond de oorsprong van de controller. Deze tangensiële snelheid is het dwarsproduct van de hoeksnelheid van de controller met de vector die de afstand aangeeft tussen de oorsprong van de controller en het massacentrum van het geworpen object.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. De totale snelheid van het opgetreden 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 op een knop wordt gedrukt, kan het tot 20 ms duren voordat die gebeurtenis via Bluetooth naar het besturingssysteem opborrelt. Dit betekent dat als u peilt naar een wijziging van de controllerstatus van ingedrukt naar niet ingedrukt of andersom, de informatie over de controllerpositie die u krijgt, deze statuswijziging voorloopt. Verder wordt de controllerhouding die door onze polling-API wordt gepresenteerd, voorwaarts 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 vergroot ons tijdsprobleem voor het richten van het object bij het berekenen van de baan voor het moment dat de gebruiker de worp heeft vrijgegeven. Gelukkig bevat de status bij de update van november, wanneer een Unity-gebeurtenis zoals InteractionSourcePressed of InteractionSourceReleased wordt verzonden , de status de historische posegegevens van toen de knop werd ingedrukt of vrijgegeven. Als u de meest nauwkeurige controllerrendering en controllertargeting wilt krijgen tijdens het gooien, moet u polling en eventing correct gebruiken, indien van toepassing:

  • Gebruik de griphouding. Angular snelheid en snelheid worden gerapporteerd ten opzichte van de griphouding, niet de aanwijzerhouding.

Het genereren wordt steeds beter met toekomstige Windows-updates en u kunt er hier meer informatie over vinden.

Beweging en bewegingscontrollers in MRTK

U hebt toegang tot de bewegings- en bewegingscontroller vanuit 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-ontwikkelingstraject volgt dat we hebben opgesteld, bent u bezig met het verkennen van de basisbouwstenen van MRTK. Vanaf hier kunt u doorgaan naar de volgende bouwsteen:

Of ga naar Mixed Reality platformmogelijkheden en API's:

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

Zie ook