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
- typeto XrStructureType tej struktury.
- nextto- NULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.
- supportsSceneMeshingto 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_meshingmusi być włączone przed użyciem XrSystemSceneMeshingPropertiesANDROID
- typemusi mieć wartość- XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
- nextmusi być wartością- NULLlub 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
- instanceto obiekt XrInstance utworzony przez aplikację.
- systemIdto ponowiona wartość XrSystemId z funkcji xrGetSystem.
- supportedSemanticLabelSetsInputCapacityto długość- supportedSemanticLabelSets.
- supportedSemanticLabelSetsOutputCountto liczba elementów w- supportedSemanticLabelSetszmodyfikowanych przez środowisko wykonawcze od początku tablicy.
- supportedSemanticLabelSetsto 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
- sessionto XrSession, w której będzie aktywny moduł śledzenia siatki sceny.
- createInfoto wskaźnik struktury XrSceneMeshingTrackerCreateInfoANDROID, która opisuje tracker siatki sceny do utworzenia.
- trackerto 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
- typeto XrStructureType tej struktury.
- nextto- NULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.
- semanticLabelSetto 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 na- XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID, środowisko wykonawcze zignoruje pole bufora XrSceneSubmeshDataANDROID::vertexSemantics.
- enableNormalsto 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
- trackerto 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
- typeto XrStructureType tej struktury.
- nextto- NULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.
- baseSpaceto XrSpace używany do opisywania przestrzeni odniesienia, w której informacje o położeniu podsieci sceny powinny być reprezentowane.
- timeto XrTime, który opisuje czas, w którym siatka sceny zostanie przetworzona lub wyświetlona.
- boundingBoxto 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
- typeto XrStructureType tej struktury.
- nextto- NULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.
- snapshotto uchwyt XrSceneMeshSnapshotANDROID utworzony przez środowisko wykonawcze.
- trackingStateto 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
- trackerto uchwyt XrSceneMeshingTrackerANDROID utworzony wcześniej za pomocą funkcji xrCreateSceneMeshingTrackerANDROID.
- createInfoto wskaźnik struktury XrSceneMeshSnapshotCreateInfoANDROID, która zawiera informacje niezbędne do utworzenia migawki siatki sceny.
- outSnapshotCreationResultto 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
- typeto XrStructureType tej struktury.
- nextto- NULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.
- submeshIdto identyfikator XrUuid identyfikujący podsiatkę.
- lastUpdatedTimeto XrTime reprezentujący czas ostatniej aktualizacji podsiatki.
- submeshPoseInBaseSpaceto XrPosef reprezentujący pozę podsiatki w przestrzeni bazowej używanej do utworzenia migawki siatki sceny. Jest to też pozycja środka pola ograniczającego podsiatki.
- boundsto 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
- snapshotto uchwyt XrSceneMeshSnapshotANDROID utworzony wcześniej za pomocą funkcji xrCreateSceneMeshSnapshotANDROID.
- submeshStateCapacityInputto długość- submeshStates.
- submeshStateCountOutputto liczba elementów w- submeshStates, które są modyfikowane przez środowisko wykonawcze od początku tablicy.
- submeshStatesto tablica struktur XrSceneSubmeshStateANDROID, do których środowisko wykonawcze będzie zapisywać 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 bufor, aby zwrócone dane podsiatki można było wypełnić w przydzielonych buforach. Aplikacja może używać funkcji xrGetSubmeshDataANDROID w ramach dwuetapowego wywołania, w którym pierwsze wywołanie wymaga od aplikacji ustawienia identyfikatora podsiatki i pobrania rozmiarów buforów wymaganych dla danych podsiatki, 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
- typeto XrStructureType tej struktury.
- nextto- NULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowej specyfikacji OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.
- submeshIdto identyfikator XrUuid identyfikujący podsiatkę.
- vertexCapacityInputto długość- vertexPositions,- vertexNormalsi- vertexSemantics.
- vertexCountOutputto liczba elementów w tablicach- vertexPositions,- vertexNormalsi- vertexSemantics, które zostały zmodyfikowane przez środowisko wykonawcze od początku tablicy.
- vertexPositionsto tablica XrVector3f, do której środowisko wykonawcze będzie przekazywać pozycje wierzchołków podsieci.
- vertexNormalsto 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.
- vertexSemanticsto tablica- uint8_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_ANDROIDetykietą semantyczną.
- indexCapacityInputto długość- indices.
- indexCountOutputto liczba elementów w- indices, które zostały zmodyfikowane przez środowisko wykonawcze od początku tablicy.
- indicesto tablica- uint32_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
- snapshotto uchwyt XrSceneMeshSnapshotANDROID utworzony wcześniej za pomocą funkcji xrCreateSceneMeshSnapshotANDROID.
- submeshDataCountto długość- inoutSubmeshData.
- inoutSubmeshDatato 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
- snapshotto 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.
