Stringa del nome
XR_ANDROID_hand_mesh
Tipo di estensione
Estensione dell'istanza
Numero di estensione registrato
704
Revisione
1
Dipendenze di estensioni e versioni
Data ultima modifica
2024-09-10
Stato IP
Nessuna rivendicazione IP nota.
Collaboratori
Nihav Jain, Google
Cairn Overturf, Google
Spencer Quin, Google
Levana Chen, Google
Panoramica
Questa estensione consente il rilevamento delle mani rappresentato come un mesh dinamico della mano.
Questa estensione è progettata per fornire buffer di vertici e indici per la mesh di una representation personalizzata delle mani dell'utente. Può essere utilizzato per occlusione e visualizzazione.
Questa estensione non deve essere utilizzata per altri scopi di monitoraggio delle mani.
- Per l'interazione,
XR_EXT_hand_interactionpuò essere utilizzato. - Per le articolazioni scheletriche, si può utilizzare
XR_EXT_hand_tracking.
I dati del monitoraggio delle mani possono essere informazioni personali sensibili e sono strettamente collegati alla privacy e all'integrità personali. È vivamente consigliato che le applicazioni che archiviano o trasferiscono dati sul rilevamento dei movimenti della mano chiedano sempre all'utente un'accettazione attiva e specifica.
Controlla la funzionalità del sistema
Un'applicazione può verificare se il sistema è in grado di creare mesh di tracciamento delle mani collegando una struttura XrSystemHandMeshTrackingPropertiesANDROID a XrSystemProperties quando chiama xrGetSystemProperties.
typedef struct XrSystemHandMeshTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsHandMeshTracking;
XrBool32 supportsTextureUV;
XrBool32 supportsVertexNormal;
} XrSystemHandMeshTrackingPropertiesANDROID;
Descrizioni dei membri
typeè il XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture. Queste strutture non sono definite in OpenXR di base o in questa estensione.supportsHandMeshTrackingè unXrBool32che indica se ilXrSystemIdselezionato supporta il monitoraggio della mesh della mano.supportsTextureUVè unXrBool32che indica se ilXrSystemIdselezionato supporta le texture UV per i vertici del mesh.supportsVertexNormalè unXrBool32che indica se ilXrSystemIdselezionato supporta le normali dei vertici per i vertici del mesh.
L'applicazione deve evitare di utilizzare le funzionalità di mesh delle mani quando supportsHandMeshTracking è XR_FALSE, poiché ciò significa che il sistema non supporta il monitoraggio del mesh delle mani. In questo caso, xrCreateHandMeshTrackerANDROID
restituirà XR_ERROR_FEATURE_UNSUPPORTED.
Se supportsHandMeshTracking restituisce XR_TRUE, il sistema supporta il monitoraggio della mesh della mano. Un'applicazione deve utilizzare
XrHandMeshANDROID::indexCount e XrHandMeshANDROID::vertexCount per
accedere ai buffer del mesh della mano e riutilizzarli nel proprio loop di rendering quando chiama
xrGetHandMeshANDROID ogni frame.
Se supportsTextureUV restituisce XR_FALSE, il sistema non supporta le texture UV per i vertici del mesh e, di conseguenza, un'applicazione riceverebbe XrHandMeshANDROID::textureUVs NULL quando chiama xrGetHandMeshANDROID.
Se supportsVertexNormal restituisce XR_FALSE, il sistema non supporta le normali dei vertici per i vertici del mesh e, di conseguenza, un'applicazione riceverebbe XrHandMeshANDROID::normals NULL quando chiama xrGetHandMeshANDROID.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_hand_meshdeve essere attivata prima di utilizzare XrSystemHandMeshTrackingPropertiesANDROID typedeve essereXR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROIDnextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture
Creare un handle per il tracker mesh da polso
XR_DEFINE_HANDLE(XrHandMeshTrackerANDROID)
L'handle XrHandMeshTrackerANDROID rappresenta un tracker mesh per le mani per il monitoraggio del mesh delle mani e la gestione delle risorse correlate.
Questo handle può essere utilizzato per accedere ai buffer della mesh della mano utilizzando altre funzioni di questa estensione.
Un'applicazione può creare un handle XrHandMeshTrackerANDROID utilizzando la funzione xrCreateHandMeshTrackerANDROID.
XrResult xrCreateHandMeshTrackerANDROID(
XrSession session,
const XrHandMeshTrackerCreateInfoANDROID* createInfo,
XrHandMeshTrackerANDROID* handMeshTracker);
Descrizioni dei parametri
sessionè un'XrSession in cui il tracker della mesh della mano sarà attivo.createInfoè il XrHandMeshTrackerCreateInfoANDROID utilizzato per specificare il tracker della mesh della mano.handMeshTrackerè l'handle XrHandMeshTrackerANDROID restituito.
Se il sistema non supporta il monitoraggio della mesh della mano,
xrCreateHandMeshTrackerANDROID restituirà XR_ERROR_FEATURE_UNSUPPORTED.
L'handle XrHandMeshTrackerANDROID possiede tutte le risorse per il monitoraggio del mesh della mano. Al termine delle esperienze di monitoraggio del mesh della mano, l'applicazione deve distruggere l'handle utilizzando la funzione xrDestroyHandMeshTrackerANDROID.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_hand_meshdeve essere attivata prima di chiamare xrCreateHandMeshTrackerANDROID sessiondeve essere un handle XrSession validocreateInfodeve essere un puntatore a una struttura XrHandMeshTrackerCreateInfoANDROID validahandMeshTrackerdeve essere un puntatore a un handle XrHandMeshTrackerANDROID.
Codici di ritorno
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 struttura XrHandMeshTrackerCreateInfoANDROID descrive le informazioni per creare un handle XrHandMeshTrackerANDROID.
typedef struct XrHandMeshTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrHandMeshTrackerCreateInfoANDROID;
Descrizioni dei membri
typeè il XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture. Queste strutture non sono definite in OpenXR di base o in questa estensione.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_hand_meshdeve essere attivata prima di utilizzare XrHandMeshTrackerCreateInfoANDROID typedeve essereXR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROIDnextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture
La funzione xrDestroyHandMeshTrackerANDROID rilascia handMeshTracker
e le risorse sottostanti al termine delle esperienze di monitoraggio del mesh delle mani.
XrResult xrDestroyHandMeshTrackerANDROID(
XrHandMeshTrackerANDROID handMeshTracker);
Descrizioni dei parametri
handMeshTrackerè un XrHandMeshTrackerANDROID creato in precedenza con xrCreateHandMeshTrackerANDROID.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_hand_meshdeve essere attivata prima di chiamare xrDestroyHandMeshTrackerANDROID handMeshTrackerdeve essere un handle XrHandMeshTrackerANDROID valido
Coerenza di thread
- L'accesso a
handMeshTrackere a eventuali handle secondari deve essere sincronizzato esternamente
Codici di ritorno
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
Individuare i mesh delle mani
L'applicazione può utilizzare la funzione xrGetHandMeshANDROID per recuperare la mesh della mano in un determinato timestamp. La posizione e la normale dei vertici del mesh della mano sono rappresentate nello spazio specificato da XrHandMeshGetInfoANDROID::baseSpace quando viene chiamata xrGetHandMeshANDROID.
XrResult xrGetHandMeshANDROID(
XrHandMeshTrackerANDROID handMeshTracker,
const XrHandMeshGetInfoANDROID* getInfo,
XrHandTrackingMeshesANDROID* handMeshes);
Descrizioni dei parametri
handMeshTrackerè un handle XrHandMeshTrackerANDROID creato in precedenza con xrCreateHandMeshTrackerANDROID.getInfoè una struttura XrHandMeshGetInfoANDROID che contiene informazioni per eseguire query sui dati della mesh della mano.handMeshesè un puntatore a una struttura XrHandTrackingMeshesANDROID che verrà compilata con i dati della mesh della mano.
L'applicazione può utilizzare la funzione xrGetHandMeshANDROID per accedere ai buffer della mesh della mano generati dal runtime.
L'applicazione deve chiamare xrBeginFrame almeno una volta durante la sessione prima della prima chiamata a xrGetHandMeshANDROID.
Un'applicazione deve utilizzare XrHandMeshANDROID::indexCount e XrHandMeshANDROID::vertexCount per accedere ai buffer della mesh della mano e riutilizzarli nel proprio loop di rendering quando chiama xrGetHandMeshANDROID ogni frame.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_hand_meshdeve essere attivata prima di chiamare xrGetHandMeshANDROID handMeshTrackerdeve essere un handle XrHandMeshTrackerANDROID validogetInfodeve essere un puntatore a una struttura XrHandMeshGetInfoANDROID validahandMeshesdeve essere un puntatore a una struttura XrHandTrackingMeshesANDROID
Codici di ritorno
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 messaggio XrHandMeshGetInfoANDROID descrive le informazioni necessarie per ottenere i dati della mesh della mano.
typedef struct XrHandMeshGetInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
} XrHandMeshGetInfoANDROID;
Descrizioni dei membri
typeè il XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture. Queste strutture non sono definite in OpenXR di base o in questa estensione.baseSpaceè un XrSpace che definisce lo spazio di riferimento in cui collocare la trasformazione per i vertici intime.timeè ilXrTimeche descrive il momento in cui l'applicazione vuole eseguire una query sul mesh della mano.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_hand_meshdeve essere attivata prima di utilizzare XrHandMeshGetInfoANDROID typedeve essereXR_TYPE_HAND_MESH_GET_INFO_ANDROIDnextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutturebaseSpacedeve essere un handle XrSpace valido
La struttura XrHandTrackingMeshesANDROID contiene i dati del mesh per entrambe le mani.
typedef struct XrHandTrackingMeshesANDROID {
XrStructureType type;
void* next;
XrHandMeshANDROID leftHandMesh;
XrHandMeshANDROID rightHandMesh;
} XrHandTrackingMeshesANDROID;
Descrizioni dei membri
typeè il XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture. Queste strutture non sono definite in OpenXR di base o in questa estensione.leftHandMeshè XrHandMeshANDROID per la mano sinistra.rightHandMeshè il XrHandMeshANDROID per la mano destra.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_hand_meshdeve essere attivata prima di utilizzare XrHandTrackingMeshesANDROID typedeve essereXR_TYPE_HAND_TRACKING_MESHES_ANDROIDnextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di struttureleftHandMeshdeve essere una struttura XrHandMeshANDROID validarightHandMeshdeve essere una struttura XrHandMeshANDROID valida
Una struttura XrHandMeshANDROID contiene dati e buffer per ricevere i dati di monitoraggio della mesh della mano dalla funzione xrGetHandMeshANDROID per 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;
Descrizioni dei membri
typeè il XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture. Queste strutture non sono definite in OpenXR di base o in questa estensione.isActiveè unXrBool32che indica se il tracker della maglia della mano attivo è attivo e se i dati della maglia sono validi.dynamicLastUpdateTimeè ilXrTimeche specifica l'ora dell'ultimo aggiornamento dei buffer dinamici.indexCountè unuint32_tche funge da numero diindicesdella maglia della mano.vertexCountè unuint32_tche funge da numero dipositionsdella maglia della mano. Può essere utilizzato anche pertextureUVsonormalsse supportati dal sistema.indicesè un array diuint32_tche rappresenta gli indici della maglia per i vertici dei triangoli in ordine di avvolgimento antiorario. Il numero di valori indicati èindexCount.textureUVsèNULLo un array diXrVector2fche rappresenta le coordinate della texture del vertice. Il numero di valori a cui si fa riferimento èvertexCount.positionsè un array diXrVector3fche rappresenta le posizioni dei vertici inbaseSpaceFromVertexSpace. Il numero di valori a cui si fa riferimento èvertexCount.normalsè unNULLo un array diXrVector3fche rappresenta le normali dei vertici inbaseSpaceFromVertexSpace. Il numero di valori a cui si fa riferimento èvertexCount.baseSpaceFromVertexSpaceè il vertice XrSpace situato in XrHandMeshGetInfoANDROID::baseSpace quando viene chiamato xrGetHandMeshANDROID. Le applicazioni possono utilizzarlo per trasformare lo spazio delle coordinate dei vertici e delle normali della mesh durante il rendering.
La mesh della mano è rappresentata in elenchi di triangoli e i vertici di ogni triangolo sono in ordine antiorario se guardi la mano dall'esterno.
Quando il valore isActive restituito è XR_FALSE, indica che la mano
non è monitorata attivamente; ad esempio, la mano è al di fuori dell'intervallo del sensore, il
lo stato attivo dell'input viene rimosso dall'applicazione o l'applicazione non ha
le autorizzazioni per accedere ai dati del monitoraggio della mano.
Quando il valore isActive restituito è XR_TRUE, il mesh di monitoraggio delle mani rappresentato in indices e positions, inclusi textureUVs e normals se supportati dal sistema, viene aggiornato con i dati più recenti di XrHandMeshGetInfoANDROID::time specificato alla funzione xrGetHandMeshANDROID.
La memoria a cui fanno riferimento i buffer del mesh della mano restituiti in XrHandMeshANDROID è di proprietà del runtime e condivisa con l'applicazione. È possibile accedere in sicurezza alla memoria da qualsiasi thread fino alla successiva chiamata a xrBeginFrame, purché l'handle XrHandMeshTrackerANDROID sia valido.
- I valori a cui fanno riferimento
indicesetextureUVsnon sono dinamici - Il puntatore e i valori a cui fanno riferimento
positionsenormalssono dinamici e possono cambiare tra le chiamate a xrBeginFrame. L'applicazione può utilizzaredynamicLastUpdateTimeper verificare se i valori sono stati modificati dall'ultimo frame ed evitare l'elaborazione non necessaria dei dati quando non sono presenti modifiche.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_hand_meshdeve essere attivata prima di utilizzare XrHandMeshANDROID indicesdeve essere un puntatore a un valoreuint32_tvalidotextureUVsdeve essere un puntatore a una struttura XrVector2f validapositionsdeve essere un puntatore a una struttura XrVector3f validanormalsdeve essere un puntatore a una struttura XrVector3f valida
Codice di esempio per il monitoraggio della mesh della mano
Il seguente codice di esempio mostra come accedere ai buffer della mesh della mano per il rendering.
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));
Nuovi tipi di oggetti
Nuove costanti enum
L'enumerazione XrObjectType è estesa con:
XR_OBJECT_TYPE_HAND_MESH_TRACKER_ANDROID
L'enumerazione XrStructureType è stata estesa con:
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
Nuovi enum
Nuove strutture
- XrSystemHandMeshTrackingPropertiesANDROID
- XrHandMeshTrackerCreateInfoANDROID
- XrHandMeshGetInfoANDROID
- XrHandMeshANDROID
- XrHandTrackingMeshesANDROID
Nuove funzioni
Problemi
Cronologia delle versioni
- Revisione 1, 10-09-2024 (Levana Chen)
- Descrizione iniziale dell'estensione
OpenXR™ e il logo OpenXR sono marchi di proprietà di The Khronos Group Inc. e sono registrati come marchi in Cina, nell'Unione Europea, in Giappone e nel Regno Unito.