Mouvements dans UnityGestures in Unity

Il existe deux façons principales d’agir sur votre point de regard, les gestes manuels et les contrôleurs de mouvement dans HoloLens et les HMD immersifs.There are two key ways to take action on your gaze in Unity, hand gestures and motion controllers in HoloLens and Immersive HMD. Vous accédez aux données des deux sources d’entrée spatiale via les mêmes API dans Unity.You access the data for both sources of spatial input through the same APIs in Unity.

Unity fournit deux méthodes principales pour accéder aux données d’entrée spatiale pour Windows Mixed Reality.Unity provides two primary ways to access spatial input data for Windows Mixed Reality. Les API d’entrée. GetButton/Input. GetAxis courantes fonctionnent sur plusieurs kits de développement logiciel (SDK) XR, tandis que l’API InteractionManager/GestureRecognizer propre à Windows Mixed Reality expose l’ensemble complet des données d’entrée spatiale.The common Input.GetButton/Input.GetAxis APIs work across multiple Unity XR SDKs, while the InteractionManager/GestureRecognizer API specific to Windows Mixed Reality exposes the full set of spatial input data.

API de mouvement composite de haut niveau (GestureRecognizer)High-level composite gesture APIs (GestureRecognizer)

Espace de noms : UnityEngine. XR. WSA. InputNamespace: UnityEngine.XR.WSA.Input
Types: GestureRecognizer, GestureSettings, InteractionSourceKindTypes: GestureRecognizer, GestureSettings, InteractionSourceKind

Votre application peut également reconnaître les gestes composites de niveau supérieur pour les sources d’entrée spatiale, le TAP, le maintien, la manipulation et les gestes de navigation.Your app can also recognize higher-level composite gestures for spatial input sources, Tap, Hold, Manipulation, and Navigation gestures. Vous pouvez reconnaître ces gestes composites sur les mains et les contrôleurs de mouvement à l’aide de GestureRecognizer.You can recognize these composite gestures across both hands and motion controllers using the GestureRecognizer.

Chaque événement de mouvement sur le GestureRecognizer fournit le SourceKind pour l’entrée, ainsi que le rayon de l’en-tête de ciblage au moment de l’événement.Each Gesture event on the GestureRecognizer provides the SourceKind for the input as well as the targeting head ray at the time of the event. Certains événements fournissent des informations supplémentaires spécifiques au contexte.Some events provide additional context-specific information.

Seules quelques étapes sont requises pour capturer des mouvements à l’aide d’un module de reconnaissance de mouvement :There are only a few steps required to capture gestures using a Gesture Recognizer:

  1. Créer un module de reconnaissance de mouvementCreate a new Gesture Recognizer
  2. Spécifier les gestes à surveillerSpecify which gestures to watch for
  3. S’abonner à des événements pour ces mouvementsSubscribe to events for those gestures
  4. Démarrer la capture des mouvementsStart capturing gestures

Créer un module de reconnaissance de mouvementCreate a new Gesture Recognizer

Pour utiliser GestureRecognizer, vous devez avoir créé un GestureRecognizer:To use the GestureRecognizer, you must have created a GestureRecognizer:

GestureRecognizer recognizer = new GestureRecognizer();

Spécifier les gestes à surveillerSpecify which gestures to watch for

Spécifiez les gestes qui vous intéressent via SetRecognizableGestures ():Specify which gestures you're interested in via SetRecognizableGestures():

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

S’abonner à des événements pour ces mouvementsSubscribe to events for those gestures

Abonnez-vous aux événements pour les mouvements qui vous intéressent.Subscribe to events for the gestures you're interested in.

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

Notes

Les mouvements de navigation et de manipulation s’excluent mutuellement sur une instance d’un GestureRecognizer.Navigation and Manipulation gestures are mutually exclusive on an instance of a GestureRecognizer.

Démarrer la capture des mouvementsStart capturing gestures

Par défaut, un GestureRecognizer n’analyse pas l’entrée tant que StartCapturingGestures () n’est pas appelé.By default, a GestureRecognizer doesn't monitor input until StartCapturingGestures() is called. Il est possible qu’un événement de mouvement soit généré après l’appel de StopCapturingGestures () si l’entrée a été effectuée avant le frame dans lequel StopCapturingGestures () a été traité.It's possible that a gesture event may be generated after StopCapturingGestures() is called if input was performed before the frame where StopCapturingGestures() was processed. Le GestureRecognizer se souvient s’il était activé ou désactivé au cours de la trame précédente dans laquelle le mouvement s’est réellement produit. il est donc fiable pour démarrer et arrêter la surveillance des mouvements en fonction du point de vue du regard de ce frame.The GestureRecognizer will remember whether it was on or off during the previous frame in which the gesture actually occurred, and so it's reliable to start and stop gesture monitoring based on this frame's gaze targeting.

recognizer.StartCapturingGestures();

Arrêter la capture des mouvementsStop capturing gestures

Pour arrêter la reconnaissance des mouvements :To stop gesture recognition:

recognizer.StopCapturingGestures();

Suppression d’un module de reconnaissance de mouvementRemoving a gesture recognizer

