Partager via


Mouvements dans Unity

Il existe deux façons clés de prendre des mesures sur votre regard dans Unity, les mouvements de main et les contrôleurs de mouvement dans HoloLens et HMD immersif. Vous accédez aux données des deux sources d’entrée spatiale via les mêmes API dans Unity.

Unity fournit deux méthodes principales pour accéder aux données d’entrée spatiale pour Windows Mixed Reality. Les API Input.GetButton/Input.GetAxis courantes fonctionnent sur plusieurs kits SDK Unity XR, tandis que l’API InteractionManager/GestureRecognizer spécifique à Windows Mixed Reality expose l’ensemble complet de données d’entrée spatiale.

API de mouvement composite de haut niveau (GestureRecognizer)

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

Votre application peut également reconnaître des mouvements composites de niveau supérieur pour les sources d’entrée spatiales, les mouvements de tap, de conservation, de manipulation et de navigation. Vous pouvez reconnaître ces mouvements composites entre les mains et les contrôleurs de mouvement à l’aide de GestureRecognizer.

Chaque événement De mouvement sur le GestureRecognizer fournit la SourceKind pour l’entrée ainsi que le rayon de tête ciblant au moment de l’événement. Certains événements fournissent des informations supplémentaires spécifiques au contexte.

Il n’existe que quelques étapes requises pour capturer des mouvements à l’aide d’un module De reconnaissance de mouvement :

  1. Créer un générateur de reconnaissance de mouvement
  2. Spécifier les mouvements à surveiller
  3. S’abonner à des événements pour ces mouvements
  4. Commencer à capturer des mouvements

Créer un générateur de reconnaissance de mouvement

Pour utiliser GestureRecognizer, vous devez avoir créé un GestureRecognizer :

GestureRecognizer recognizer = new GestureRecognizer();

Spécifier les mouvements à surveiller

Spécifiez les mouvements qui vous intéressent via SetRecognizableGestures() :

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

S’abonner à des événements pour ces mouvements

Abonnez-vous aux événements pour les mouvements qui vous intéressent.

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

Remarque

Les mouvements de navigation et de manipulation s’excluent mutuellement sur une instance d’un GestureRecognizer.

Commencer à capturer des mouvements

Par défaut, un GestureRecognizer ne surveille pas l’entrée tant que StartCapturingGestures() n’est pas appelé. Il est possible qu’un événement de mouvement puisse être généré après que StopCapturingGestures() soit appelé si l’entrée a été effectuée avant l’image où StopCapturingGestures() a été traitée. Le GestureRecognizer se rappellera s’il était activé ou désactivé pendant le cadre précédent dans lequel le mouvement s’est réellement produit, et il est donc fiable de démarrer et d’arrêter la surveillance des mouvements en fonction du ciblage du regard de ce cadre.

recognizer.StartCapturingGestures();

Arrêter la capture des mouvements

Pour arrêter la reconnaissance des mouvements :

recognizer.StopCapturingGestures();

Suppression d’un module de reconnaissance de mouvement

N’oubliez pas de vous désabonner des événements abonnés avant de détruire un objet GestureRecognizer .

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 Unity

Modèle de contrôleur de mouvement et téléportation
Modèle de contrôleur de mouvement et téléportation

Pour afficher les contrôleurs de mouvement dans votre application qui correspondent aux contrôleurs physiques que vos utilisateurs tiennent et articulent en appuyant sur différents boutons, vous pouvez utiliser le préfabriqué MotionController dans Mixed Reality Toolkit. Ce préfabriqué charge dynamiquement le modèle glTF approprié au moment de l’exécution à partir du pilote de contrôleur de mouvement installé du système. Il est important de charger ces modèles dynamiquement 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.

  1. Suivez les instructions de prise en main pour télécharger Mixed Reality Toolkit et l’ajouter à votre projet Unity.
  2. Si vous avez remplacé votre appareil photo par le prefab MixedRealityCameraParent dans le cadre des étapes de prise en main, vous êtes bon d’aller ! Ce préfabriqué comprend le rendu du contrôleur de mouvement. Sinon, ajoutez Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab dans votre scène à partir du volet Projet. Vous souhaiterez ajouter ce préfabriqué en tant qu’enfant de l’objet parent que vous utilisez pour déplacer la caméra lorsque l’utilisateur se téléporte dans votre scène, afin que les contrôleurs soient associés à l’utilisateur. Si votre application n’implique pas de téléportage, ajoutez simplement le préfabriqué à la racine de votre scène.

Levée d’objets

La levée d’objets dans la réalité virtuelle est un problème plus difficile que cela peut sembler au début. Comme avec la plupart des interactions physiquement basées sur les interactions, lorsque vous jetez dans un jeu agit de manière inattendue, il est immédiatement évident et interrompt l’immersion. Nous avons passé un certain temps à réfléchir profondément à la façon de représenter un comportement de levée physiquement correct et avons créé quelques instructions, activées par le biais de mises à jour de notre plateforme, que nous aimerions partager avec vous.

