Ciąg znaków nazwy
XR_ANDROID_hand_mesh
Typ rozszerzenia
Rozszerzenie instancji
Zarejestrowany numer wewnętrzny
704
Wersja
1
Zależności rozszerzeń i wersji
Data ostatniej modyfikacji
2024-09-10
Stan adresu IP
Brak znanych roszczeń do praw autorskich do treści objętych ochroną prawną.
Twórcy
Nihav Jain, Google
Cairn Overturf, Google
Spencer Quin, Google
Levana Chen, Google
Omówienie
To rozszerzenie umożliwia śledzenie rąk reprezentowanych jako dynamiczna siatka dłoni.
To rozszerzenie ma udostępniać bufory wierzchołków i indeksów dla siatki z personalizowanymi rękami użytkownika. Można go używać do zasłonięcia i wizualizacji.
Tego rozszerzenia nie należy używać do śledzenia dłoni w innych celach.
- Do interakcji można użyć
XR_EXT_hand_interaction. - W przypadku połączeń szkieletowych można użyć
XR_EXT_hand_tracking.
Dane śledzenia dłoni mogą zawierać wrażliwe informacje osobowe i są ściśle powiązane z prywatnością i integralnością. Zdecydowanie zalecamy, aby aplikacje, które przechowują lub przesyłają dane śledzenia dłoni, zawsze prosiły użytkownika o aktywne i wyraźne wyrażenie zgody na takie działanie.
Sprawdzanie możliwości systemu
Aplikacja może sprawdzić, czy system jest w stanie śledzić siatki dłoni, łącząc strukturę XrSystemHandMeshTrackingPropertiesANDROID ze strukturą XrSystemProperties podczas wywoływania funkcji xrGetSystemProperties.
typedef struct XrSystemHandMeshTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsHandMeshTracking;
XrBool32 supportsTextureUV;
XrBool32 supportsVertexNormal;
} XrSystemHandMeshTrackingPropertiesANDROID;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktury. Nie ma żadnych takich struktur zdefiniowanych w podstawowej wersji OpenXR ani w tym rozszerzeniu.supportsHandMeshTrackingtoXrBool32, który wskazuje, czy wybranaXrSystemIdobsługuje śledzenie siatki dłoni.supportsTextureUVtoXrBool32, który wskazuje, czy wybranyXrSystemIdobsługuje współrzędne UV tekstury dla wierzchołków siatki.supportsVertexNormaltoXrBool32, który wskazuje, czy wybranaXrSystemIdobsługuje normalne wierzchołka dla wierzchołków siatki.
Aplikacja nie powinna używać funkcji siatki dłoni, gdy supportsHandMeshTracking jest XR_FALSE, ponieważ oznacza to, że system nie obsługuje śledzenia siatki dłoni. W tym przypadku funkcja xrCreateHandMeshTrackerANDROID zwróci wartość XR_ERROR_FEATURE_UNSUPPORTED.
Jeśli supportsHandMeshTracking zwraca XR_TRUE, system obsługuje śledzenie siatki dłoni. Aplikacja powinna używać funkcji XrHandMeshANDROID::indexCount i XrHandMeshANDROID::vertexCount, aby uzyskiwać dostęp do buforów siatki dłoni i używać ich ponownie w pętli renderowania podczas wywoływania funkcji xrGetHandMeshANDROID w każdej klatce.
Jeśli funkcja supportsTextureUV zwraca wartość XR_FALSE, system nie obsługuje map UV tekstury dla wierzchołków siatki. W takim przypadku aplikacja otrzyma wartość NULL z funkcji XrHandMeshANDROID::textureUVs podczas wywołania funkcji xrGetHandMeshANDROID.
Jeśli supportsVertexNormal zwraca XR_FALSE, system nie obsługuje normali wierzchołków dla wierzchołków siatki, a aplikacja otrzyma XrHandMeshANDROID::normals NULL po wywołaniu xrGetHandMeshANDROID.
Prawidłowe użycie (domyślne)
- Zanim użyjesz rozszerzenia
XR_ANDROID_hand_mesh, musisz je włączyć.XrSystemHandMeshTrackingPropertiesANDROID typemusi byćXR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROIDnextmusi byćNULLlub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktury.
Tworzenie uchwytu śledzenia dłoni
XR_DEFINE_HANDLE(XrHandMeshTrackerANDROID)
XrHandMeshTrackerANDROID reprezentuje uchwyt śledzenia siatki dłoni do śledzenia siatki dłoni i zarządzania powiązanymi zasobami.
Z tego uchwytu można korzystać, aby uzyskać dostęp do buforów siatki dłoni za pomocą innych funkcji w tym rozszerzeniu.
Aplikacja może utworzyć uchwyt XrHandMeshTrackerANDROID za pomocą funkcji xrCreateHandMeshTrackerANDROID.
XrResult xrCreateHandMeshTrackerANDROID(
XrSession session,
const XrHandMeshTrackerCreateInfoANDROID* createInfo,
XrHandMeshTrackerANDROID* handMeshTracker);
Opisy parametrów
sessionto XrSession, w której aktywny będzie ręczny lokalizator siatki.createInfoto XrHandMeshTrackerCreateInfoANDROID używany do określania lokalizatora dłoni.handMeshTrackerto zwrócony uchwyt XrHandMeshTrackerANDROID.
Jeśli system nie obsługuje śledzenia siatki dłoni, funkcja xrCreateHandMeshTrackerANDROID zwróci wartość XR_ERROR_FEATURE_UNSUPPORTED.
Uchwyt XrHandMeshTrackerANDROID jest właścicielem wszystkich zasobów do śledzenia siatki dłoni. Po zakończeniu śledzenia dłoni aplikacja musi zniszczyć uchwyt za pomocą funkcji xrDestroyHandMeshTrackerANDROID.
Prawidłowe użycie (domyślne)
- Przed wywołaniem metody xrCreateHandMeshTrackerANDROID należy włączyć rozszerzenie
XR_ANDROID_hand_mesh. sessionmusi być prawidłowym identyfikatorem XrSessioncreateInfomusi być wskaźnikiem do prawidłowej struktury XrHandMeshTrackerCreateInfoANDROIDhandMeshTrackermusi być wskaźnikiem do XrHandMeshTrackerANDROID handle
Kody zwracane
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
Struktura XrHandMeshTrackerCreateInfoANDROID zawiera informacje potrzebne do utworzenia uchwytu XrHandMeshTrackerANDROID.
typedef struct XrHandMeshTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrHandMeshTrackerCreateInfoANDROID;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktury. Nie ma żadnych takich struktur zdefiniowanych w podstawowej wersji OpenXR ani w tym rozszerzeniu.
Prawidłowe użycie (domyślne)
- Przed użyciem XrHandMeshTrackerCreateInfoANDROID musi być włączone rozszerzenie
XR_ANDROID_hand_mesh. typemusi byćXR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROIDnextmusi byćNULLlub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktury.
Funkcja xrDestroyHandMeshTrackerANDROID zwalnia handMeshTracker
i podstawowe zasoby po zakończeniu śledzenia dłoni.
XrResult xrDestroyHandMeshTrackerANDROID(
XrHandMeshTrackerANDROID handMeshTracker);
Opisy parametrów
handMeshTrackerto obiekt XrHandMeshTrackerANDROID utworzony wcześniej przez funkcję xrCreateHandMeshTrackerANDROID.
Prawidłowe użycie (domyślne)
- Przed wywołaniem metody xrDestroyHandMeshTrackerANDROID należy włączyć rozszerzenie
XR_ANDROID_hand_mesh. handMeshTrackermusi być prawidłowym uchwytem XrHandMeshTrackerANDROID
Bezpieczeństwo wątków
- Dostęp do
handMeshTrackeri wszystkich jego uchwytów podrzędnych musi być zsynchronizowany zewnętrznie.
Kody zwracane
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
Znajdowanie siatek dłoni
Aplikacja może użyć funkcji xrGetHandMeshANDROID, aby pobrać siatkę dłoni w określonym sygnaturze czasowej. Pozycja wierzchołków siatki dłoni i ich normalne są reprezentowane w przestrzeni określonej przez XrHandMeshGetInfoANDROID::baseSpace podczas wywoływania funkcji xrGetHandMeshANDROID.
XrResult xrGetHandMeshANDROID(
XrHandMeshTrackerANDROID handMeshTracker,
const XrHandMeshGetInfoANDROID* getInfo,
XrHandTrackingMeshesANDROID* handMeshes);
Opisy parametrów
handMeshTrackerto uchwyt XrHandMeshTrackerANDROID utworzony wcześniej za pomocą funkcji xrCreateHandMeshTrackerANDROID.getInfoto struktura XrHandMeshGetInfoANDROID, która zawiera informacje potrzebne do zapytania o dane siatki dłoni.handMeshesto wskaźnik do struktury XrHandTrackingMeshesANDROID, która zostanie wypełniona danymi siatki dłoni.
Aplikacja może używać funkcji xrGetHandMeshANDROID, aby uzyskać dostęp do buforów siatki dłoni wygenerowanych przez środowisko uruchomieniowe.
Aplikacja powinna wywołać xrBeginFrame co najmniej raz podczas sesji przed pierwszym wywołaniem xrGetHandMeshANDROID.
Aplikacja powinna używać funkcji XrHandMeshANDROID::indexCount i XrHandMeshANDROID::vertexCount, aby uzyskać dostęp do buforów siatki dłoni i ich ponownego użycia w pętli renderowania podczas wywoływania funkcji xrGetHandMeshANDROID w każdej klatce.
Prawidłowe użycie (domyślne)
- Przed wywołaniem funkcji xrGetHandMeshANDROID musi być włączone rozszerzenie
XR_ANDROID_hand_mesh. handMeshTrackermusi być prawidłowym uchwytem XrHandMeshTrackerANDROIDgetInfomusi być wskaźnikiem do prawidłowej struktury XrHandMeshGetInfoANDROIDhandMeshesmusi być wskaźnikiem do struktury XrHandTrackingMeshesANDROID.
Kody zwracane
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
XrHandMeshGetInfoANDROID zawiera informacje wymagane do uzyskania danych ręki.
typedef struct XrHandMeshGetInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
} XrHandMeshGetInfoANDROID;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktury. Nie ma żadnych takich struktur zdefiniowanych w podstawowej wersji OpenXR ani w tym rozszerzeniu.baseSpaceto XrSpace określający przestrzeń odniesienia, w której należy zlokalizować transformację wierzchołków wtime.timetoXrTime, który określa czas, w którym aplikacja chce wysłać zapytanie do siatki dłoni.
Prawidłowe użycie (domyślne)
- Przed użyciem funkcji XrHandMeshGetInfoANDROID musi być włączone rozszerzenie
XR_ANDROID_hand_mesh. typemusi byćXR_TYPE_HAND_MESH_GET_INFO_ANDROIDnextmusi byćNULLlub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktury.baseSpacemusi być prawidłowym identyfikatorem XrSpace
Struktura XrHandTrackingMeshesANDROID zawiera dane siatki dla obu rąk.
typedef struct XrHandTrackingMeshesANDROID {
XrStructureType type;
void* next;
XrHandMeshANDROID leftHandMesh;
XrHandMeshANDROID rightHandMesh;
} XrHandTrackingMeshesANDROID;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktury. Nie ma żadnych takich struktur zdefiniowanych w podstawowej wersji OpenXR ani w tym rozszerzeniu.leftHandMeshto XrHandMeshANDROID dla lewej ręki.rightHandMeshto XrHandMeshANDROID dla prawej ręki.
Prawidłowe użycie (domyślne)
- Zanim użyjesz XrHandTrackingMeshesANDROID, musisz włączyć rozszerzenie
XR_ANDROID_hand_mesh. typemusi byćXR_TYPE_HAND_TRACKING_MESHES_ANDROIDnextmusi byćNULLlub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktury.leftHandMeshmusi być prawidłową strukturą XrHandMeshANDROIDrightHandMeshmusi być prawidłową strukturą XrHandMeshANDROID
Struktura XrHandMeshANDROID zawiera dane i bufory do odbierania danych śledzenia siatki dłoni z funkcji xrGetHandMeshANDROID dotyczącej jednej dłoni.
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;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktury. Nie ma żadnych takich struktur zdefiniowanych w podstawowej wersji OpenXR ani w tym rozszerzeniu.isActivetoXrBool32, które wskazuje, czy bieżący śledzenie siatki dłoni jest aktywne i czy dane siatki są prawidłowe.dynamicLastUpdateTimetoXrTimeokreślający czas ostatniej aktualizacji dynamicznych buforów.indexCounttouint32_t, który służy jako liczbaindicessiatki rękawicy.vertexCounttouint32_t, który służy jako numerpositionsw sieci mesh ręki. Możesz go też używać dotextureUVslubnormals, jeśli są obsługiwane przez system.indicesto tablicauint32_treprezentująca indeksy siatki dla trójkątów w kolejności przeciwnej do ruchu wskazówek zegara. Liczba wartości, do których się odwołuje, toindexCount.textureUVstoNULLlub tablicaXrVector2freprezentująca wierzchołek współrzędnych tekstury. Liczba wartości, na które wskazuje ten element, tovertexCount.positionsto tablicaXrVector3freprezentująca pozycje wierzchołków wbaseSpaceFromVertexSpace. Liczba wartości, na które wskazuje ten element, tovertexCount.normalstoNULLlub tablicaXrVector3freprezentująca wierzchołeknormals wbaseSpaceFromVertexSpace. Liczba wartości, do których odwołuje się ten element, tovertexCount.baseSpaceFromVertexSpaceto wierzchołek XrSpace znajdujący się w funkcji XrHandMeshGetInfoANDROID::baseSpace podczas wywoływania funkcji xrGetHandMeshANDROID. Aplikacje mogą używać tego do przekształcania przestrzeni współrzędnych wierzchołków i normali siatki podczas renderowania.
Siatka dłoni jest reprezentowana przez listy trójkątów, a wierzchołki każdego trójkąta są w kolejności przeciwnej do ruchu wskazówek zegara, gdy patrzymy na dłoń z zewnątrz.
Jeśli zwrócona wartość isActive to XR_FALSE, oznacza to, że ręka nie jest aktywnie śledzona. Może to być spowodowane na przykład tym, że ręka znajduje się poza zasięgiem czujnika, aplikacja nie jest aktywna lub nie ma uprawnień do dostępu do danych śledzenia ręki.
Gdy zwrócona wartość isActive to XR_TRUE, siatki śledzenia dłoni reprezentowane przez indices i positions, w tym textureUVs i normals, jeśli są obsługiwane przez system, są aktualizowane do najnowszych danych XrHandMeshGetInfoANDROID::time podanych funkcji xrGetHandMeshANDROID.
Pamięć wskazywana przez bufory siatki dłoni zwracane w XrHandMeshANDROID jest własnością środowiska wykonawczego i jest udostępniana aplikacji. Pamięć jest bezpieczna do dostępu z dowolnego wątku do następnego wywołania xrBeginFrame, o ile identyfikator XrHandMeshTrackerANDROID jest prawidłowy.
- Wartości wskazywane przez
indicesitextureUVsnie są dynamiczne. - Wskaźnik i wartości wskazujące na
positionsinormalssą dynamiczne i mogą się zmieniać między wywołaniami funkcji xrBeginFrame. Aplikacja może użyć funkcjidynamicLastUpdateTime, aby sprawdzić, czy wartości zmieniły się od ostatniego kadru, i uniknąć niepotrzebnego przetwarzania danych, gdy nie ma żadnych zmian.
Prawidłowe użycie (domyślne)
- Przed użyciem rozszerzenia
XR_ANDROID_hand_meshmusi być włączone XrHandMeshANDROID indicesmusi być wskaźnikiem do prawidłowej wartościuint32_t.textureUVsmusi być wskaźnikiem do prawidłowej struktury XrVector2fpositionsmusi być wskaźnikiem do prawidłowej struktury XrVector3fnormalsmusi być wskaźnikiem do prawidłowej struktury XrVector3f
Przykładowy kod do śledzenia siatki dłoni
Poniższy przykładowy kod pokazuje, jak uzyskać dostęp do buforów siatki dłoni na potrzeby renderowania.
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));
Nowe typy obiektów
Nowe stałe typu wyliczeniowego
Wyliczenie XrObjectType zostało rozszerzone o:
XR_OBJECT_TYPE_HAND_MESH_TRACKER_ANDROID
Wyliczenie XrStructureType zostało rozszerzone o:
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
Nowe wartości w polu enum
Nowe struktury
- XrSystemHandMeshTrackingPropertiesANDROID
- XrHandMeshTrackerCreateInfoANDROID
- XrHandMeshGetInfoANDROID
- XrHandMeshANDROID
- XrHandTrackingMeshesANDROID
Nowe funkcje
Problemy
Historia wersji
- Wersja 1, 10 września 2024 r. (Levana Chen)
- Wstępny opis rozszerzenia
OpenXR™ i logo OpenXR są znakami towarowymi należącymi do The Khronos Group Inc. i zarejestrowanymi jako znak towarowy w Chinach, Unii Europejskiej, Japonii i Wielkiej Brytanii.