N’oubliez pas de vous désabonner des événements souscrits avant de détruire un objet GestureRecognizer .Remember to unsubscribe from subscribed events before destroying a GestureRecognizer object.

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

Rendu du modèle de contrôleur de mouvement dans UnityRendering the motion controller model in Unity

Modèle de contrôleur de mouvement et téléportageMotion Controller model and teleportation
Modèle de contrôleur de mouvement et téléportageMotion controller model and teleportation

Pour afficher les contrôleurs de mouvement de votre application qui correspondent aux contrôleurs physiques que vos utilisateurs détiennent et qui s’articulent à mesure que les différents boutons sont enfoncés, vous pouvez utiliser la Prefab MotionController dans le Toolkit de réalité mixte.To render motion controllers in your app that match the physical controllers your users are holding and articulate as various buttons are pressed, you can use the MotionController prefab in the Mixed Reality Toolkit. Ce Prefab charge dynamiquement le modèle glTF correct au moment de l’exécution à partir du pilote du contrôleur de mouvement installé du système.This prefab dynamically loads the correct glTF model at runtime from the system's installed motion controller driver. Il est important de charger ces modèles de manière dynamique plutôt que de les importer manuellement dans l’éditeur, afin que votre application affiche des modèles 3D physiquement précis pour tous les contrôleurs actuels et futurs que vos utilisateurs peuvent avoir.It's important to load these models dynamically rather than importing them manually in the editor, so that your app will show physically accurate 3D models for any current and future controllers your users may have.

  1. Suivez les instructions prise en main pour télécharger la boîte à outils de réalité mixte et l’ajouter à votre projet Unity.Follow the Getting Started instructions to download the Mixed Reality Toolkit and add it to your Unity project.
  2. Si vous avez remplacé votre appareil photo par le MixedRealityCameraParent Prefab dans le cadre des étapes de prise en main, vous êtes en déplacement.If you replaced your camera with the MixedRealityCameraParent prefab as part of the Getting Started steps, you're good to go! Prefab comprend le rendu du contrôleur de mouvement.That prefab includes motion controller rendering. Sinon, ajoutez Assets/HoloToolkit/Input/Prefabs/MotionControllers. Prefab à votre scène à partir du volet de projet.Otherwise, add Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab into your scene from the Project pane. Vous pouvez ajouter ce Prefab en tant qu’enfant de n’importe quel objet parent que vous utilisez pour déplacer la caméra lorsque l’utilisateur téléporte dans votre scène, afin que les contrôleurs soient fournis avec l’utilisateur.You'll want to add that prefab as a child of whatever parent object you use to move the camera around when the user teleports within your scene, so that the controllers come along with the user. Si votre application n’implique pas de téléportage, ajoutez simplement le Prefab à la racine de votre scène.If your app doesn't involve teleporting, just add the prefab at the root of your scene.

Lever des objetsThrowing objects

La levée d’objets dans la réalité virtuelle est un problème plus difficile qu’il n’y paraît d’abord.Throwing objects in virtual reality is a harder problem than it may at first seem. Comme avec la plupart des interactions basées physiquement, lorsque la levée dans le jeu se fait de manière inattendue, elle est immédiatement évidente et s’interrompt.As with most physically based interactions, when throwing in game acts in an unexpected way, it's immediately obvious and breaks immersion. Nous avons passé un peu de temps à réfléchir à la façon de représenter un comportement de levée de manière physique et à rencontrer quelques recommandations, activées par le biais des mises à jour de notre plateforme, que nous aimerions partager avec vous.We've spent some time thinking deeply about how to represent a physically correct throwing behavior, and have come up with a few guidelines, enabled through updates to our platform, that we would like to share with you.

