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 de les accepter de manière 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
typeest le XrStructureType de cette structure.nextestNULLou 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.supportsHandMeshTrackingest unXrBool32, qui indique si leXrSystemIdsélectionné est compatible avec le suivi de la trame de la main.supportsTextureUVest unXrBool32, qui indique si leXrSystemIdsélectionné prend en charge les UV de texture pour les sommets du maillage.supportsVertexNormalest unXrBool32, qui indique si leXrSystemIdsé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_meshdoit être activée avant d'utiliser XrSystemHandMeshTrackingPropertiesANDROID. typedoit êtreXR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROID.nextdoit êtreNULLou un pointeur valide vers la structure suivante d'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
sessionest une XrSession dans laquelle le traceur de maillage de la main sera actif.createInfoest le XrHandMeshTrackerCreateInfoANDROID utilisé pour spécifier le traceur de maillage de la main.handMeshTrackerest 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_meshdoit être activée avant d'appeler xrCreateHandMeshTrackerANDROID. sessiondoit être un identifiant XrSession valide.createInfodoit être un pointeur vers une structure XrHandMeshTrackerCreateInfoANDROID valide.handMeshTrackerdoit être un pointeur vers un gestionnaire XrHandMeshTrackerANDROID.
Codes de retour
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_HANDLE_INVALIDXR_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
typeest le XrStructureType de cette structure.nextestNULLou 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_meshdoit être activée avant d'utiliser XrHandMeshTrackerCreateInfoANDROID. typedoit êtreXR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROID.nextdoit êtreNULLou un pointeur valide vers la structure suivante d'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
handMeshTrackerest un XrHandMeshTrackerANDROID précédemment créé par xrCreateHandMeshTrackerANDROID.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_hand_meshdoit être activée avant d'appeler xrDestroyHandMeshTrackerANDROID. handMeshTrackerdoit être un gestionnaire XrHandMeshTrackerANDROID valide.
Sécurité des threads
- L'accès à
handMeshTrackeret à tous les gestionnaires enfants doit être synchronisé en externe.
Codes de retour
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_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
handMeshTrackerest un gestionnaire XrHandMeshTrackerANDROID précédemment créé avec xrCreateHandMeshTrackerANDROID.getInfoest une structure XrHandMeshGetInfoANDROID qui contient des informations permettant d'interroger les données de maillage de la main.handMeshesest 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_meshdoit être activée avant d'appeler xrGetHandMeshANDROID. handMeshTrackerdoit être un gestionnaire XrHandMeshTrackerANDROID valide.getInfodoit être un pointeur vers une structure XrHandMeshGetInfoANDROID valide.handMeshesdoit être un pointeur vers une structure XrHandTrackingMeshesANDROID.
Codes de retour
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_HANDLE_INVALIDXR_ERROR_SIZE_INSUFFICIENTXR_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
typeest le XrStructureType de cette structure.nextestNULLou 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.baseSpaceest un XrSpace qui définit l'espace de référence dans lequel localiser la transformation des sommets àtime.timeest leXrTimequi décrit l'heure à laquelle l'application souhaite interroger le maillage de la main.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_hand_meshdoit être activée avant d'utiliser XrHandMeshGetInfoANDROID. typedoit êtreXR_TYPE_HAND_MESH_GET_INFO_ANDROID.nextdoit êtreNULLou un pointeur valide vers la structure suivante d'une chaîne de structures.baseSpacedoit ê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
typeest le XrStructureType de cette structure.nextestNULLou 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.leftHandMeshcorrespond à XrHandMeshANDROID pour la main gauche.rightHandMeshcorrespond à XrHandMeshANDROID pour la main droite.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_hand_meshdoit être activée avant d'utiliser XrHandTrackingMeshesANDROID. typedoit êtreXR_TYPE_HAND_TRACKING_MESHES_ANDROID.nextdoit êtreNULLou un pointeur valide vers la structure suivante d'une chaîne de structures.leftHandMeshdoit être une structure XrHandMeshANDROID validerightHandMeshdoit ê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
typeest le XrStructureType de cette structure.nextestNULLou 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.isActiveest unXrBool32qui indique si le traceur de maillage manuel actuel est actif et si les données de maillage sont valides.dynamicLastUpdateTimeest leXrTimespécifiant l'heure à laquelle les tampons dynamiques ont été mis à jour pour la dernière fois.indexCountest unuint32_tservant de nombre deindicesde la maille de la main.vertexCountest unuint32_tservant de nombre depositionsdu maillage de la main. Il peut également être utilisé pourtextureUVsounormalslorsqu'ils sont compatibles avec le système.indicesest un tableau deuint32_treprésentant les indices de maillage pour les triangles dans l'ordre de rotation inverse. Le nombre de valeurs pointées estindexCount.textureUVsestNULLou un tableau deXrVector2freprésentant les coordonnées de texture des sommets. Le nombre de valeurs pointées estvertexCount.positionsest un tableau deXrVector3freprésentant les positions des sommets dansbaseSpaceFromVertexSpace. Le nombre de valeurs pointées estvertexCount.normalsest unNULLou un tableau deXrVector3freprésentant les normales des sommets dansbaseSpaceFromVertexSpace. Le nombre de valeurs pointées estvertexCount.baseSpaceFromVertexSpaceest 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
indicesettextureUVsne sont pas dynamiques. - Le pointeur et les valeurs pointées par
positionsetnormalssont dynamiques et peuvent changer entre les appels de xrBeginFrame. L'application peut utiliserdynamicLastUpdateTimepour 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_meshdoit être activée avant d'utiliser XrHandMeshANDROID. indicesdoit être un pointeur vers une valeuruint32_tvalide.textureUVsdoit être un pointeur vers une structure XrVector2f valide.positionsdoit être un pointeur vers une structure XrVector3f valide.normalsdoit ê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_ANDROIDXR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROIDXR_TYPE_HAND_MESH_GET_INFO_ANDROIDXR_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
OpenXR™ et le logo OpenXR sont des marques appartenant à The Khronos Group Inc. et sont enregistrés en tant que marques en Chine, dans l'Union européenne, au Japon et au Royaume-Uni.