Suivi de la main

Note

Disponible uniquement dans les versions 1.1.0 et ultérieures du plugin OpenXR.

L'API de suivi des mains a été initialement ajoutée à OpenXR par Microsoft pour mettre à la disposition du client XR les informations de suivi des mains et des doigts des utilisateurs. L'API fournit des données de pose pour tous les os des mains des joueurs mais laisse une certaine marge d'interprétation dans la manière dont l'API est implémentée par le runtime XR.

Dans SteamVR, la prise en charge a été ajoutée sur la base du système de suivi des mains existant de Valves, qui fournit également des données osseuses entièrement extrapolées à partir des entrées de la manette et des capteurs de proximité si le suivi des mains n'est pas pris en charge de manière native par le système utilisé.

Meta a ajouté le support de cette API à son runtime OpenXR mobile, lié à la fonctionnalité de suivi de main existante sur le Quest. Notez que vous devez activer le suivi de main dans les paramètres d'exportation pour que cette fonctionnalité soit active. L'API de suivi de main est uniquement utilisée pour le suivi de main pure, aucune donnée de pose n'est présentée lorsque des contrôleurs sont utilisés.

Note

Lors de l'utilisation de l'API de suivi de main, il est donc important de prendre en compte les capacités de la plate-forme cible. Cela peut s'améliorer avec le temps, au fur et à mesure que des retours sont fournis au groupe de travail OpenXR.

L'API de suivi de main définit la structure osseuse à laquelle tous les runtimes XR doivent se conformer, mais elle ne dicte pas l'orientation des os au repos ni aucune exigence de taille.

../../../_images/hand_tracking_bones.png

Image reproduite avec l’aimable autorisation de la spécification Khronos OpenXR.

L'API de suivi des mains est indépendante du système d'action et ne fait pas appel à ses poses. Les données de suivi des mains sont fournies en interne dans l'espace global (par rapport au point d'origine des volumes de suivi) et les nœuds de suivi des mains doivent donc avoir le nœud ARVROrigin comme parent, et non un nœud ARVRController.

Le plugin expose l'API de suivi de main comme deux systèmes distincts. Un qui met à jour les positions d'un arbre de nœuds et un qui met à jour les os d'un Skeleton afin que la déformation du maillage puisse être utilisée.

Suivi de la main basé sur les nœuds

Cette implémentation est la plus versatile car elle ne nécessite aucune connaissance du modèle de main en pose de repos. Notez que le plugin est livré avec deux scènes d'exemple appelées left_hand_nodes.tscn et right_hand_nodes.tscn que vous pouvez instancier comme noeuds enfants du noeud ARVROrigin. Ces scènes contiennent une logique permettant de redimensionner automatiquement les maillages utilisés pour les adapter à la taille des données osseuses fournies.

../../../_images/arvr_nodes_example.png

A la racine de cette scène se trouve un noeud Spatial auquel est attribué le script config/OpenXRHand.gdns. Cette classe du plugin va positionner le nœud spatial à la base de la main (voir Palm dans notre image ci-dessus) et va mettre à jour la position et l'orientation de ses enfants.

../../../_images/arvr_openxr_hand.png

Il y a deux propriétés ici :

  • Hand identifie si nous suivons la position de la main gauche ou droite.

  • L'option Motion Range n'est disponible que sur SteamVR et limite la distance à laquelle la main peut se rapprocher. Elle n'est utilisée qu'en conjonction avec le suivi de la main basé sur les données de la manette.

Notre nœud spatial a besoin d'un certain nombre de nœuds enfants avec des noms codés en dur qui seront mis à jour par notre système de suivi des mains. Le type de nœuds n'est pas important, notre script d'exemple utilise les nœuds MeshInstance pour visualiser également les os.

../../../_images/hand_tracking_nodes.png

Tout d'abord, nous trouvons le noeud enfant Wrist, sous lequel il y a des noeuds pour chaque doigt. Chaque noeud commence par le nom du doigt suivi du nom de l'os. Les noms des doigts sont Thumb, Index, Middle, Ring et Little. Les noms des os sont Métacarpal, Proximal, Intermédiaire, Distal et Tip. Ergo IndexDistal est l'os distal de l'index.

Note

Le pouce est le seul doigt qui n'a pas d'os intermédiaire !

Les relations parent-enfant de ces nœuds sont importantes et la main n'aura l'air correcte que si cette structure est suivie à la lettre. Notez que l'ajout de nœuds supplémentaires n'est pas un problème, les scènes d'exemple ajoutent un certain nombre de maillages d'os supplémentaires pour compléter l'apparence de la main. Notez également que les scènes d'exemple ont des scripts attachés au nœud du poignet qui mettent à jour la taille et les positions de ces nœuds supplémentaires.