Vous trouverez un exemple de la façon dont nous vous recommandons d’implémenter la levée ici.You can find an example of how we recommend to implement throwing here. Cet exemple suit les quatre instructions suivantes :This sample follows these four guidelines:

  • Utilisez la vélocité du contrôleur au lieu de la position.Use the controller’s velocity instead of position. Dans la mise à jour de novembre de Windows, nous avons introduit un changement de comportement dans l' État de suivi positionnel « approximatif».In the November update to Windows, we introduced a change in behavior when in the ''Approximate'' positional tracking state. Dans cet État, les informations de vélocité sur le contrôleur continuent d’être signalées aussi longtemps que nous pensons qu’il s’agit d’une précision élevée, qui est souvent plus longue que la position demeure une précision élevée.When in this state, velocity information about the controller will continue to be reported for as long as we believe its high accuracy, which is often longer than position remains high accuracy.

  • Incorporez la vélocité angulaire du contrôleur.Incorporate the angular velocity of the controller. Cette logique est contenue dans le throwing.cs fichier de la GetThrownObjectVelAngVel méthode statique, dans le package lié ci-dessus :This logic is all contained in the throwing.cs file in the GetThrownObjectVelAngVel static method, within the package linked above:

    1. Comme la vélocité angulaire est conservée, l’objet levé doit conserver la même vélocité angulaire qu’au moment de la levée : objectAngularVelocity = throwingControllerAngularVelocity;As angular velocity is conserved, the thrown object must maintain the same angular velocity as it had at the moment of the throw: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Comme le centre de la masse de l’objet levé n’est probablement pas à l’origine de la poignée, il a probablement une vitesse différente de celle du contrôleur dans le cadre de la référence de l’utilisateur.As the center of mass of the thrown object is likely not at the origin of the grip pose, it likely has a different velocity than that of the controller in the frame of reference of the user. La partie de la rapidité de l’objet utilisée de cette façon est la vélocité tangentielle instantanée du centre de la masse de l’objet levé autour de l’origine du contrôleur.The portion of the object’s velocity contributed in this way is the instantaneous tangential velocity of the center of mass of the thrown object around the controller origin. Cette vélocité tangentielle est le produit croisé de la vélocité angulaire du contrôleur avec le vecteur représentant la distance entre l’origine du contrôleur et le centre de la masse de l’objet levé.This tangential velocity is the cross product of the angular velocity of the controller with the vector representing the distance between the controller origin and the center of mass of the thrown object.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. La vélocité totale de l’objet levé est la somme de la vélocité du contrôleur et de cette vélocité tangentielle : objectVelocity = throwingControllerVelocity + tangentialVelocity;The total velocity of the thrown object is the sum of velocity of the controller and this tangential velocity: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Portez une attention particulière à l' heure à laquelle nous appliquons la vélocité.Pay close attention to the time at which we apply the velocity. Quand vous appuyez sur un bouton, il peut falloir jusqu’à 20 ms pour que cet événement se propage via Bluetooth au système d’exploitation.When a button is pressed, it can take up to 20 ms for that event to bubble up through Bluetooth to the operating system. Cela signifie que si vous interrogez une modification de l’état d’un contrôleur en l’appuyant sur non enfoncé ou sur l’autre, le contrôleur vous pose les informations dont vous bénéficiez en effet.This means that if you poll for a controller state change from pressed to not pressed or the other way around, the controller pose information you get with it will actually be ahead of this change in state. En outre, la présentation du contrôleur présentée par notre API d’interrogation est anticipée afin de refléter une situation probable au moment où l’image sera affichée, ce qui peut être supérieur à 20 ms à l’avenir.Further, the controller pose presented by our polling API is forward predicted to reflect a likely pose at the time the frame will be displayed which could be more than 20 ms in the future. Cela est idéal pour le rendu des objets détenus, mais il compose notre problème de temps pour cibler l’objet à mesure que nous calculons la trajectoire pour le moment où l’utilisateur a relâché la levée.This is good for rendering held objects, but compounds our time problem for targeting the object as we calculate the trajectory for the moment the user released the throw. Heureusement, avec la mise à jour de novembre, lors de l’envoi d’un événement Unity comme InteractionSourcePressed ou InteractionSourceReleased , l’état contient les données de la pose de l’historique de retour lorsque le bouton était enfoncé ou relâché.Fortunately, with the November update, when a Unity event like InteractionSourcePressed or InteractionSourceReleased is sent, the state includes the historical pose data from back when the button was pressed or released. Pour optimiser le rendu du contrôleur et le ciblage du contrôleur lors des levées, vous devez utiliser correctement l’interrogation et l’événement, selon le cas :To get the most accurate controller rendering and controller targeting during throws, you must correctly use polling and eventing, as appropriate:

  • Utilisez la poignée.Use the grip pose. La rapidité et la vélocité angulaires sont rapportées par rapport à la pose de la poignée, et non à la pose du pointeur.Angular velocity and velocity are reported relative to the grip pose, not pointer pose.

La génération continuera à s’améliorer avec les futures mises à jour de Windows, et vous pouvez vous attendre à trouver plus d’informations ici.Throwing will continue to improve with future Windows updates, and you can expect to find more information on it here.

Contrôleurs de mouvement et de mouvement dans MRTK v2Gesture and Motion Controllers in MRTK v2

Vous pouvez accéder au contrôleur de mouvement et de mouvement à partir du gestionnaire d’entrée.You can access gesture and motion controller from the input Manager.

Avancer avec des tutorielsFollow along with tutorials

Des didacticiels pas à pas, avec des exemples de personnalisation plus détaillés, sont disponibles dans Mixed Reality Academy :Step-by-step tutorials, with more detailed customization examples, are available in the Mixed Reality Academy:

Entrée MR 213-contrôleur de mouvementMR Input 213 - Motion controller
Entrée MR 213-contrôleur de mouvementMR Input 213 - Motion controller

Point de contrôle de développement suivantNext Development Checkpoint

Si vous suivez le parcours de développement Unity que nous avons disposé, vous êtes au cœur de l’exploration des blocs de construction MRTK Core.If you're following the Unity development journey we've laid out, you're in the midst of exploring the MRTK core building blocks. À partir de là, vous pouvez passer au module suivant :From here, you can continue to the next building block:

Ou accéder aux API et fonctionnalités de la plateforme Mixed Reality :Or jump to Mixed Reality platform capabilities and APIs:

Vous pouvez revenir aux points de contrôle de développement Unity à tout moment.You can always go back to the Unity development checkpoints at any time.

Voir aussiSee also