Rozszerzenie OpenXR XR_ANDROID_scene_meshing

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:

(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 to NULL 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)

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 w supportedSemanticLabelSets 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

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 to NULL 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 na XR_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

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 xrGetAllSubmeshStatesANDROIDxrGetSubmeshDataANDROID.

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 to NULL 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 to NULL 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 xrGetAllSubmeshStatesANDROIDxrGetSubmeshDataANDROID.

XrResult xrCreateSceneMeshSnapshotANDROID(
    XrSceneMeshingTrackerANDROID                tracker,
    const XrSceneMeshSnapshotCreateInfoANDROID* createInfo,
    XrSceneMeshSnapshotCreationResultANDROID*   outSnapshotCreationResult);

Opisy parametrów

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 to NULL 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 w submeshStates, 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 to NULL 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 i vertexSemantics.
  • vertexCountOutput to liczba elementów w tablicach vertexPositions, vertexNormalsvertexSemantics, 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 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_ANDROID etykietą semantyczną.
  • indexCapacityInput to długość indices.
  • indexCountOutput to liczba elementów w indices, które zostały zmodyfikowane przez środowisko wykonawcze od początku tablicy.
  • indices to 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

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_ANDROIDXrSceneMeshSemanticLabelSetANDROID.

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

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

Nowe funkcje

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.