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è un- XrBool32che indica se il- XrSystemIdselezionato supporta il monitoraggio della mesh della mano.
- supportsTextureUVè un- XrBool32che indica se il- XrSystemIdselezionato supporta le texture UV per i vertici del mesh.
- supportsVertexNormalè un- XrBool32che indica se il- XrSystemIdselezionato 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 essere- XR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROID
- nextdeve essere- NULLo 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 valido
- createInfodeve essere un puntatore a una struttura XrHandMeshTrackerCreateInfoANDROID valida
- handMeshTrackerdeve essere un puntatore a un handle XrHandMeshTrackerANDROID.
Codici di ritorno
- 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 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 essere- XR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROID
- nextdeve essere- NULLo 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_UNSUPPORTED
- XR_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 valido
- getInfodeve essere un puntatore a una struttura XrHandMeshGetInfoANDROID valida
- handMeshesdeve essere un puntatore a una struttura XrHandTrackingMeshesANDROID
Codici di ritorno
- 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 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 in- time.
- timeè il- XrTimeche 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 essere- XR_TYPE_HAND_MESH_GET_INFO_ANDROID
- nextdeve essere- NULLo un puntatore valido alla struttura successiva in una catena di strutture
- baseSpacedeve 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 essere- XR_TYPE_HAND_TRACKING_MESHES_ANDROID
- nextdeve essere- NULLo un puntatore valido alla struttura successiva in una catena di strutture
- leftHandMeshdeve essere una struttura XrHandMeshANDROID valida
- rightHandMeshdeve 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è un- XrBool32che indica se il tracker della maglia della mano attivo è attivo e se i dati della maglia sono validi.
- dynamicLastUpdateTimeè il- XrTimeche specifica l'ora dell'ultimo aggiornamento dei buffer dinamici.
- indexCountè un- uint32_tche funge da numero di- indicesdella maglia della mano.
- vertexCountè un- uint32_tche funge da numero di- positionsdella maglia della mano. Può essere utilizzato anche per- textureUVso- normalsse supportati dal sistema.
- indicesè un array di- uint32_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 di- XrVector2fche rappresenta le coordinate della texture del vertice. Il numero di valori a cui si fa riferimento è- vertexCount.
- positionsè un array di- XrVector3fche rappresenta le posizioni dei vertici in- baseSpaceFromVertexSpace. Il numero di valori a cui si fa riferimento è- vertexCount.
- normalsè un- NULLo un array di- XrVector3fche rappresenta le normali dei vertici in- baseSpaceFromVertexSpace. 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 valore- uint32_tvalido
- textureUVsdeve essere un puntatore a una struttura XrVector2f valida
- positionsdeve essere un puntatore a una struttura XrVector3f valida
- normalsdeve 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_ANDROID
- XR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROID
- XR_TYPE_HAND_MESH_GET_INFO_ANDROID
- XR_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.
