Cadena de nombre
XR_ANDROID_hand_mesh
Tipo de extensión
Extensión de la instancia
Número de extensión registrado
704
Revisión
1
Dependencias de extensiones y versiones
Fecha de la última modificación
2024-09-10
Estado de la IP
No hay reclamos de IP conocidos.
Colaboradores
Nihav Jain, Google
Cairn Overturf, Google
Spencer Quin, Google
Levana Chen, Google
Descripción general
Esta extensión habilita el seguimiento de manos representado como una malla de mano dinámica.
El objetivo de esta extensión es proporcionar búferes de vértices y de índices para la malla de una representación personalizada de las manos del usuario. Se puede usar para la oclusión y la visualización.
Esta extensión no debe usarse para otros fines de seguimiento de la mano.
- Para la interacción, se puede usar
XR_EXT_hand_interaction. - Para las articulaciones esqueléticas, se puede usar
XR_EXT_hand_tracking.
Los datos del seguimiento de la mano pueden ser información personal sensible y están estrechamente vinculados con la privacidad y la integridad personal. Se recomienda que las aplicaciones que almacenan o transfieren datos de seguimiento de manos siempre soliciten al usuario una aceptación activa y específica para hacerlo.
Cómo inspeccionar la capacidad del sistema
Una aplicación puede inspeccionar si el sistema es capaz de realizar mallas de seguimiento de manos encadenando una estructura XrSystemHandMeshTrackingPropertiesANDROID a XrSystemProperties cuando se llama a xrGetSystemProperties.
typedef struct XrSystemHandMeshTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsHandMeshTracking;
XrBool32 supportsTextureUV;
XrBool32 supportsVertexNormal;
} XrSystemHandMeshTrackingPropertiesANDROID;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras. No se definen tales estructuras en OpenXR principal ni en esta extensión.supportsHandMeshTrackinges unXrBool32, que indica si elXrSystemIdseleccionado admite el seguimiento de malla de mano.supportsTextureUVes unXrBool32, que indica si elXrSystemIdseleccionado admite UV de textura para los vértices de la malla.supportsVertexNormales unXrBool32, que indica si elXrSystemIdseleccionado admite normales de vértices para los vértices de la malla.
La aplicación debe evitar usar las capacidades de malla de mano cuando supportsHandMeshTracking sea XR_FALSE, ya que esto significa que el sistema no admite el seguimiento de malla de mano. En este caso, xrCreateHandMeshTrackerANDROID mostrará XR_ERROR_FEATURE_UNSUPPORTED.
Si supportsHandMeshTracking muestra XR_TRUE, el sistema admite el seguimiento de malla de manos. Una aplicación debe usar XrHandMeshANDROID::indexCount y XrHandMeshANDROID::vertexCount para acceder a los búferes de malla de mano y reutilizarlos en su bucle de renderización cuando llame a xrGetHandMeshANDROID en cada fotograma.
Si supportsTextureUV muestra XR_FALSE, el sistema no admite UV de textura para los vértices de la malla y, por lo tanto, una aplicación recibiría XrHandMeshANDROID::textureUVs NULL cuando llame a xrGetHandMeshANDROID.
Si supportsVertexNormal muestra XR_FALSE, el sistema no admite normales de vértices para los vértices de la malla y, por lo tanto, una aplicación recibiría XrHandMeshANDROID::normals NULL cuando llame a xrGetHandMeshANDROID.
Uso válido (implícito)
- La extensión
XR_ANDROID_hand_meshdebe estar habilitada antes de usar XrSystemHandMeshTrackingPropertiesANDROID. typedebe serXR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROID.nextdebe serNULLo un puntero válido a la próxima estructura en una cadena de estructuras.
Crea un identificador de malla manual
XR_DEFINE_HANDLE(XrHandMeshTrackerANDROID)
El controlador XrHandMeshTrackerANDROID representa un rastreador de malla de mano para el seguimiento de malla de mano y la administración de los recursos relacionados.
Este identificador se puede usar para acceder a los búferes de malla de mano con otras funciones de esta extensión.
Una aplicación puede crear un controlador XrHandMeshTrackerANDROID con la función xrCreateHandMeshTrackerANDROID.
XrResult xrCreateHandMeshTrackerANDROID(
XrSession session,
const XrHandMeshTrackerCreateInfoANDROID* createInfo,
XrHandMeshTrackerANDROID* handMeshTracker);
Descripciones de los parámetros
sessiones un XrSession en el que el rastreador de malla de mano estará activo.createInfoes el XrHandMeshTrackerCreateInfoANDROID que se usa para especificar el rastreador de malla de mano.handMeshTrackeres el controlador XrHandMeshTrackerANDROID que se muestra.
Si el sistema no admite el seguimiento de malla de mano, xrCreateHandMeshTrackerANDROID mostrará XR_ERROR_FEATURE_UNSUPPORTED.
El control XrHandMeshTrackerANDROID es propietario de todos los recursos para el seguimiento de malla de la mano. Después de terminar con las experiencias de seguimiento de malla de mano, la aplicación debe destruir el control con la función xrDestroyHandMeshTrackerANDROID.
Uso válido (implícito)
- La extensión
XR_ANDROID_hand_meshdebe estar habilitada antes de llamar a xrCreateHandMeshTrackerANDROID. sessiondebe ser un identificador XrSession válido.createInfodebe ser un puntero a una estructura XrHandMeshTrackerCreateInfoANDROID válida.handMeshTrackerdebe ser un puntero a un controlador XrHandMeshTrackerANDROID.
Códigos de retorno
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 estructura XrHandMeshTrackerCreateInfoANDROID describe la información para crear un controlador XrHandMeshTrackerANDROID.
typedef struct XrHandMeshTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrHandMeshTrackerCreateInfoANDROID;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras. No se definen tales estructuras en OpenXR principal ni en esta extensión.
Uso válido (implícito)
- La extensión
XR_ANDROID_hand_meshdebe estar habilitada antes de usar XrHandMeshTrackerCreateInfoANDROID. typedebe serXR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROID.nextdebe serNULLo un puntero válido a la próxima estructura en una cadena de estructuras.
La función xrDestroyHandMeshTrackerANDROID libera el handMeshTracker
y los recursos subyacentes cuando finaliza con las experiencias de seguimiento de malla de mano.
XrResult xrDestroyHandMeshTrackerANDROID(
XrHandMeshTrackerANDROID handMeshTracker);
Descripciones de los parámetros
handMeshTrackeres un XrHandMeshTrackerANDROID que xrCreateHandMeshTrackerANDROID creó anteriormente.
Uso válido (implícito)
- La extensión
XR_ANDROID_hand_meshdebe estar habilitada antes de llamar a xrDestroyHandMeshTrackerANDROID. handMeshTrackerdebe ser un controlador XrHandMeshTrackerANDROID válido.
Seguridad de subprocesos
- El acceso a
handMeshTrackery a cualquier controlador secundario debe sincronizarse de forma externa.
Códigos de retorno
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
Cómo ubicar mallas de mano
La aplicación puede usar la función xrGetHandMeshANDROID para recuperar la malla de la mano en una marca de tiempo determinada. La posición y la normalidad de los vértices de la malla de la mano se representan en el espacio especificado por XrHandMeshGetInfoANDROID::baseSpace cuando se llama a xrGetHandMeshANDROID.
XrResult xrGetHandMeshANDROID(
XrHandMeshTrackerANDROID handMeshTracker,
const XrHandMeshGetInfoANDROID* getInfo,
XrHandTrackingMeshesANDROID* handMeshes);
Descripciones de los parámetros
handMeshTrackeres un controlador XrHandMeshTrackerANDROID que se creó previamente con xrCreateHandMeshTrackerANDROID.getInfoes una estructura XrHandMeshGetInfoANDROID que contiene información para consultar los datos de la malla de la mano.handMesheses un puntero a una estructura XrHandTrackingMeshesANDROID que se propagará con los datos de la malla de la mano.
La aplicación puede usar la función xrGetHandMeshANDROID para acceder a los búferes de malla de mano que genera el entorno de ejecución.
La aplicación debe llamar a xrBeginFrame al menos una vez durante la sesión antes de la primera llamada a xrGetHandMeshANDROID.
Una aplicación debe usar XrHandMeshANDROID::indexCount y XrHandMeshANDROID::vertexCount para acceder a los búferes de malla de mano y reutilizarlos en su bucle de renderización cuando llame a xrGetHandMeshANDROID en cada fotograma.
Uso válido (implícito)
- La extensión
XR_ANDROID_hand_meshdebe estar habilitada antes de llamar a xrGetHandMeshANDROID. handMeshTrackerdebe ser un controlador XrHandMeshTrackerANDROID válido.getInfodebe ser un puntero a una estructura XrHandMeshGetInfoANDROID válida.handMeshesdebe ser un puntero a una estructura XrHandTrackingMeshesANDROID.
Códigos de retorno
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 describe la información necesaria para obtener datos de malla de mano.
typedef struct XrHandMeshGetInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
} XrHandMeshGetInfoANDROID;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras. No se definen tales estructuras en OpenXR principal ni en esta extensión.baseSpacees un XrSpace que define el espacio de referencia en el que se debe ubicar la transformación de los vértices entime.timees elXrTimeque describe el momento en el que la aplicación desea consultar la malla de la mano.
Uso válido (implícito)
- La extensión
XR_ANDROID_hand_meshdebe estar habilitada antes de usar XrHandMeshGetInfoANDROID. typedebe serXR_TYPE_HAND_MESH_GET_INFO_ANDROID.nextdebe serNULLo un puntero válido a la próxima estructura en una cadena de estructuras.baseSpacedebe ser un identificador de XrSpace válido.
La estructura XrHandTrackingMeshesANDROID contiene datos de malla para ambas manos.
typedef struct XrHandTrackingMeshesANDROID {
XrStructureType type;
void* next;
XrHandMeshANDROID leftHandMesh;
XrHandMeshANDROID rightHandMesh;
} XrHandTrackingMeshesANDROID;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras. No se definen tales estructuras en OpenXR principal ni en esta extensión.leftHandMeshes XrHandMeshANDROID para la mano izquierda.rightHandMeshes XrHandMeshANDROID para la mano derecha.
Uso válido (implícito)
- La extensión
XR_ANDROID_hand_meshdebe estar habilitada antes de usar XrHandTrackingMeshesANDROID. typedebe serXR_TYPE_HAND_TRACKING_MESHES_ANDROID.nextdebe serNULLo un puntero válido a la próxima estructura en una cadena de estructuras.leftHandMeshdebe ser una estructura XrHandMeshANDROID válida.rightHandMeshdebe ser una estructura XrHandMeshANDROID válida.
Una estructura XrHandMeshANDROID contiene datos y búferes para recibir datos de seguimiento de malla de mano de la función xrGetHandMeshANDROID para una mano.
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;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras. No se definen tales estructuras en OpenXR principal ni en esta extensión.isActivees unXrBool32que indica si el rastreador de malla de mano actual está activo y si los datos de malla son válidos.dynamicLastUpdateTimees elXrTimeque especifica la hora en la que se actualizaron por última vez los búferes dinámicos.indexCountes unuint32_tque funciona como la cantidad deindicesde la malla de la mano.vertexCountes unuint32_tque funciona como la cantidad depositionsde la malla de la mano. También se puede usar paratextureUVsonormalscuando el sistema los admite.indiceses un array deuint32_tque representa los índices de malla para los triángulos en el orden de la bobina en sentido contrario a las manecillas del reloj. La cantidad de valores a los que se hace referencia esindexCount.textureUVsesNULLo un array deXrVector2fque representa las coordenadas de textura del vértice. La cantidad de valores a los que se apunta esvertexCount.positionses un array deXrVector3fque representa las posiciones de los vértices enbaseSpaceFromVertexSpace. La cantidad de valores a los que se apunta esvertexCount.normalses unNULLo un array deXrVector3fque representa las normales de los vértices enbaseSpaceFromVertexSpace. La cantidad de valores a los que se apunta esvertexCount.baseSpaceFromVertexSpacees el vértice XrSpace ubicado en XrHandMeshGetInfoANDROID::baseSpace cuando se llama a xrGetHandMeshANDROID. Las aplicaciones pueden usar esto para transformar el espacio de coordenadas de los vértices y las normales de la malla durante la renderización.
La malla de la mano se representa en listas de triángulos y los vértices de cada triángulo están en orden antihorario cuando se mira desde fuera de la mano.
Cuando el valor de isActive que se muestra es XR_FALSE, significa que no se realiza un seguimiento activo de la mano. Por ejemplo, la mano está fuera del rango del sensor, se quita el enfoque de entrada de la aplicación o la aplicación no tiene los permisos para acceder a los datos de seguimiento de la mano.
Cuando el valor de isActive que se muestra es XR_TRUE, la malla de seguimiento de manos representada en indices y positions, incluidas textureUVs y normals, si el sistema las admite, se actualizan a los datos más recientes de XrHandMeshGetInfoANDROID::time que se le proporcionan a la función xrGetHandMeshANDROID.
El entorno de ejecución es propietario de la memoria a la que apuntan los búferes de malla de mano que se muestran en XrHandMeshANDROID y la comparte con la aplicación. Se puede acceder de forma segura a la memoria desde cualquier subproceso hasta la próxima llamada a xrBeginFrame mientras el control XrHandMeshTrackerANDROID sea válido.
- Los valores a los que apuntan
indicesytextureUVsno son dinámicos. - El puntero y los valores a los que apuntan
positionsynormalsson dinámicos, por lo que pueden cambiar entre llamadas a xrBeginFrame. La aplicación puede usardynamicLastUpdateTimepara verificar si los valores cambiaron desde el último fotograma y evitar el procesamiento de datos innecesario cuando no hay cambios.
Uso válido (implícito)
- La extensión
XR_ANDROID_hand_meshdebe estar habilitada antes de usar XrHandMeshANDROID. indicesdebe ser un puntero a un valoruint32_tválido.textureUVsdebe ser un puntero a una estructura XrVector2f válida.positionsdebe ser un puntero a una estructura XrVector3f válida.normalsdebe ser un puntero a una estructura XrVector3f válida.
Ejemplo de código para el seguimiento de malla de mano
En el siguiente código de ejemplo, se muestra cómo acceder a los búferes de malla de la mano para la renderización.
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));
Nuevos tipos de objetos
Nuevas constantes de enum
La enumeración XrObjectType se extiende con lo siguiente:
XR_OBJECT_TYPE_HAND_MESH_TRACKER_ANDROID
La enumeración XrStructureType se extiende con lo siguiente:
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
Enumeraciones nuevas
Nuevas estructuras
- XrSystemHandMeshTrackingPropertiesANDROID
- XrHandMeshTrackerCreateInfoANDROID
- XrHandMeshGetInfoANDROID
- XrHandMeshANDROID
- XrHandTrackingMeshesANDROID
Funciones nuevas
Problemas
Historial de versiones
- Revisión 1, 10/9/2024 (Levana Chen)
- Descripción inicial de la extensión
OpenXR™ y el logotipo de OpenXR son marcas comerciales de The Khronos Group Inc. y están registradas como marca comercial en China, la Unión Europea, Japón y el Reino Unido.