Namensstring
XR_ANDROID_hand_mesh
Erweiterungstyp
Instanzerweiterung
Registrierte Erweiterungsnummer
704
Revision
1
Erweiterungs- und Versionsabhängigkeiten
Datum der letzten Änderung
2024-09-10
IP-Status
Es sind keine Ansprüche aufgrund von Urheberrechten bekannt.
Mitwirkende
Nihav Jain, Google
Cairn Overturf, Google
Spencer Quin, Google
Levana Chen, Google
Übersicht
Diese Erweiterung ermöglicht das Hand-Tracking als dynamisches Hand-Mesh.
Diese Erweiterung soll Vertex- und Index-Buffer für das Mesh einer personalisierten Darstellung der Hände des Nutzers bereitstellen. Es kann für Okklusion und Visualisierung verwendet werden.
Diese Erweiterung darf nicht für andere Zwecke des Handtrackings verwendet werden.
- Für Interaktionen kann
XR_EXT_hand_interactionverwendet werden. - Für Skelettgelenke kann
XR_EXT_hand_trackingverwendet werden.
Daten aus der Handerkennung können sensible personenbezogene Daten sein und stehen in engem Zusammenhang mit dem Datenschutz und der Integrität von Personen. Bei Anwendungen, die Daten zur Handerkennung speichern oder übertragen, wird dringend empfohlen, den Nutzer immer um eine aktive und spezifische Einwilligung zu bitten.
Systemkapazität prüfen
Eine Anwendung kann prüfen, ob das System Meshes für das Hand-Tracking unterstützt, indem sie beim Aufruf von xrGetSystemProperties eine XrSystemHandMeshTrackingPropertiesANDROID-Struktur an die XrSystemProperties anhängt.
typedef struct XrSystemHandMeshTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsHandMeshTracking;
XrBool32 supportsTextureUV;
XrBool32 supportsVertexNormal;
} XrSystemHandMeshTrackingPropertiesANDROID;
Beschreibungen von Mitgliedern
typeist der XrStructureType dieser Struktur.nextistNULLoder ein Zeiger auf die nächste Struktur in einer Strukturkette. Solche Strukturen sind in OpenXR oder dieser Erweiterung nicht definiert.supportsHandMeshTrackingist einXrBool32, das angibt, ob die ausgewählteXrSystemIddas Mesh-Tracking von Händen unterstützt.supportsTextureUVist einXrBool32, das angibt, ob das ausgewählteXrSystemIdTextur-UVs für die Mesh-Ecken unterstützt.supportsVertexNormalist einXrBool32, das angibt, ob die ausgewählteXrSystemIdVertexnormalen für die Mesh-Ecken unterstützt.
Die Anwendung sollte keine Hand-Mesh-Funktionen verwenden, wenn supportsHandMeshTracking XR_FALSE ist, da das System dann kein Hand-Mesh-Tracking unterstützt. In diesem Fall gibt xrCreateHandMeshTrackerANDROID XR_ERROR_FEATURE_UNSUPPORTED zurück.
Wenn supportsHandMeshTracking XR_TRUE zurückgibt, unterstützt das System das Mesh-Tracking von Händen. Eine Anwendung sollte XrHandMeshANDROID::indexCount und XrHandMeshANDROID::vertexCount verwenden, um auf Hand-Mesh-Buffer zuzugreifen und sie in ihrem Rendering-Loop wiederzuverwenden, wenn xrGetHandMeshANDROID in jedem Frame aufgerufen wird.
Wenn supportsTextureUV XR_FALSE zurückgibt, unterstützt das System keine Textur-UVs für die Mesh-Ecken. Eine Anwendung würde daher beim Aufruf von xrGetHandMeshANDROID XrHandMeshANDROID::textureUVs NULL zurückerhalten.
Wenn supportsVertexNormal XR_FALSE zurückgibt, unterstützt das System keine Knotennormalen für die Mesh-Knoten. Eine Anwendung erhält daher beim Aufruf von xrGetHandMeshANDROID XrHandMeshANDROID::normals NULL.
Gültige Verwendung (implizit)
- Die
XR_ANDROID_hand_mesh-Erweiterung muss aktiviert sein, bevor XrSystemHandMeshTrackingPropertiesANDROID verwendet werden kann. typemussXR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROIDsein.nextmussNULLoder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein.
Alias für einen Mesh-Tracker für die Hand erstellen
XR_DEFINE_HANDLE(XrHandMeshTrackerANDROID)
Der Handle XrHandMeshTrackerANDROID stellt einen Hand-Mesh-Tracker für das Hand-Mesh-Tracking und die Verwaltung der zugehörigen Ressourcen dar.
Über diesen Handle kann mit anderen Funktionen in dieser Erweiterung auf Hand-Mesh-Buffer zugegriffen werden.
Eine Anwendung kann mit der Funktion xrCreateHandMeshTrackerANDROID einen XrHandMeshTrackerANDROID-Handle erstellen.
XrResult xrCreateHandMeshTrackerANDROID(
XrSession session,
const XrHandMeshTrackerCreateInfoANDROID* createInfo,
XrHandMeshTrackerANDROID* handMeshTracker);
Parameterbeschreibungen
sessionist eine XrSession, in der der Mesh-Tracker für die Hand aktiv ist.createInfoist die XrHandMeshTrackerCreateInfoANDROID, mit der der Hand-Mesh-Tracker angegeben wird.handMeshTrackerist der zurückgegebene XrHandMeshTrackerANDROID-Handle.
Wenn das System das Mesh-Tracking von Händen nicht unterstützt, gibt xrCreateHandMeshTrackerANDROID XR_ERROR_FEATURE_UNSUPPORTED zurück.
Der Handle XrHandMeshTrackerANDROID ist für alle Ressourcen für das Hand-Mesh-Tracking verantwortlich. Nach dem Ende des Hand-Mesh-Trackings muss die Anwendung den Handle mit der Funktion xrDestroyHandMeshTrackerANDROID löschen.
Gültige Verwendung (implizit)
- Die
XR_ANDROID_hand_mesh-Erweiterung muss aktiviert sein, bevor xrCreateHandMeshTrackerANDROID aufgerufen wird. sessionmuss ein gültiger XrSession-Alias sein.createInfomuss ein Verweis auf eine gültige XrHandMeshTrackerCreateInfoANDROID-Struktur sein.handMeshTrackermuss ein Verweis auf einen XrHandMeshTrackerANDROID-Handle sein.
Rückgabecodes
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
Die Struktur XrHandMeshTrackerCreateInfoANDROID beschreibt die Informationen zum Erstellen eines XrHandMeshTrackerANDROID-Handles.
typedef struct XrHandMeshTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrHandMeshTrackerCreateInfoANDROID;
Beschreibungen von Mitgliedern
typeist der XrStructureType dieser Struktur.nextistNULLoder ein Zeiger auf die nächste Struktur in einer Strukturkette. Solche Strukturen sind in OpenXR oder dieser Erweiterung nicht definiert.
Gültige Verwendung (implizit)
- Die
XR_ANDROID_hand_mesh-Erweiterung muss aktiviert sein, bevor XrHandMeshTrackerCreateInfoANDROID verwendet werden kann. typemussXR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROIDsein.nextmussNULLoder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein.
Die Funktion xrDestroyHandMeshTrackerANDROID gibt die handMeshTracker und die zugrunde liegenden Ressourcen frei, wenn das Tracking der Hand-Mesh-Modelle beendet ist.
XrResult xrDestroyHandMeshTrackerANDROID(
XrHandMeshTrackerANDROID handMeshTracker);
Parameterbeschreibungen
handMeshTrackerist ein XrHandMeshTrackerANDROID, der zuvor mit xrCreateHandMeshTrackerANDROID erstellt wurde.
Gültige Verwendung (implizit)
- Die
XR_ANDROID_hand_mesh-Erweiterung muss aktiviert sein, bevor xrDestroyHandMeshTrackerANDROID aufgerufen wird. handMeshTrackermuss ein gültiger XrHandMeshTrackerANDROID-Handle sein.
Threadsicherheit
- Der Zugriff auf
handMeshTrackerund alle untergeordneten Handles muss extern synchronisiert werden.
Rückgabecodes
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
Hand-Meshes finden
Die Anwendung kann die Funktion xrGetHandMeshANDROID verwenden, um das Hand-Mesh zu einem bestimmten Zeitstempel abzurufen. Die Position und Normale der Hand-Mesh-Ecken werden im Raum dargestellt, der durch XrHandMeshGetInfoANDROID::baseSpace beim Aufruf von xrGetHandMeshANDROID angegeben wird.
XrResult xrGetHandMeshANDROID(
XrHandMeshTrackerANDROID handMeshTracker,
const XrHandMeshGetInfoANDROID* getInfo,
XrHandTrackingMeshesANDROID* handMeshes);
Parameterbeschreibungen
handMeshTrackerist ein XrHandMeshTrackerANDROID-Handle, der zuvor mit xrCreateHandMeshTrackerANDROID erstellt wurde.getInfoist eine XrHandMeshGetInfoANDROID-Struktur, die Informationen zur Abfrage der Hand-Mesh-Daten enthält.handMeshesist ein Verweis auf eine XrHandTrackingMeshesANDROID-Struktur, die mit den Hand-Mesh-Daten gefüllt wird.
Die Anwendung kann die Funktion xrGetHandMeshANDROID verwenden, um auf die von der Laufzeit generierten Hand-Mesh-Buffer zuzugreifen.
Die Anwendung sollte xrBeginFrame mindestens einmal während der Sitzung vor dem ersten Aufruf von xrGetHandMeshANDROID aufrufen.
Eine Anwendung sollte XrHandMeshANDROID::indexCount und XrHandMeshANDROID::vertexCount verwenden, um auf Hand-Mesh-Buffer zuzugreifen und sie in ihrem Rendering-Loop wiederzuverwenden, wenn xrGetHandMeshANDROID in jedem Frame aufgerufen wird.
Gültige Verwendung (implizit)
- Die
XR_ANDROID_hand_mesh-Erweiterung muss aktiviert sein, bevor xrGetHandMeshANDROID aufgerufen wird. handMeshTrackermuss ein gültiger XrHandMeshTrackerANDROID-Handle sein.getInfomuss ein Verweis auf eine gültige XrHandMeshGetInfoANDROID-Struktur sein.handMeshesmuss ein Verweis auf eine XrHandTrackingMeshesANDROID-Struktur sein
Rückgabecodes
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
In XrHandMeshGetInfoANDROID werden die Informationen beschrieben, die zum Abrufen von Hand-Mesh-Daten erforderlich sind.
typedef struct XrHandMeshGetInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
} XrHandMeshGetInfoANDROID;
Beschreibungen von Mitgliedern
typeist der XrStructureType dieser Struktur.nextistNULLoder ein Zeiger auf die nächste Struktur in einer Strukturkette. Solche Strukturen sind in OpenXR oder dieser Erweiterung nicht definiert.baseSpaceist ein XrSpace, der den Referenzraum definiert, in dem die Transformation für die Eckpunkte beitimezu finden ist.timeist dieXrTime, die den Zeitpunkt beschreibt, zu dem die Anwendung das Hand-Mesh abfragen möchte.
Gültige Verwendung (implizit)
- Die
XR_ANDROID_hand_mesh-Erweiterung muss aktiviert sein, bevor XrHandMeshGetInfoANDROID verwendet werden kann. typemussXR_TYPE_HAND_MESH_GET_INFO_ANDROIDsein.nextmussNULLoder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein.baseSpacemuss ein gültiger XrSpace-Handle sein
Die Struktur XrHandTrackingMeshesANDROID enthält Mesh-Daten für beide Hände.
typedef struct XrHandTrackingMeshesANDROID {
XrStructureType type;
void* next;
XrHandMeshANDROID leftHandMesh;
XrHandMeshANDROID rightHandMesh;
} XrHandTrackingMeshesANDROID;
Beschreibungen von Mitgliedern
typeist der XrStructureType dieser Struktur.nextistNULLoder ein Zeiger auf die nächste Struktur in einer Strukturkette. Solche Strukturen sind in OpenXR oder dieser Erweiterung nicht definiert.leftHandMeshist das XrHandMeshANDROID für die linke Hand.rightHandMeshist das XrHandMeshANDROID für die rechte Hand.
Gültige Verwendung (implizit)
- Die
XR_ANDROID_hand_mesh-Erweiterung muss aktiviert sein, bevor XrHandTrackingMeshesANDROID verwendet werden kann. typemussXR_TYPE_HAND_TRACKING_MESHES_ANDROIDsein.nextmussNULLoder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein.leftHandMeshmuss eine gültige XrHandMeshANDROID-Struktur seinrightHandMeshmuss eine gültige XrHandMeshANDROID-Struktur sein
Eine XrHandMeshANDROID-Struktur enthält Daten und Puffer, um Hand-Mesh-Tracking-Daten von der Funktion xrGetHandMeshANDROID für eine Hand zu empfangen.
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;
Beschreibungen von Mitgliedern
typeist der XrStructureType dieser Struktur.nextistNULLoder ein Zeiger auf die nächste Struktur in einer Strukturkette. Solche Strukturen sind in OpenXR oder dieser Erweiterung nicht definiert.isActiveist einXrBool32, das angibt, ob der aktuelle Mesh-Tracker für die Hand aktiv ist und die Mesh-Daten gültig sind.dynamicLastUpdateTimeist dieXrTime, die den Zeitpunkt angibt, zu dem die dynamischen Puffer zuletzt aktualisiert wurden.indexCountist einuint32_t, das alsindicesder Handnetzhaut dient.vertexCountist einuint32_t, das alspositionsder Hand-Mesh-Struktur dient. Sie kann auch fürtextureUVsodernormalsverwendet werden, wenn diese vom System unterstützt werden.indicesist ein Array vonuint32_t, das die Mesh-Indexe für Dreiecke in gegen dem Uhrzeigersinn verlaufender Reihenfolge darstellt. Die Anzahl der Werte, auf die verwiesen wird, istindexCount.textureUVsistNULLoder ein Array vonXrVector2f, das die Texturkoordinaten des Vertex darstellt. Die Anzahl der Werte, auf die verwiesen wird, istvertexCount.positionsist ein Array vonXrVector3f, das die Scheitelpunktpositionen inbaseSpaceFromVertexSpacedarstellt. Die Anzahl der Werte, auf die verwiesen wird, istvertexCount.normalsist eineNULLoder ein Array vonXrVector3f, das die Knotennormalen inbaseSpaceFromVertexSpacedarstellt. Die Anzahl der Werte, auf die verwiesen wird, istvertexCount.baseSpaceFromVertexSpaceist der XrSpace-Knoten in XrHandMeshGetInfoANDROID::baseSpace beim Aufruf von xrGetHandMeshANDROID. Anwendungen können dies verwenden, um den Koordinatenraum der Mesh-Ecken und -Normalen während des Renderings zu transformieren.
Das Hand-Mesh wird in Dreiecklisten dargestellt und die Eckpunkte jedes Dreiecks sind in umgekehrter Richtung gegen den Uhrzeigersinn angeordnet, wenn man von außen auf die Hand schaut.
Wenn der zurückgegebene isActive-Wert XR_FALSE ist, wird die Hand nicht aktiv erfasst. Das kann z. B. daran liegen, dass sich die Hand außerhalb des Erfassungsbereichs des Sensors befindet, der Eingabefokus nicht auf der App liegt oder die App nicht die Berechtigungen zum Zugriff auf Daten der Handerkennung hat.
Wenn der zurückgegebene isActive-Wert XR_TRUE ist, werden das in indices und positions dargestellte Hand-Tracking-Mesh, einschließlich textureUVs und normals, sofern vom System unterstützt, auf die neuesten Daten der XrHandMeshGetInfoANDROID::time aktualisiert, die an die Funktion xrGetHandMeshANDROID übergeben wurden.
Der Speicher, auf den von Hand-Mesh-Buffers in XrHandMeshANDROID verwiesen wird, gehört der Laufzeit und wird mit der Anwendung geteilt. Der Zugriff auf den Arbeitsspeicher ist von jedem Thread aus sicher, bis der nächste Aufruf von xrBeginFrame erfolgt, solange der Handle XrHandMeshTrackerANDROID gültig ist.
- Die Werte, auf die
indicesundtextureUVsverweisen, sind nicht dynamisch. - Der Zeiger und die Werte, auf die
positionsundnormalsverweisen, sind dynamisch und können sich zwischen den Aufrufen von xrBeginFrame ändern. Die Anwendung kanndynamicLastUpdateTimeverwenden, um zu prüfen, ob sich die Werte seit dem letzten Frame geändert haben, und unnötige Datenverarbeitung vermeiden, wenn keine Änderungen vorliegen.
Gültige Verwendung (implizit)
- Die
XR_ANDROID_hand_mesh-Erweiterung muss aktiviert sein, bevor XrHandMeshANDROID verwendet werden kann. indicesmuss ein Verweis auf einen gültigenuint32_t-Wert sein.textureUVsmuss ein Verweis auf eine gültige XrVector2f-Struktur sein.positionsmuss ein Verweis auf eine gültige XrVector3f-Struktur sein.normalsmuss ein Verweis auf eine gültige XrVector3f-Struktur sein.
Beispielcode für das Mesh-Tracking von Händen
Im folgenden Beispielcode wird gezeigt, wie Sie für das Rendering auf Hand-Mesh-Buffer zugreifen.
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));
Neue Objekttypen
Neue Enum-Konstanten
Die Aufzählung XrObjectType wurde um Folgendes erweitert:
XR_OBJECT_TYPE_HAND_MESH_TRACKER_ANDROID
Die Aufzählung XrStructureType wurde um folgende Elemente erweitert:
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
Neue Enums
Neue Strukturen
- XrSystemHandMeshTrackingPropertiesANDROID
- XrHandMeshTrackerCreateInfoANDROID
- XrHandMeshGetInfoANDROID
- XrHandMeshANDROID
- XrHandTrackingMeshesANDROID
Neue Funktionen
Probleme
Versionsverlauf
- Revision 1, 10.09.2024 (Levana Chen)
- Erste Beschreibung der Erweiterung
OpenXR™ und das OpenXR-Logo sind Marken der Khronos Group Inc. und sind als Marke in China, der Europäischen Union, Japan und dem Vereinigten Königreich eingetragen.