Ciąg znaków nazwy
XR_ANDROID_hand_mesh
Typ rozszerzenia
Rozszerzenie instancji
Zarejestrowany numer wewnętrzny
704
Weryfikacja
1
Zależności rozszerzenia i wersji
Data ostatniej modyfikacji
2024-09-10
Stan adresu IP
Brak znanych roszczeń dotyczących adresu IP.
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 personalizowanej reprezentacji rąk użytkownika. Można go używać do zasłonięcia i wizualizacji.
Tego rozszerzenia nie należy używać do innych celów śledzenia dłoni.
- 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 dane 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łania funkcji xrGetSystemProperties.
typedef struct XrSystemHandMeshTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsHandMeshTracking;
XrBool32 supportsTextureUV;
XrBool32 supportsVertexNormal;
} XrSystemHandMeshTrackingPropertiesANDROID;
Opisy członków
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktury. Nie ma żadnych takich struktur zdefiniowanych w podstawowym OpenXR ani w tym rozszerzeniu.supportsHandMeshTracking
toXrBool32
, który wskazuje, czy wybranaXrSystemId
obsługuje śledzenie siatki dłoni.supportsTextureUV
toXrBool32
, który wskazuje, czy wybranyXrSystemId
obsługuje współrzędne UV tekstury dla wierzchołków siatki.supportsVertexNormal
toXrBool32
, który wskazuje, czy wybranaXrSystemId
obsł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)
- Przed użyciem rozszerzenia
XR_ANDROID_hand_mesh
należy je włączyćXrSystemHandMeshTrackingPropertiesANDROID type
musi byćXR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROID
next
musi byćNULL
lub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktury.
Tworzenie uchwytu śledzenia dłoni
XR_DEFINE_HANDLE(XrHandMeshTrackerANDROID)
XrHandMeshTrackerANDROID reprezentuje śledzenie dłoni i zarządzanie 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
session
to XrSession, w której aktywny będzie ręczny lokalizator siatki.createInfo
to XrHandMeshTrackerCreateInfoANDROID używany do określenia lokalizatora siatki dłoni.handMeshTracker
to zwrócony uchwyt XrHandMeshTrackerANDROID.
Jeśli system nie obsługuje śledzenia siatki dłoni, funkcja xrCreateHandMeshTrackerANDROID zwróci wartość XR_ERROR_FEATURE_UNSUPPORTED
.
Obiekt XrHandMeshTrackerANDROID obsługuje wszystkie zasoby 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
. session
musi być prawidłowym identyfikatorem XrSessioncreateInfo
musi być wskaźnikiem do prawidłowej struktury XrHandMeshTrackerCreateInfoANDROIDhandMeshTracker
musi być wskaźnikiem do XrHandMeshTrackerANDROID handle
Kody zwrotu
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
Struktura XrHandMeshTrackerCreateInfoANDROID zawiera informacje potrzebne do utworzenia uchwytu XrHandMeshTrackerANDROID.
typedef struct XrHandMeshTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrHandMeshTrackerCreateInfoANDROID;
Opisy członków
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktury. Nie ma żadnych takich struktur zdefiniowanych w podstawowym OpenXR ani w tym rozszerzeniu.
Prawidłowe użycie (domyślne)
- Przed użyciem funkcji XrHandMeshTrackerCreateInfoANDROID musi być włączone rozszerzenie
XR_ANDROID_hand_mesh
. type
musi byćXR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROID
next
musi byćNULL
lub 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
handMeshTracker
to 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
. handMeshTracker
musi być prawidłowym uchwytem XrHandMeshTrackerANDROID
Bezpieczeństwo wątków
- Dostęp do
handMeshTracker
i wszystkich jego uchwytów podrzędnych musi być zsynchronizowany zewnętrznie.
Kody zwrotu
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTED
XR_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
handMeshTracker
to XrHandMeshTrackerANDROID, który został utworzony za pomocą funkcji xrCreateHandMeshTrackerANDROID.getInfo
to struktura XrHandMeshGetInfoANDROID zawierająca informacje potrzebne do zapytania o dane siatki dłoni.handMeshes
to 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
. handMeshTracker
musi być prawidłowym uchwytem XrHandMeshTrackerANDROIDgetInfo
musi być wskaźnikiem do prawidłowej struktury XrHandMeshGetInfoANDROIDhandMeshes
musi być wskaźnikiem do struktury XrHandTrackingMeshesANDROID.
Kody zwrotu
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
XrHandMeshGetInfoANDROID zawiera informacje wymagane do uzyskania danych dotyczących dłoni.
typedef struct XrHandMeshGetInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
} XrHandMeshGetInfoANDROID;
Opisy członków
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowym OpenXR ani w tym rozszerzeniu nie zdefiniowano żadnych takich struktur.baseSpace
to XrSpace określający przestrzeń odniesienia, w której należy zlokalizować transformację wierzchołków wtime
.time
toXrTime
, 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
. type
musi byćXR_TYPE_HAND_MESH_GET_INFO_ANDROID
next
musi byćNULL
lub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktury.baseSpace
musi 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
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktury. Nie ma żadnych takich struktur zdefiniowanych w podstawowym OpenXR ani w tym rozszerzeniu.leftHandMesh
to XrHandMeshANDROID dla lewej ręki.rightHandMesh
to XrHandMeshANDROID dla prawej ręki.
Prawidłowe użycie (domyślne)
- Zanim użyjesz XrHandTrackingMeshesANDROID, musisz włączyć rozszerzenie
XR_ANDROID_hand_mesh
. type
musi byćXR_TYPE_HAND_TRACKING_MESHES_ANDROID
next
musi byćNULL
lub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktury.leftHandMesh
musi być prawidłową strukturą XrHandMeshANDROIDrightHandMesh
musi być prawidłową strukturą XrHandMeshANDROID
Struktura XrHandMeshANDROID zawiera dane i bufory do odbierania danych śledzenia siatki dłoni z funkcji xrGetHandMeshANDROID dla 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
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktury. Nie ma żadnych takich struktur zdefiniowanych w podstawowym OpenXR ani w tym rozszerzeniu.isActive
toXrBool32
wskazujący, czy bieżący lokalizator siatki dłoni jest aktywny i czy dane siatki są prawidłowe.dynamicLastUpdateTime
toXrTime
określający czas ostatniej aktualizacji dynamicznych buforów.indexCount
touint32_t
, który służy jako liczbaindices
siatki rękawicy.vertexCount
touint32_t
, który jest liczbąpositions
siatki ręki. Możesz też użyć tych funkcji w przypadkutextureUVs
lubnormals
, jeśli są obsługiwane przez system.indices
to tablicauint32_t
reprezentują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
.textureUVs
toNULL
lub tablicaXrVector2f
reprezentująca wierzchołek współrzędnych tekstury. Liczba wartości, na które wskazuje ten element, tovertexCount
.positions
to tablicaXrVector3f
reprezentująca pozycje wierzchołków wbaseSpaceFromVertexSpace
. Liczba wartości, na które wskazuje ten element, tovertexCount
.normals
toNULL
lub tablicaXrVector3f
reprezentująca wierzchołeknormals wbaseSpaceFromVertexSpace
. Liczba wartości, do których odwołuje się ten element, tovertexCount
.baseSpaceFromVertexSpace
to 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 funkcji xrBeginFrame, gdy uchwyt XrHandMeshTrackerANDROID jest prawidłowy.
- Wartości wskazywane przez
indices
itextureUVs
nie są dynamiczne. - Wskaźnik i wartości wskazujące na
positions
inormals
są 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_mesh
musi być włączone XrHandMeshANDROID indices
musi być wskaźnikiem do prawidłowej wartościuint32_t
.textureUVs
musi być wskaźnikiem do prawidłowej struktury XrVector2fpositions
musi być wskaźnikiem do prawidłowej struktury XrVector3fnormals
musi 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_ANDROID
XR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROID
XR_TYPE_HAND_MESH_GET_INFO_ANDROID
XR_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)
- Początkowy opis rozszerzenia