Ciąg znaków nazwy
XR_ANDROID_scene_meshing
Typ rozszerzenia Rozszerzenie instancji
Zarejestrowany numer wewnętrzny 464
Wersja 3
Zależności rozszerzeń i wersji OpenXR 1.0
Data ostatniej modyfikacji 2025-05-15
Stan własności intelektualnej Brak znanych roszczeń dotyczących własności intelektualnej.
Współautorzy Spencer Quin, Google Jared Finder, Google Antonio Fontan, Google Cairn Overturf, Google Nihav Jain, Google Salar Khan, Google Sebastian Klose, Google Jürgen Sturm, Google Vinny DaSilva, Google Ricardo Campbell, Google
Omówienie
To rozszerzenie ma na celu dostarczanie danych siatki dla siatek, które w przybliżeniu reprezentują obiekty fizyczne w Twoim otoczeniu. Możesz go używać do wizualizacji sceny w aplikacji immersyjnej i umożliwiania interakcji obiektów wirtualnych z obiektami fizycznymi, np. kolizji.
Dane siatki sceny mogą być wrażliwymi danymi osobowymi i są ściśle powiązane z prywatnością i integralnością osobistą. Zdecydowanie zalecamy, aby aplikacje, które przechowują lub przesyłają dane siatki sceny, zawsze prosiły użytkownika o aktywną i wyraźną zgodę na takie działanie.
Uprawnienia
Aplikacje na Androida muszą mieć w pliku manifestu wymienione uprawnienie android.permission.SCENE_UNDERSTANDING_FINE
.
Uprawnienie android.permission.SCENE_UNDERSTANDING_FINE
jest uważane za uprawnienie wrażliwe, ponieważ umożliwia środowisku wykonawczemu badanie środowiska użytkownika.
Aby korzystać z tych funkcji, aplikacja musi poprosić o uprawnienia w czasie działania:
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
(poziom ochrony: niebezpieczny)
Sprawdzanie możliwości systemu
Aplikacja może sprawdzić, czy system obsługuje tworzenie siatki sceny, łącząc strukturę XrSystemSceneMeshingPropertiesANDROID ze strukturą XrSystemProperties podczas wywoływania funkcji xrGetSystemProperties.
XrSystemSceneMeshingPropertiesANDROID
typedef struct XrSystemSceneMeshingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsSceneMeshing;
} XrSystemSceneMeshingPropertiesANDROID;
Opisy członków
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.supportsSceneMeshing
to XrBool32, który wskazuje, czy system obsługuje siatkę sceny.
Jeśli supportsSceneMeshing
ma wartość XR_FALSE
, system nie obsługuje siatki sceny.
Aplikacja powinna unikać korzystania z funkcji tworzenia siatki sceny, gdy supportsSceneMeshing
ma wartość XR_FALSE
, ponieważ wywołania funkcji xrCreateSceneMeshingTrackerANDROID zakończą się niepowodzeniem.
Jeśli wartość supportsSceneMeshing
to XR_TRUE
, system obsługuje siatkę sceny.
Prawidłowe użycie (niejawne)
- Rozszerzenie
XR_ANDROID_scene_meshing
musi być włączone przed użyciem XrSystemSceneMeshingPropertiesANDROID type
musi mieć wartośćXR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
next
musi być wartościąNULL
lub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur.
XrSceneMeshSemanticLabelSetANDROID
Wyliczenie XrSceneMeshSemanticLabelSetANDROID opisuje zestawy etykiet semantycznych dla siatki sceny.
Każda wartość w tym wyliczeniu reprezentuje inne wyliczenie, które zawiera etykiety semantyczne.
Na przykład wartość XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID
reprezentuje zbiór XrSceneMeshSemanticLabelANDROID.
typedef enum XrSceneMeshSemanticLabelSetANDROID {
XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID = 0,
XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID = 1,
XR_SCENE_MESH_SEMANTIC_LABEL_SET_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshSemanticLabelSetANDROID;
xrEnumerateSupportedSemanticLabelSetsANDROID
Aplikacja może pobrać zestawy etykiet semantycznych obsługiwane przez system za pomocą funkcji xrEnumerateSupportedSemanticLabelSetsANDROID.
XrResult xrEnumerateSupportedSemanticLabelSetsANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t supportedSemanticLabelSetsInputCapacity,
uint32_t* supportedSemanticLabelSetsOutputCount,
XrSceneMeshSemanticLabelSetANDROID* supportedSemanticLabelSets);
Opisy parametrów
instance
to obiekt XrInstance utworzony przez aplikację.systemId
to ponowiona wartość XrSystemId z funkcji xrGetSystem.supportedSemanticLabelSetsInputCapacity
to długośćsupportedSemanticLabelSets
.supportedSemanticLabelSetsOutputCount
to liczba elementów wsupportedSemanticLabelSets
zmodyfikowanych przez środowisko wykonawcze od początku tablicy.supportedSemanticLabelSets
to tablica elementów XrSceneMeshSemanticLabelSetANDROID, do której środowisko wykonawcze zapisuje obsługiwane zestawy etykiet semantycznych.
Oczekuje się, że każdy system będzie obsługiwać co najmniej wartość XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
, ponieważ ta wartość wyliczeniowa nie reprezentuje żadnego zestawu etykiet semantycznych i może być używana w przypadku, gdy aplikacja nie potrzebuje semantyki wierzchołków.
Tworzenie uchwytu śledzenia siatki sceny
XrSceneMeshingTrackerANDROID
XR_DEFINE_HANDLE(XrSceneMeshingTrackerANDROID)
Uchwyt XrSceneMeshingTrackerANDROID reprezentuje śledzenie siatki sceny na potrzeby tworzenia siatki sceny i zarządzania powiązanymi zasobami.
Ten uchwyt może być używany do tworzenia zrzutu siatki sceny za pomocą funkcji xrCreateSceneMeshSnapshotANDROID w tym rozszerzeniu.
xrCreateSceneMeshingTrackerANDROID
Aplikacja może utworzyć uchwyt XrSceneMeshingTrackerANDROID za pomocą funkcji xrCreateSceneMeshingTrackerANDROID.
XrResult xrCreateSceneMeshingTrackerANDROID(
XrSession session,
const XrSceneMeshingTrackerCreateInfoANDROID* createInfo,
XrSceneMeshingTrackerANDROID* tracker);
Opisy parametrów
session
to XrSession, w której będzie aktywny moduł śledzenia siatki sceny.createInfo
to wskaźnik struktury XrSceneMeshingTrackerCreateInfoANDROID, która opisuje tracker siatki sceny do utworzenia.tracker
to zwrócony uchwyt XrSceneMeshingTrackerANDROID.
Jeśli system nie obsługuje siatki sceny, funkcja xrCreateSceneMeshingTrackerANDROID zwróci wartość
XR_ERROR_FEATURE_UNSUPPORTED
.
Aplikacja może sprawdzić obsługę systemu, wywołując funkcję xrGetSystemProperties ze strukturą XrSystemSceneMeshingPropertiesANDROID.
Podczas tworzenia trackera siatki sceny w parametrze XrSceneMeshingTrackerCreateInfoANDROID::semanticLabelSet można używać tylko zestawów etykiet semantycznych, które są obsługiwane przez system. Funkcja xrEnumerateSupportedSemanticLabelSetsANDROID może służyć do pobierania listy obsługiwanych zbiorów etykiet semantycznych.
Jeśli aplikacja zażąda nieobsługiwanego semanticLabelSet
, funkcja xrCreateSceneMeshingTrackerANDROID zwróci wartość XR_ERROR_FEATURE_UNSUPPORTED
.
Uchwyt xrCreateSceneMeshingTrackerANDROID jest właścicielem wszystkich zasobów do tworzenia siatki sceny. Po zakończeniu tworzenia siatki sceny aplikacja musi zniszczyć uchwyt za pomocą funkcji xrDestroySceneMeshingTrackerANDROID.
XrSceneMeshingTrackerCreateInfoANDROID
Struktura XrSceneMeshingTrackerCreateInfoANDROID zawiera informacje potrzebne do utworzenia uchwytu XrSceneMeshingTrackerANDROID.
typedef struct XrSceneMeshingTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSceneMeshSemanticLabelSetANDROID semanticLabelSet;
XrBool32 enableNormals;
} XrSceneMeshingTrackerCreateInfoANDROID;
Opisy członków
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.semanticLabelSet
to XrSceneMeshSemanticLabelSetANDROID używany do określania zestawu etykiet semantycznych, który ma być używany do tworzenia siatki sceny. Jeśli ta wartość jest ustawiona naXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
, środowisko wykonawcze zignoruje pole bufora XrSceneSubmeshDataANDROID::vertexSemantics.enableNormals
to wartość XrBool32 używana do określania, czy podczas pobierania danych siatki sceny mają być uwzględniane wektory normalne wierzchołków siatki w buforze siatki sceny.
xrDestroySceneMeshingTrackerANDROID
Funkcja xrDestroySceneMeshingTrackerANDROID zwalnia tracker
i powiązane z nim zasoby po zakończeniu korzystania z funkcji siatki sceny.
XrResult xrDestroySceneMeshingTrackerANDROID(
XrSceneMeshingTrackerANDROID tracker);
Opisy parametrów
tracker
to utworzony wcześniej XrSceneMeshingTrackerANDROID przez xrCreateSceneMeshingTrackerANDROID.
Tworzenie uchwytu zrzutu siatki sceny
XrSceneMeshSnapshotANDROID
XR_DEFINE_HANDLE(XrSceneMeshSnapshotANDROID)
Uchwyt XrSceneMeshSnapshotANDROID reprezentuje migawkę siatki sceny. Jest on tworzony za pomocą funkcji xrCreateSceneMeshSnapshotANDROID, która w momencie wywołania funkcji wykonuje zrzut danych siatki sceny.
Ten uchwyt może służyć do pobierania informacji i danych o podsiatkach za pomocą funkcji xrGetAllSubmeshStatesANDROID i xrGetSubmeshDataANDROID.
XrSceneMeshSnapshotCreateInfoANDROID
Struktura XrSceneMeshSnapshotCreateInfoANDROID zawiera informacje potrzebne do utworzenia uchwytu XrSceneMeshSnapshotANDROID.
typedef struct XrSceneMeshSnapshotCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
XrBoxf boundingBox;
} XrSceneMeshSnapshotCreateInfoANDROID;
Opisy członków
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.baseSpace
to XrSpace używany do opisywania przestrzeni odniesienia, w której informacje o położeniu podsieci sceny powinny być reprezentowane.time
to XrTime, który opisuje czas, w którym siatka sceny zostanie przetworzona lub wyświetlona.boundingBox
to XrBoxf opisujący pole ograniczenia, w którym ma zostać uzyskana siatka sceny.
XrSceneMeshTrackingStateANDROID
Wyliczenie XrSceneMeshTrackingStateANDROID opisuje stan śledzenia śledzenia siatki sceny. Każda wartość w tym wyliczeniu reprezentuje stan śledzenia siatki sceny. Ten wyliczenie jest zawarte w strukturze XrSceneMeshSnapshotCreationResultANDROID, która jest zwracana przez funkcję xrCreateSceneMeshSnapshotANDROID.
typedef enum XrSceneMeshTrackingStateANDROID {
XR_SCENE_MESH_TRACKING_STATE_INITIALIZING_ANDROID = 0,
XR_SCENE_MESH_TRACKING_STATE_TRACKING_ANDROID = 1,
XR_SCENE_MESH_TRACKING_STATE_WAITING_ANDROID = 2,
XR_SCENE_MESH_TRACKING_STATE_ERROR_ANDROID = 3,
XR_SCENE_MESH_TRACKING_STATE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshTrackingStateANDROID;
XrSceneMeshSnapshotCreationResultANDROID
Struktura XrSceneMeshSnapshotCreationResultANDROID przechowuje wynik utworzenia zrzutu siatki sceny zwrócony przez funkcję xrCreateSceneMeshSnapshotANDROID. Wynik zawiera uchwyt zrzutu i stan śledzenia modułu śledzącego siatkę sceny w momencie utworzenia zrzutu.
typedef struct XrSceneMeshSnapshotCreationResultANDROID {
XrStructureType type;
void* next;
XrSceneMeshSnapshotANDROID snapshot;
XrSceneMeshTrackingStateANDROID trackingState;
} XrSceneMeshSnapshotCreationResultANDROID;
Opisy członków
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.snapshot
to uchwyt XrSceneMeshSnapshotANDROID utworzony przez środowisko wykonawcze.trackingState
to XrSceneMeshTrackingStateANDROID, który opisuje stan śledzenia siatki sceny w momencie utworzenia zrzutu.
xrCreateSceneMeshSnapshotANDROID
Aplikacja może używać funkcji xrCreateSceneMeshSnapshotANDROID do tworzenia migawki siatki sceny z trackera siatki sceny. Ta funkcja zwraca uchwyt XrSceneMeshSnapshotANDROID wraz z wartością XrSceneMeshTrackingStateANDROID zawartą w strukturze XrSceneMeshSnapshotCreationResultANDROID. Uchwyt jest technicznie zrzutem danych siatki sceny w momencie tworzenia. Ten uchwyt może służyć do wykonywania zapytań o informacje i dane siatki sceny za pomocą funkcji xrGetAllSubmeshStatesANDROID i xrGetSubmeshDataANDROID.
XrResult xrCreateSceneMeshSnapshotANDROID(
XrSceneMeshingTrackerANDROID tracker,
const XrSceneMeshSnapshotCreateInfoANDROID* createInfo,
XrSceneMeshSnapshotCreationResultANDROID* outSnapshotCreationResult);
Opisy parametrów
tracker
to uchwyt XrSceneMeshingTrackerANDROID utworzony wcześniej za pomocą funkcji xrCreateSceneMeshingTrackerANDROID.createInfo
to wskaźnik struktury XrSceneMeshSnapshotCreateInfoANDROID, która zawiera informacje niezbędne do utworzenia migawki siatki sceny.outSnapshotCreationResult
to wskaźnik obiektu XrSceneMeshSnapshotCreationResultANDROID, który jest wypełniany przez środowisko wykonawcze wynikiem tworzenia zrzutu.
Pobieranie danych siatki sceny ze zrzutu siatki sceny
XrSceneSubmeshStateANDROID
XrSceneSubmeshStateANDROID opisuje podsiatkę. Zawiera podstawowe informacje o podsieci (identyfikator, pozycja, granice, czas ostatniej aktualizacji).
typedef struct XrSceneSubmeshStateANDROID {
XrStructureType type;
void* next;
XrUuid submeshId;
XrTime lastUpdatedTime;
XrPosef submeshPoseInBaseSpace;
XrExtent3Df bounds;
} XrSceneSubmeshStateANDROID;
Opisy członków
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.submeshId
to identyfikator XrUuid identyfikujący podsiatkę.lastUpdatedTime
to XrTime reprezentujący czas ostatniej aktualizacji podsiatki.submeshPoseInBaseSpace
to XrPosef reprezentujący pozę podsiatki w przestrzeni bazowej używanej do utworzenia migawki siatki sceny. Jest to też pozycja środka pola ograniczającego siatki podrzędnej.bounds
to XrExtent3Df opisujący wymiary pola ograniczającego, które obejmuje siatkę podrzędną. Te granice znajdują się w przestrzeni bazowej, która została użyta do utworzenia siatki sceny.
xrGetAllSubmeshStatesANDROID
Aplikacja może używać funkcji xrGetAllSubmeshStatesANDROID, aby uzyskać stan wszystkich podsiatek w siatce sceny. Zawiera podstawowe informacje, które umożliwiają aplikacji wybieranie podsieci, dla których chce uzyskać dane. Tej funkcji można używać w idiomie dwukrotnego wywołania.
XrResult xrGetAllSubmeshStatesANDROID(
XrSceneMeshSnapshotANDROID snapshot,
uint32_t submeshStateCapacityInput,
uint32_t* submeshStateCountOutput,
XrSceneSubmeshStateANDROID* submeshStates);
Opisy parametrów
snapshot
to uchwyt XrSceneMeshSnapshotANDROID utworzony wcześniej za pomocą funkcji xrCreateSceneMeshSnapshotANDROID.submeshStateCapacityInput
to długośćsubmeshStates
.submeshStateCountOutput
to liczba elementów wsubmeshStates
, które są modyfikowane przez środowisko wykonawcze od początku tablicy.submeshStates
to tablica struktur XrSceneSubmeshStateANDROID, do których środowisko wykonawcze będzie przekazywać stan wszystkich podsiatek w siatce sceny.
XrSceneSubmeshDataANDROID
XrSceneSubmeshDataANDROID zawiera dane trójkątów dla podsiatki wraz z jej identyfikatorem. Ta struktura jest używana w funkcji xrGetSubmeshDataANDROID do pobierania danych podsiatki. Aplikacja musi ustawić identyfikator podsiatki tej struktury i wskaźniki bufora na przydzielone bufory, aby zwrócone dane podsiatki mogły zostać wypełnione w przydzielonych buforach. Aplikacja może używać funkcji xrGetSubmeshDataANDROID w ramach dwuetapowego wywołania, w którym pierwsze wywołanie wymaga ustawienia przez aplikację identyfikatora podsieci i pobrania rozmiarów buforów wymaganych dla danych podsieci, a następnie aplikacja może przydzielić bufory i pobrać dane w drugim wywołaniu.
typedef struct XrSceneSubmeshDataANDROID {
XrStructureType type;
const void* next;
XrUuid submeshId;
uint32_t vertexCapacityInput;
uint32_t vertexCountOutput;
XrVector3f* vertexPositions;
XrVector3f* vertexNormals;
uint8_t* vertexSemantics;
uint32_t indexCapacityInput;
uint32_t indexCountOutput;
uint32_t* indices;
} XrSceneSubmeshDataANDROID;
Opisy członków
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.submeshId
to identyfikator XrUuid identyfikujący podsiatkę.vertexCapacityInput
to długośćvertexPositions
,vertexNormals
ivertexSemantics
.vertexCountOutput
to liczba elementów w tablicachvertexPositions
,vertexNormals
ivertexSemantics
, które zostały zmodyfikowane przez środowisko wykonawcze od początku tablicy.vertexPositions
to tablica XrVector3f, do której środowisko wykonawcze będzie przekazywać pozycje wierzchołków podsieci.vertexNormals
to tablica XrVector3f, do której środowisko wykonawcze będzie zapisywać wektory normalne wierzchołków podsiatki. To pole może pozostaćNULL
, jeśli aplikacja utworzyła moduł śledzący z wyłączonymi wektorami normalnymi.vertexSemantics
to tablicauint8_t
, do której środowisko wykonawcze będzie zapisywać semantykę wierzchołków podsiatki. To pole może pozostaćNULL
, jeśli aplikacja utworzyła moduł śledzący z ustawionąXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
etykietą semantyczną.indexCapacityInput
to długośćindices
.indexCountOutput
to liczba elementów windices
, które zostały zmodyfikowane przez środowisko wykonawcze od początku tablicy.indices
to tablicauint32_t
, do której środowisko wykonawcze będzie zapisywać indeksy podsiatki.
xrGetSubmeshDataANDROID
Aplikacja może używać funkcji xrGetSubmeshDataANDROID, aby pobierać dane z wybranej listy podsiatek. Tej funkcji można używać w idiomie dwukrotnego wywołania. Podczas pierwszego wywołania aplikacja musi ustawić prawidłowy identyfikator podsieci (tzn.identyfikator, który można pobrać z funkcji xrGetAllSubmeshStatesANDROID z tym samym zrzutem siatki sceny) i zerową pojemność każdego elementu na wybranej liście podsieci, aby uzyskać rozmiary buforów wymaganych dla danych podsieci. W drugim wywołaniu aplikacja musi ustawić wskaźniki bufora na przydzielony bufor dla każdego elementu na wybranej liście podsiatek wraz z pojemnością buforów, aby uzyskać dane podsiatek.
XrResult xrGetSubmeshDataANDROID(
XrSceneMeshSnapshotANDROID snapshot,
uint32_t submeshDataCount,
XrSceneSubmeshDataANDROID* inoutSubmeshData);
Opisy parametrów
snapshot
to uchwyt XrSceneMeshSnapshotANDROID utworzony wcześniej za pomocą funkcji xrCreateSceneMeshSnapshotANDROID.submeshDataCount
to długośćinoutSubmeshData
.inoutSubmeshData
to tablica XrSceneSubmeshDataANDROID, w której każdy element będzie wypełniany danymi siatki przez środowisko wykonawcze na podstawie identyfikatora podsiatki.
XrSceneMeshSemanticLabelANDROID
Wyliczenie XrSceneMeshSemanticLabelANDROID to domyślny zestaw etykiet semantycznych, których można używać do etykietowania wierzchołków siatki w celu opisania, na której powierzchni środowiska fizycznego znajduje się dany wierzchołek.
Ten zbiór wyliczeniowy jest reprezentowany przez wartość XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID
w XrSceneMeshSemanticLabelSetANDROID.
typedef enum XrSceneMeshSemanticLabelANDROID {
XR_SCENE_MESH_SEMANTIC_LABEL_OTHER_ANDROID = 0,
XR_SCENE_MESH_SEMANTIC_LABEL_FLOOR_ANDROID = 1,
XR_SCENE_MESH_SEMANTIC_LABEL_CEILING_ANDROID = 2,
XR_SCENE_MESH_SEMANTIC_LABEL_WALL_ANDROID = 3,
XR_SCENE_MESH_SEMANTIC_LABEL_TABLE_ANDROID = 4,
XR_SCENE_MESH_SEMANTIC_LABEL_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshSemanticLabelANDROID;
Usuwanie zrzutu siatki sceny
xrDestroySceneMeshSnapshotANDROID
Aplikacja może użyć funkcji xrDestroySceneMeshSnapshotANDROID do usunięcia migawki siatki sceny. Po zniszczeniu uchwytu aplikacja nie może już używać go do pobierania informacji ani danych o podsiatce. Uchwyt jest automatycznie niszczony po zniszczeniu trackera, ponieważ uchwyt trackera jest nadrzędny w stosunku do uchwytu migawki siatki sceny.
XrResult xrDestroySceneMeshSnapshotANDROID(
XrSceneMeshSnapshotANDROID snapshot);
Opisy parametrów
snapshot
to uchwyt XrSceneMeshSnapshotANDROID utworzony wcześniej za pomocą funkcji xrCreateSceneMeshSnapshotANDROID, który zostanie zniszczony przez tę funkcję.
Przykładowy kod do tworzenia siatki sceny
Poniższy przykładowy kod pokazuje, jak uzyskać dostęp do danych siatki sceny 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_xrCreateSceneMeshingTrackerANDROID xrCreateSceneMeshingTrackerANDROID;
PFN_xrDestroySceneMeshingTrackerANDROID xrDestroySceneMeshingTrackerANDROID;
PFN_xrEnumerateSupportedSemanticLabelSetsANDROID xrEnumerateSupportedSemanticLabelSetsANDROID;
PFN_xrCreateSceneMeshSnapshotANDROID xrCreateSceneMeshSnapshotANDROID;
PFN_xrDestroySceneMeshSnapshotANDROID xrDestroySceneMeshSnapshotANDROID;
PFN_xrGetAllSubmeshStatesANDROID xrGetAllSubmeshStatesANDROID;
PFN_xrGetSubmeshDataANDROID xrGetSubmeshDataANDROID;
// Inspect system capability
XrSystemSceneMeshingPropertiesANDROID sceneMeshingProps = {
.type = XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID,
};
XrSystemProperties sysProps = {
.type = XR_TYPE_SYSTEM_PROPERTIES,
.next = &sceneMeshingProps
};
CHK_XR(xrGetSystemProperties(instance, systemId, &sysProps));
if (!sceneMeshingProps.supportsSceneMeshing) {
// scene meshing is not supported.
return;
}
uint32_t supportedsemanticLabelSetsCount = 0;
xrEnumerateSupportedSemanticLabelSetsANDROID(
instance, systemId, 0, &supportedsemanticLabelSetsCount, nullptr);
std::vector<XrSceneMeshSemanticLabelSetANDROID> supportedSemanticLabelSets(
supportedsemanticLabelSetsCount);
xrEnumerateSupportedSemanticLabelSetsANDROID(
instance, systemId, supportedsemanticLabelSetsCount,
&supportedsemanticLabelSetsCount, supportedSemanticLabelSets.data());
XrSceneMeshSemanticLabelSetANDROID semanticLabelSet = XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID;
// Check if system supports XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID
if (std::find(supportedSemanticLabelSets.begin(), supportedSemanticLabelSets.end(),
XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID) !=
supportedSemanticLabelSets.end()) {
semanticLabelSet = XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID;
}
XrSceneMeshingTrackerCreateInfoANDROID trackerCreateInfo = {
.type = XR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROID,
.semanticLabelSet = semanticLabelSet,
.enableNormals = XR_TRUE
};
XrSceneMeshingTrackerANDROID tracker = XR_NULL_HANDLE;
CHK_XR(xrCreateSceneMeshingTrackerANDROID(session, &trackerCreateInfo, &tracker));
XrSceneMeshSnapshotCreationResultANDROID snapshotResult = {
.type = XR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROID,
.snapshot = XR_NULL_HANDLE
};
XrSceneMeshSnapshotANDROID& snapshot = snapshotResult.snapshot;
XrSceneMeshSnapshotCreateInfoANDROID createInfo = {
.type = XR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROID
};
// app update loop
while (true) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
XrBoxf box; // populated with the bounding box of the camera frustum
// ...
createInfo.baseSpace = appPlaySpace;
createInfo.time = time;
createInfo.boundingBox = box;
// Grab the scene mesh snapshot. This way the app can: know all of the submesh infos,
// choose the appropriate submeshes for which to get data, allocate the necessary
// buffer for those submeshes, and then get the data.
CHK_XR(xrCreateSceneMeshSnapshotANDROID(tracker, &createInfo, &snapshotResult));
// check the tracking state
if (snapshotResult.trackingState == XR_SCENE_MESH_TRACKING_STATE_ERROR_ANDROID) {
// unrecoverable error. Exit the app.
if (snapshot != XR_NULL_HANDLE) {
CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
snapshot = XR_NULL_HANDLE;
}
break;
} else if (snapshotResult.trackingState != XR_SCENE_MESH_TRACKING_STATE_TRACKING_ANDROID) {
// The tracker is not tracking. Try again later.
if (snapshot != XR_NULL_HANDLE) {
CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
snapshot = XR_NULL_HANDLE;
}
continue;
}
// 2-call idiom for getting submesh states
std::vector<XrSceneSubmeshStateANDROID> states;
uint32_t submeshCount = 0;
CHK_XR(xrGetAllSubmeshStatesANDROID(snapshot, 0, &submeshCount, nullptr));
states.resize(submeshCount);
for (XrSceneSubmeshStateANDROID& state : states) {
state = {.type = XR_TYPE_SCENE_SUBMESH_STATE_ANDROID};
}
CHK_XR(xrGetAllSubmeshStatesANDROID(snapshot, submeshCount, &submeshCount, states.data()));
// To store the poses for the selected submeshes
std::vector<XrPosef> submeshesPoses;
submeshesPoses.reserve(submeshCount);
std::vector<XrSceneSubmeshDataANDROID> submeshes;
submeshes.reserve(submeshCount);
// Iterate the states and determine which submeshes the app wants data for
for (XrSceneSubmeshStateANDROID& state : states) {
// Modify this bool as necessary by looking at states. Maybe state.lastUpdatedTime
// is below a threshold or maybe the bounding box does not intersect with camera view
// frustum (The submesh will be culled).
bool needed;
if (needed) {
// Add the selected submesh to the submeshes list. Set the capacity
// zero for now since the size of the buffer will be determined later.
XrSceneSubmeshDataANDROID submesh = {
.type = XR_TYPE_SCENE_SUBMESH_DATA_ANDROID,
.submeshId = state.submeshId,
.vertexCapacityInput = 0,
.vertexCountOutput = 0,
.vertexPositions = nullptr,
.vertexNormals = nullptr,
.vertexSemantics = nullptr,
.indexCapacityInput = 0,
.indexCountOutput = 0,
.indices = nullptr,
};
submeshes.push_back(submesh);
submeshesPoses.push_back(state.submeshPoseInBaseSpace);
}
}
// Grab the data for the selected submeshes using the 2-call idiom.
CHK_XR(xrGetSubmeshDataANDROID(snapshot, submeshes.size(), submeshes.data()));
for (XrSceneSubmeshDataANDROID& submesh : submeshes) {
submesh.vertexCapacityInput = submesh.vertexCountOutput;
submesh.vertexCountOutput = 0;
submesh.vertexPositions = new XrVector3f[submesh.vertexCountOutput];
submesh.vertexNormals = new XrVector3f[submesh.vertexCountOutput];
submesh.vertexSemantics = new uint8_t[submesh.vertexCountOutput];
submesh.indexCapacityInput = submesh.indexCountOutput;
submesh.indexCountOutput = 0;
submesh.indices = new uint32_t[submesh.indexCountOutput];
}
CHK_XR(xrGetSubmeshDataANDROID(snapshot, submeshes.size(), submeshes.data()));
// Destroy the scene mesh snapshot since we have finally grabbed the submeshes data. In
// next iteration app can: create a new one to get latest mesh data
CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
snapshot = XR_NULL_HANDLE;
// Iterate the submeshes and get the vertex positions, vertex normals and
// vertex semantics data for the selected submeshes
for (uint32_t i = 0; i < submeshes.size(); i++) {
XrSceneSubmeshDataANDROID& data = submeshes[i];
XrVector3f* vertexPositions = data.vertexPositions;
XrVector3f* vertexNormals = data.vertexNormals;
XrSceneMeshSemanticLabelANDROID* vertexSemantics =
reinterpret_cast<XrSceneMeshSemanticLabelANDROID*>(data.vertexSemantics);
XrPosef pose = submeshesPoses[i];
// *** Use the data as per needs ***
// Release the allocated memory for the data buffers when done using
delete [] data.vertexPositions;
delete [] data.vertexNormals;
delete [] data.vertexSemantics;
delete [] data.indices;
}
// ...
// Finish frame loop
// ...
}
CHK_XR(xrDestroySceneMeshingTrackerANDROID(tracker));
Nowe typy obiektów
Nowe stałe wyliczeniowe
Wyliczenie XrObjectType zostało rozszerzone o:
XR_OBJECT_TYPE_SCENE_MESHING_TRACKER_ANDROID
XR_OBJECT_TYPE_SCENE_MESH_SNAPSHOT_ANDROID
Wyliczenie XrStructureType zostało rozszerzone o:
XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
XR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROID
XR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROID
XR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROID
XR_TYPE_SCENE_SUBMESH_STATE_ANDROID
XR_TYPE_SCENE_SUBMESH_DATA_ANDROID
Nowe wartości w polu enum
Nowe struktury
- XrSystemSceneMeshingPropertiesANDROID
- XrSceneMeshingTrackerCreateInfoANDROID
- XrSceneMeshSnapshotCreateInfoANDROID
- XrSceneMeshSnapshotCreationResultANDROID
- XrSceneSubmeshStateANDROID
- XrSceneSubmeshDataANDROID
Nowe funkcje
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrEnumerateSupportedSemanticLabelSetsANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
Problemy
Historia wersji
- Wersja 3, 15 maja 2025 r. (Salar Khan) ** Początkowy opis rozszerzenia
OpenXR™ i logo OpenXR są znakami towarowymi należącymi do The Khronos Group Inc. i są zarejestrowane jako znaki towarowe w Chinach, Unii Europejskiej, Japonii i Wielkiej Brytanii.