Chaîne de nom
XR_ANDROID_hand_mesh
Type d'extension
Extension d'instance
Numéro d'extension enregistré
704
Révision
1
Dépendances d'extension et de version
Date de dernière modification
2024-09-10
État de l'adresse IP
Aucune revendication d'adresse IP connue.
Contributeurs
Nihav Jain, Google
Cairn Overturf, Google
Spencer Quin, Google
Levana Chen, Google
Présentation
Cette extension permet le suivi des mains représenté sous la forme d'un maillage dynamique des mains.
Cette extension est destinée à fournir des tampons de sommets et d'indices pour le maillage d'une représentation personnalisée des mains de l'utilisateur. Il peut être utilisé pour l'occlusion et la visualisation.
Cette extension ne doit pas être utilisée à d'autres fins de suivi des mains.
- Pour l'interaction, vous pouvez utiliser
XR_EXT_hand_interaction
. - Pour les articulations squelettiques, vous pouvez utiliser
XR_EXT_hand_tracking
.
Les données de suivi des mains peuvent être des informations personnelles sensibles et sont étroitement liées à la confidentialité et à l'intégrité personnelles. Il est fortement recommandé que les applications qui stockent ou transfèrent des données de suivi des mains demandent toujours à l'utilisateur une acceptation active et spécifique.
Inspecter les fonctionnalités du système
Une application peut vérifier si le système est capable de suivre les mains en enchaînant une structure XrSystemHandMeshTrackingPropertiesANDROID à XrSystemProperties lors de l'appel de xrGetSystemProperties.
typedef struct XrSystemHandMeshTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsHandMeshTracking;
XrBool32 supportsTextureUV;
XrBool32 supportsVertexNormal;
} XrSystemHandMeshTrackingPropertiesANDROID;
Descriptions des membres
type
est le XrStructureType de cette structure.next
estNULL
ou un pointeur vers la structure suivante d'une chaîne de structures. Aucune de ces structures n'est définie dans OpenXR de base ni dans cette extension.supportsHandMeshTracking
est unXrBool32
, qui indique si leXrSystemId
sélectionné est compatible avec le suivi de la trame de la main.supportsTextureUV
est unXrBool32
, qui indique si leXrSystemId
sélectionné prend en charge les UV de texture pour les sommets du maillage.supportsVertexNormal
est unXrBool32
, qui indique si leXrSystemId
sélectionné est compatible avec les normales de sommet pour les sommets du maillage.
L'application doit éviter d'utiliser les fonctionnalités de maillage des mains lorsque supportsHandMeshTracking
est XR_FALSE
, car cela signifie que le système n'est pas compatible avec le suivi du maillage des mains. Dans ce cas, xrCreateHandMeshTrackerANDROID renvoie XR_ERROR_FEATURE_UNSUPPORTED
.
Si supportsHandMeshTracking
renvoie XR_TRUE
, le système prend en charge le suivi de la trame de la main. Une application doit utiliser XrHandMeshANDROID::indexCount et XrHandMeshANDROID::vertexCount pour accéder aux tampons de maillage de la main et les réutiliser dans leur boucle de rendu lors de l'appel de xrGetHandMeshANDROID à chaque frame.
Si supportsTextureUV
renvoie XR_FALSE
, le système n'est pas compatible avec les UV de texture pour les sommets du maillage. Par conséquent, une application recevra XrHandMeshANDROID::textureUVs NULL
lors de l'appel de xrGetHandMeshANDROID.
Si supportsVertexNormal
renvoie XR_FALSE
, le système n'est pas compatible avec les normales de vertex pour les sommets du maillage. Par conséquent, une application recevra XrHandMeshANDROID::normals NULL
lors de l'appel de xrGetHandMeshANDROID.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_hand_mesh
doit être activée avant d'utiliser XrSystemHandMeshTrackingPropertiesANDROID. type
doit êtreXR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROID
.next
doit êtreNULL
ou un pointeur valide vers la structure suivante dans une chaîne de structures.
Créer un identifiant de traceur de réseau maillé
XR_DEFINE_HANDLE(XrHandMeshTrackerANDROID)
Le handle XrHandMeshTrackerANDROID représente un traceur de maillage de la main pour le suivi du maillage de la main et la gestion des ressources associées.
Ce gestionnaire peut être utilisé pour accéder aux tampons de maillage de la main à l'aide d'autres fonctions de cette extension.
Une application peut créer un gestionnaire XrHandMeshTrackerANDROID à l'aide de la fonction xrCreateHandMeshTrackerANDROID.
XrResult xrCreateHandMeshTrackerANDROID(
XrSession session,
const XrHandMeshTrackerCreateInfoANDROID* createInfo,
XrHandMeshTrackerANDROID* handMeshTracker);
Descriptions des paramètres
session
est une XrSession dans laquelle le traceur de maillage de la main sera actif.createInfo
est le XrHandMeshTrackerCreateInfoANDROID utilisé pour spécifier le traceur de maillage de la main.handMeshTracker
est le handle XrHandMeshTrackerANDROID renvoyé.
Si le système n'est pas compatible avec le suivi de la trame de la main, xrCreateHandMeshTrackerANDROID renvoie XR_ERROR_FEATURE_UNSUPPORTED
.
La poignée XrHandMeshTrackerANDROID est propriétaire de toutes les ressources de suivi de la trame de la main. Une fois les expériences de suivi de la trame de la main terminées, l'application doit détruire la poignée à l'aide de la fonction xrDestroyHandMeshTrackerANDROID.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_hand_mesh
doit être activée avant d'appeler xrCreateHandMeshTrackerANDROID. session
doit être un identifiant XrSession valide.createInfo
doit être un pointeur vers une structure XrHandMeshTrackerCreateInfoANDROID valide.handMeshTracker
doit être un pointeur vers un gestionnaire XrHandMeshTrackerANDROID.
Codes de retour
XR_SUCCESS
XR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTED
XR_ERROR_FUNCTION_UNSUPPORTED
XR_ERROR_RUNTIME_FAILURE
XR_ERROR_INSTANCE_LOST
XR_ERROR_SESSION_LOST
XR_ERROR_OUT_OF_MEMORY
XR_ERROR_HANDLE_INVALID
XR_ERROR_LIMIT_REACHED
La structure XrHandMeshTrackerCreateInfoANDROID décrit les informations permettant de créer un gestionnaire XrHandMeshTrackerANDROID.
typedef struct XrHandMeshTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrHandMeshTrackerCreateInfoANDROID;
Descriptions des membres
type
est le XrStructureType de cette structure.next
estNULL
ou un pointeur vers la structure suivante d'une chaîne de structures. Aucune de ces structures n'est définie dans OpenXR de base ni dans cette extension.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_hand_mesh
doit être activée avant d'utiliser XrHandMeshTrackerCreateInfoANDROID. type
doit êtreXR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROID
.next
doit êtreNULL
ou un pointeur valide vers la structure suivante dans une chaîne de structures.
La fonction xrDestroyHandMeshTrackerANDROID libère handMeshTracker
et les ressources sous-jacentes une fois les expériences de suivi de la trame de la main terminées.
XrResult xrDestroyHandMeshTrackerANDROID(
XrHandMeshTrackerANDROID handMeshTracker);
Descriptions des paramètres
handMeshTracker
est un XrHandMeshTrackerANDROID précédemment créé par xrCreateHandMeshTrackerANDROID.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_hand_mesh
doit être activée avant d'appeler xrDestroyHandMeshTrackerANDROID. handMeshTracker
doit être un gestionnaire XrHandMeshTrackerANDROID valide.
Sécurité des threads
- L'accès à
handMeshTracker
et à tous les gestionnaires enfants doit être synchronisé en externe.
Codes de retour
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTED
XR_ERROR_HANDLE_INVALID
Localiser les maillages de la main
L'application peut utiliser la fonction xrGetHandMeshANDROID pour récupérer le maillage de la main à un code temporel donné. La position et la normale des sommets du maillage de la main sont représentées dans l'espace spécifié par XrHandMeshGetInfoANDROID::baseSpace lors de l'appel de xrGetHandMeshANDROID.
XrResult xrGetHandMeshANDROID(
XrHandMeshTrackerANDROID handMeshTracker,
const XrHandMeshGetInfoANDROID* getInfo,
XrHandTrackingMeshesANDROID* handMeshes);
Descriptions des paramètres
handMeshTracker
est un gestionnaire XrHandMeshTrackerANDROID précédemment créé avec xrCreateHandMeshTrackerANDROID.getInfo
est une structure XrHandMeshGetInfoANDROID qui contient des informations permettant d'interroger les données de maillage de la main.handMeshes
est un pointeur vers une structure XrHandTrackingMeshesANDROID qui sera renseignée avec les données de maillage de la main.
L'application peut utiliser la fonction xrGetHandMeshANDROID pour accéder aux tampons de maillage de la main générés par l'environnement d'exécution.
L'application doit appeler xrBeginFrame au moins une fois pendant la session avant le premier appel de xrGetHandMeshANDROID.
Une application doit utiliser XrHandMeshANDROID::indexCount et XrHandMeshANDROID::vertexCount pour accéder aux tampons de maillage de la main et les réutiliser dans leur boucle de rendu lors de l'appel de xrGetHandMeshANDROID à chaque frame.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_hand_mesh
doit être activée avant d'appeler xrGetHandMeshANDROID. handMeshTracker
doit être un gestionnaire XrHandMeshTrackerANDROID valide.getInfo
doit être un pointeur vers une structure XrHandMeshGetInfoANDROID valide.handMeshes
doit être un pointeur vers une structure XrHandTrackingMeshesANDROID.
Codes de retour
XR_SUCCESS
XR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTED
XR_ERROR_RUNTIME_FAILURE
XR_ERROR_INSTANCE_LOST
XR_ERROR_SESSION_LOST
XR_ERROR_HANDLE_INVALID
XR_ERROR_SIZE_INSUFFICIENT
XR_ERROR_TIME_INVALID
Un XrHandMeshGetInfoANDROID décrit les informations requises pour obtenir des données de maillage de la main.
typedef struct XrHandMeshGetInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
} XrHandMeshGetInfoANDROID;
Descriptions des membres
type
est le XrStructureType de cette structure.next
estNULL
ou un pointeur vers la structure suivante d'une chaîne de structures. Aucune de ces structures n'est définie dans OpenXR de base ni dans cette extension.baseSpace
est un XrSpace qui définit l'espace de référence dans lequel localiser la transformation des sommets àtime
.time
est leXrTime
qui décrit l'heure à laquelle l'application souhaite interroger le maillage de la main.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_hand_mesh
doit être activée avant d'utiliser XrHandMeshGetInfoANDROID. type
doit êtreXR_TYPE_HAND_MESH_GET_INFO_ANDROID
.next
doit êtreNULL
ou un pointeur valide vers la structure suivante dans une chaîne de structures.baseSpace
doit être un gestionnaire XrSpace valide.
La structure XrHandTrackingMeshesANDROID contient des données de maillage pour les deux mains.
typedef struct XrHandTrackingMeshesANDROID {
XrStructureType type;
void* next;
XrHandMeshANDROID leftHandMesh;
XrHandMeshANDROID rightHandMesh;
} XrHandTrackingMeshesANDROID;
Descriptions des membres
type
est le XrStructureType de cette structure.next
estNULL
ou un pointeur vers la structure suivante d'une chaîne de structures. Aucune de ces structures n'est définie dans OpenXR de base ni dans cette extension.leftHandMesh
correspond à XrHandMeshANDROID pour la main gauche.rightHandMesh
correspond à XrHandMeshANDROID pour la main droite.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_hand_mesh
doit être activée avant d'utiliser XrHandTrackingMeshesANDROID. type
doit êtreXR_TYPE_HAND_TRACKING_MESHES_ANDROID
.next
doit êtreNULL
ou un pointeur valide vers la structure suivante dans une chaîne de structures.leftHandMesh
doit être une structure XrHandMeshANDROID validerightHandMesh
doit être une structure XrHandMeshANDROID valide
Une structure XrHandMeshANDROID contient des données et des tampons pour recevoir les données de suivi du maillage de la main à partir de la fonction xrGetHandMeshANDROID pour une main.
typedef struct XrHandMeshANDROID {
XrBool32 isActive;
XrTime dynamicLastUpdateTime;
uint32_t indexCount;
uint32_t vertexCount;
const uint32_t* indices;
const XrVector2f* textureUVs;
const XrVector3f* positions;
const XrVector3f* normals;
XrPosef baseSpaceFromVertexSpace;
} XrHandMeshANDROID;
Descriptions des membres
type
est le XrStructureType de cette structure.next
estNULL
ou un pointeur vers la structure suivante d'une chaîne de structures. Aucune de ces structures n'est définie dans OpenXR de base ni dans cette extension.isActive
est unXrBool32
qui indique si le traceur de maillage de la main actuel est actif et si les données de maillage sont valides.dynamicLastUpdateTime
est leXrTime
spécifiant l'heure à laquelle les tampons dynamiques ont été mis à jour pour la dernière fois.indexCount
est unuint32_t
servant de nombre deindices
de la maille de la main.vertexCount
est unuint32_t
servant de nombre depositions
du maillage de la main. Il peut également être utilisé pourtextureUVs
ounormals
lorsqu'ils sont compatibles avec le système.indices
est un tableau deuint32_t
représentant les indices de maillage des triangles dans l'ordre de déroulement antihoraire. Le nombre de valeurs pointées estindexCount
.textureUVs
estNULL
ou un tableau deXrVector2f
représentant les coordonnées de texture des sommets. Le nombre de valeurs pointées estvertexCount
.positions
est un tableau deXrVector3f
représentant les positions des sommets dansbaseSpaceFromVertexSpace
. Le nombre de valeurs pointées estvertexCount
.normals
est unNULL
ou un tableau deXrVector3f
représentant les normales des sommets dansbaseSpaceFromVertexSpace
. Le nombre de valeurs pointées estvertexCount
.baseSpaceFromVertexSpace
est le sommet XrSpace situé dans XrHandMeshGetInfoANDROID::baseSpace lors de l'appel de xrGetHandMeshANDROID. Les applications peuvent l'utiliser pour transformer l'espace de coordonnées des sommets et des normales du maillage lors du rendu.
Le maillage de la main est représenté dans des listes de triangles, et les sommets de chaque triangle sont dans l'ordre antihoraire lorsqu'on regarde la main de l'extérieur.
Lorsque la valeur isActive
renvoyée est XR_FALSE
, cela signifie que la main n'est pas activement suivie. Par exemple, la main se trouve en dehors de la portée du capteur, le focus de saisie est retiré de l'application ou l'application n'a pas les autorisations nécessaires pour accéder aux données de suivi de la main.
Lorsque la valeur isActive
renvoyée est XR_TRUE
, le maillage de suivi des mains représenté dans indices
et positions
, y compris textureUVs
et normals
s'ils sont compatibles avec le système, est mis à jour avec les dernières données de XrHandMeshGetInfoANDROID::time fournies à la fonction xrGetHandMeshANDROID.
La mémoire pointée par les tampons de maillage de la main renvoyés dans XrHandMeshANDROID appartient à l'environnement d'exécution et est partagée avec l'application. Vous pouvez accéder à la mémoire en toute sécurité depuis n'importe quel thread jusqu'au prochain appel de xrBeginFrame tant que le gestionnaire XrHandMeshTrackerANDROID est valide.
- Les valeurs pointées par
indices
ettextureUVs
ne sont pas dynamiques. - Le pointeur et les valeurs pointées par
positions
etnormals
sont dynamiques et peuvent changer entre les appels de xrBeginFrame. L'application peut utiliserdynamicLastUpdateTime
pour vérifier si les valeurs ont changé depuis le dernier frame et éviter le traitement de données inutile en l'absence de modifications.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_hand_mesh
doit être activée avant d'utiliser XrHandMeshANDROID. indices
doit être un pointeur vers une valeuruint32_t
valide.textureUVs
doit être un pointeur vers une structure XrVector2f valide.positions
doit être un pointeur vers une structure XrVector3f valide.normals
doit être un pointeur vers une structure XrVector3f valide.
Exemple de code pour le suivi de la trame de la main
L'exemple de code suivant montre comment accéder aux tampons de maillage de la main pour le rendu.
XrInstance instance; // Created at app startup
XrSystemId systemId; // Received from xrGetSystem() at app startup
XrSession session; // Created at app startup.
XrSpace appPlaySpace; // Created at app startup.
// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateHandMeshTrackerANDROID xrCreateHandMeshTrackerANDROID; // previously initialized
PFN_xrDestroyHandMeshTrackerANDROID xrDestroyHandMeshTrackerANDROID; // previously initialized
PFN_xrGetHandMeshANDROID xrGetHandMeshANDROID; // previously initialized
// Inspect system capability
XrSystemHandMeshTrackingPropertiesANDROID handMeshTrackingProps = {
.type = XR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROID,
};
XrSystemProperties sysProps = {
.type = XR_TYPE_SYSTEM_PROPERTIES,
.next = &handMeshTrackingProps
};
CHK_XR(xrGetSystemProperties(instance, systemId, &sysProps));
if (!handMeshTrackingProps.supportsHandMeshTracking) {
// hand mesh tracking is not supported.
return;
}
XrHandMeshTrackerCreateInfoANDROID trackerCreateInfo = {
.type = XR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROID
};
XrHandMeshTrackerANDROID handMeshTracker = XR_NULL_HANDLE;
CHK_XR(xrCreateHandMeshTrackerANDROID(
session, &trackerCreateInfo, &handMeshTracker));
// app update loop
while (true) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
// ...
XrHandMeshGetInfoANDROID getInfo = {
.type = XR_TYPE_HAND_MESH_GET_INFO_ANDROID,
.baseSpace = appPlaySpace,
.time = time,
};
XrHandTrackingMeshesANDROID handMeshes = {
.type = XR_TYPE_HAND_TRACKING_MESHES_ANDROID
};
CHK_XR(xrGetHandMeshANDROID(handMeshTracker, &getInfo, &handMeshes));
if (handMeshes.leftHandMesh.isActive) {
// access vertex/index buffers for rendering.
}
// ...
// Finish frame loop
// ...
}
CHECK_XR(xrDestroyHandMeshTracker(handMeshTracker));
Nouveaux types d'objets
Nouvelles constantes d'énumération
L'énumération XrObjectType est étendue avec:
XR_OBJECT_TYPE_HAND_MESH_TRACKER_ANDROID
L'énumération XrStructureType est étendue avec:
XR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROID
XR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROID
XR_TYPE_HAND_MESH_GET_INFO_ANDROID
XR_TYPE_HAND_TRACKING_MESHES_ANDROID
Nouvelles énumérations
Nouvelles structures
- XrSystemHandMeshTrackingPropertiesANDROID
- XrHandMeshTrackerCreateInfoANDROID
- XrHandMeshGetInfoANDROID
- XrHandMeshANDROID
- XrHandTrackingMeshesANDROID
Nouvelles fonctions
Problèmes
Historique des versions
- Révision 1, 10/09/2024 (Levana Chen)
- Description initiale de l'extension