Vous trouverez un exemple de la façon dont nous vous recommandons d’implémenter la levée ici. Cet exemple suit ces quatre instructions :

  • Utilisez la vitesse du contrôleur au lieu de la position. Dans la mise à jour de novembre vers Windows, nous avons introduit un changement de comportement dans l’état de suivi positionnel « Approximatif ». Dans cet état, les informations de vélocité sur le contrôleur continueront d’être signalées tant que nous pensons que sa précision élevée, qui est souvent plus longue que la position reste élevée.

  • Incorporez la vitesse angulaire du contrôleur. Cette logique est tout contenu dans le throwing.cs fichier de la GetThrownObjectVelAngVel méthode statique, dans le package lié ci-dessus :

    1. Comme la vitesse angulaire est conservée, l’objet levée doit conserver la même vitesse angulaire qu’au moment de la levée : objectAngularVelocity = throwingControllerAngularVelocity;

    2. Comme le centre de masse de l’objet levée n’est probablement pas à l’origine de la pose de poignée, il a probablement une vitesse différente de celle du contrôleur dans le cadre de référence de l’utilisateur. La partie de la vitesse de l’objet a contribué de cette façon est la vitesse tangentielle instantanée du centre de masse de l’objet levée autour de l’origine du contrôleur. Cette vitesse tangentielle est le produit croisé de la vitesse angulaire du contrôleur avec le vecteur représentant la distance entre l’origine du contrôleur et le centre de masse de l’objet levée.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. La vitesse totale de l’objet levée est la somme de la vitesse du contrôleur et de cette vitesse tangentielle : objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Faites attention au moment auquel nous appliquons la vitesse. Lorsqu’un bouton est enfoncé, il peut prendre jusqu’à 20 ms pour que cet événement bascule via Bluetooth vers le système d’exploitation. Cela signifie que si vous interrogez le changement d’état d’un contrôleur enfoncé pour ne pas appuyer ou l’autre façon de contourner, le contrôleur pose les informations qu’il obtient sera réellement en avance sur ce changement d’état. En outre, la pose du contrôleur présentée par notre API d’interrogation est prédite pour refléter une pose probable au moment où la trame sera affichée, ce qui pourrait être plus de 20 ms à l’avenir. Cela est bon pour le rendu d’objets conservés, mais compose notre problème de temps pour cibler l’objet lorsque nous calculons la trajectoire pour le moment où l’utilisateur a libéré la levée. Heureusement, avec la mise à jour de novembre, lorsqu’un événement Unity tel qu’InteractionSourcePressed ou InteractionSourceReleased est envoyé, l’état inclut les données de pose historiques de retour lorsque le bouton a été appuyé ou libéré. Pour obtenir le rendu du contrôleur le plus précis et le ciblage du contrôleur pendant les levées, vous devez utiliser correctement l’interrogation et l’événementing, le cas échéant :

    • Pour le rendu du contrôleur à chaque image, votre application doit positionner le GameObject du contrôleur au niveau de la pose du contrôleur prédit avant pour l’heure photon du cadre actuel. Vous obtenez ces données à partir d’API d’interrogation Unity telles que XR. InputTracking.GetLocalPosition ou XR. WSA. Input.InteractionManager.GetCurrentReading.
    • Pour le ciblage du contrôleur sur une presse ou un communiqué, votre application doit raycast et calculer les trajectoires en fonction de la pose du contrôleur historique pour cet événement de presse ou de communiqué. Vous obtenez ces données à partir d’API d’événements Unity, telles que InteractionManager.InteractionSourcePressed.
  • Utilisez la pose de poignée. La vélocité et la vitesse angulaires sont signalées par rapport à la pose de poignée, et non à la pose de pointeur.

La levée continuera à s’améliorer avec les futures mises à jour Windows, et vous pouvez vous attendre à trouver plus d’informations ici.

Mouvements et contrôleurs de mouvement dans MRTK

Vous pouvez accéder au mouvement et au contrôleur de mouvement à partir du Gestionnaire d’entrée.

Avancer avec des tutoriels

Des didacticiels pas à pas, avec des exemples de personnalisation plus détaillés, sont disponibles dans Mixed Reality Academy :

Entrée MR 213 - Contrôleur de mouvement
Entrée MR 213 - Contrôleur de mouvement

Point de contrôle de développement suivant

Si vous suivez le parcours de développement Unity que nous avons mis en place, vous êtes en train d’explorer les blocs de construction principaux MRTK. À partir d’ici, vous pouvez passer au composant suivant :

Ou accéder aux API et fonctionnalités de la plateforme Mixed Reality :

Vous pouvez revenir aux points de contrôle de développement Unity à tout moment.

Voir aussi