Suivi de la main basé sur le squelette

La deuxième méthode prise en charge par le plugin OpenXR consiste à exposer les données osseuses sous la forme d'un noeud Skeleton. Dans ce cas, la solution est divisée en deux classes, une pour placer la main dans l'espace et la seconde pour animer le squelette susmentionné en mettant à jour les poses des os du squelette.

Cette approche permet de déformer un maillage, ce qui est une solution visuellement plus agréable, mais les différences de mise en œuvre entre les plateformes posent quelques problèmes.

Note

Microsoft a ajouté une autre API à OpenXR qui permet de récupérer un maillage de main correctement dépouillé. Cependant, comme il s'agit actuellement de la seule plateforme supportant cette API, elle n'a pas encore été ajoutée au plugin.

Pour l'instant, le plugin n'expose que les données fournies par la routine OpenXR. Le plugin a un exemple d'implémentation basé sur les maillages que Valve a mis à la disposition du public, mais ceux-ci fonctionnent de manière plus fiable lorsqu'ils sont utilisés en conjonction avec SteamVR. Ces scènes sont scenes/left_hand_mesh.tscn et scenes/right_hand_mesh.tscn et peuvent être des enfants du noeud ARVROrigin.

../../../_images/arvr_mesh_example.png

Vous trouverez ci-dessous un aperçu des étapes nécessaires à la mise en œuvre de votre propre version.

Note

La meilleure façon d'implémenter cette logique est de demander à un artiste de modéliser une main dans un logiciel 3D en utilisant les dimensions réelles de la main et de créer une armature pour la main qui suit la structure osseuse exactement comme la spécification OpenXR le dicte dans l'image en haut de cet article. Lors du skinning, il faut faire très attention en gardant à l'esprit que si le suivi complet de la main est disponible, la distance entre les articulations sera déterminée par la taille réelle de la main du joueur et peut donc être différente du modèle 3D. Après avoir importé le modèle dans Godot, vous pouvez ajouter les scripts nécessaires pour que tout fonctionne.

Pour placer le maillage de la main dans l'espace, un noeud doit être ajouté comme enfant au noeud ARVROrigin, ce noeud doit avoir le script config/OpenXRPose.gdns attaché. Lors de l'importation d'un fichier 3D, vous pouvez ajouter ce script au nœud racine du modèle importé.

Le script OpenXRPose n'est pas seulement utilisé par la logique de la main mais expose également d'autres emplacements de pose configurés dans l'action map.

../../../_images/arvr_openxr_pose.png

Les propriétés suivantes peuvent être définies sur ce nœud :

  • Invisible If Inactive active la logique qui rendra automatiquement ce noeud invisible si la main n'est pas suivie.

  • Action spécifie quelle action dans la carte d'action est suivie, ceci doit être défini avec le type spécial SkeletonBase.

  • Path spécifie le chemin d'entrée d'OpenXR, c'est /user/hand/left pour la main gauche et /user/hand/right pour la main droite.

L'étape suivante consiste à ajouter le script config/OpenXRSkeleton.gdns au noeud squelette du modèle 3D. Ce script possède les deux mêmes propriétés que le script OpenXRHand, à savoir Hand et Motion Range, et elles ont la même utilité.

Notez que les noms d'os sont standardisés, la liste des noms d'os est présentée ci-dessous et doivent être suffixés par _L ou _R selon que l'os est destiné respectivement à la main gauche ou à la main droite :

  • Paume

  • Poignet

  • Thumb_Metacarpal

  • Thumb_Proximal

  • Thumb_Distal

  • Thumb_Tip

  • Index_Metacarpal

  • Index_Proximal

  • Index_Intermediate

  • Index_Distal

  • Index_Tip

  • Middle_Metacarpal

  • Middle_Proximal

  • Middle_Intermediate

  • Middle_Distal

  • Middle_Tip

  • Ring_Metacarpal

  • Ring_Proximal

  • Ring_Intermediate

  • Ring_Distal

  • Ring_Tip

  • Little_Metacarpal

  • Little_Proximal

  • Little_Intermediate

  • Little_Distal

  • Little_Tip

Enfin, et c'est une fonctionnalité standard de Godot, un ajout commun au suivi de la main est de suivre l'emplacement de l'extrémité d'un doigt pour l'interaction physique. Ceci peut être accompli avec le nœud BoneAttachment. Il suffit de l'ajouter comme nœud enfant au nœud Skeleton et de sélectionner l'os que vous voulez suivre. Maintenant, vous pouvez ajouter l'objet physique désiré comme enfant à ce nœud.