Xr_android_scene_meshing openxr расширение

Имя Строка XR_ANDROID_scene_meshing

Тип расширения Расширение экземпляра

Зарегистрированный добавочный номер 464

Редакция 3

Зависимости расширений и версий OpenXR 1.0

Дата последнего изменения : 15.05.2025

Статус интеллектуальной собственности Неизвестные претензии по правам интеллектуальной собственности.

Авторы: Спенсер Куин, Google Джаред Файндер, Google Антонио Фонтан, Google Керн Овертурф, Google Нихав Джейн, Google Салар Хан, Google Себастьян Клозе, Google Юрген Штурм, Google Винни ДаСильва, Google Рикардо Кэмпбелл, Google

Обзор

Это расширение предназначено для предоставления данных о сетках, приблизительно соответствующих физическим объектам в вашей среде. Его можно использовать для визуализации сцены в иммерсивных приложениях и обеспечения взаимодействия виртуальных объектов с физическими, например, для столкновений.

Данные сетки сцен могут представлять собой конфиденциальную персональную информацию, тесно связанную с конфиденциальностью и целостностью персональных данных. Настоятельно рекомендуется, чтобы приложения, хранящие или передающие данные сетки сцен, всегда запрашивали у пользователя активное и конкретное согласие на это.

Разрешения

В манифесте приложений Android должно быть указано разрешение android.permission.SCENE_UNDERSTANDING_FINE . Разрешение android.permission.SCENE_UNDERSTANDING_FINE считается конфиденциальным, поскольку позволяет среде выполнения изучать пользовательскую среду.

Приложение должно запросить разрешение во время выполнения для использования этих функций:

(уровень защиты: опасно)

Проверить возможности системы

Приложение может проверить, способна ли система создавать сетку сцены, прикрепив структуру XrSystemSceneMeshingPropertiesANDROID к XrSystemProperties при вызове xrGetSystemProperties .

XrSystemSceneMeshingPropertiesANDROID

typedef struct XrSystemSceneMeshingPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsSceneMeshing;
} XrSystemSceneMeshingPropertiesANDROID;

Описания участников

  • typeXrStructureType этой структуры.
  • next — это NULL или указатель на следующую структуру в цепочке структур. Такие структуры не определены ни в ядре OpenXR, ни в этом расширении.
  • supportsSceneMeshing — это XrBool32 , указывающий, поддерживает ли система сетку сцены.

Если supportsSceneMeshing равно XR_FALSE , система не поддерживает сетку сцены. Приложению следует избегать использования функции сетки сцены, если значение supportsSceneMeshing равно XR_FALSE , так как вызовы xrCreateSceneMeshingTrackerANDROID приведут к ошибке.

Если supportsSceneMeshing равно XR_TRUE , система поддерживает сетку сцены.

Допустимое использование (неявное)

XrSceneMeshSemanticLabelSetANDROID

Перечисление XrSceneMeshSemanticLabelSetANDROID описывает наборы семантических меток для построения сетки сцены. Каждое значение в этом перечислении представляет другое перечисление, содержащее эти семантические метки. Например, значение XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID представляет набор 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

Приложение может получать наборы семантических меток, поддерживаемые системой, с помощью функции xrEnumerateSupportedSemanticLabelSetsANDROID .

XrResult xrEnumerateSupportedSemanticLabelSetsANDROID(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    uint32_t                                    supportedSemanticLabelSetsInputCapacity,
    uint32_t*                                   supportedSemanticLabelSetsOutputCount,
    XrSceneMeshSemanticLabelSetANDROID*         supportedSemanticLabelSets);

Описания параметров

  • instance — это XrInstance , созданный приложением.
  • systemId — это XrSystemId , повторно полученный из xrGetSystem .
  • supportedSemanticLabelSetsInputCapacity — это длина supportedSemanticLabelSets .
  • supportedSemanticLabelSetsOutputCount — это количество элементов в supportedSemanticLabelSets , измененных средой выполнения, начиная с начала массива.
  • supportedSemanticLabelSets — это массив XrSceneMeshSemanticLabelSetANDROID , в который среда выполнения записывает поддерживаемые наборы семантических меток.

Ожидается, что каждая система будет по крайней мере поддерживать XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID , поскольку это значение перечисления не представляет собой набор семантических меток и может использоваться в случае, если приложению не нужна семантика вершин.

Создайте маркер трекера сетки сцены

XrSceneMeshingTrackerANDROID

XR_DEFINE_HANDLE(XrSceneMeshingTrackerANDROID)

Дескриптор XrSceneMeshingTrackerANDROID представляет собой трекер сетки сцены для создания сетки сцены и управления соответствующими ресурсами.

Этот дескриптор можно использовать для создания снимка сетки сцены с помощью xrCreateSceneMeshSnapshotANDROID в этом расширении.

xrCreateSceneMeshingTrackerANDROID

Приложение может создать дескриптор XrSceneMeshingTrackerANDROID с помощью функции xrCreateSceneMeshingTrackerANDROID .

XrResult xrCreateSceneMeshingTrackerANDROID(
    XrSession                                   session,
    const XrSceneMeshingTrackerCreateInfoANDROID* createInfo,
    XrSceneMeshingTrackerANDROID*               tracker);

Описания параметров

  • session — это XrSession , в которой будет активен трекер сетки сцены.
  • createInfo — указатель на структуру XrSceneMeshingTrackerCreateInfoANDROID , используемую для описания создаваемого трекера сетки сцены.
  • tracker — это возвращенный дескриптор XrSceneMeshingTrackerANDROID .

Если система не поддерживает сетку сцены, xrCreateSceneMeshingTrackerANDROID вернет XR_ERROR_FEATURE_UNSUPPORTED . Приложение может проверить поддержку системы, вызвав xrGetSystemProperties со структурой XrSystemSceneMeshingPropertiesANDROID .

При создании трекера сетки сцены в XrSceneMeshingTrackerCreateInfoANDROID::semanticLabelSet можно использовать только те наборы семантических меток, которые поддерживаются системой. Для получения списка поддерживаемых наборов семантических меток можно использовать функцию xrEnumerateSupportedSemanticLabelSetsANDROID .

Если приложение запрашивает неподдерживаемый semanticLabelSet , xrCreateSceneMeshingTrackerANDROID вернет XR_ERROR_FEATURE_UNSUPPORTED .

Дескриптор xrCreateSceneMeshingTrackerANDROID владеет всеми ресурсами для построения сетки сцены. После завершения создания сетки сцены приложение должно уничтожить дескриптор с помощью функции xrDestroySceneMeshingTrackerANDROID .

XrSceneMeshingTrackerCreateInfoANDROID

Структура XrSceneMeshingTrackerCreateInfoANDROID описывает информацию для создания дескриптора XrSceneMeshingTrackerANDROID .

typedef struct XrSceneMeshingTrackerCreateInfoANDROID {
    XrStructureType                       type;
    const void*                           next;
    XrSceneMeshSemanticLabelSetANDROID    semanticLabelSet;
    XrBool32                              enableNormals;
} XrSceneMeshingTrackerCreateInfoANDROID;

Описания участников

  • typeXrStructureType этой структуры.
  • next — это NULL или указатель на следующую структуру в цепочке структур. Такие структуры не определены ни в ядре OpenXR, ни в этом расширении.
  • semanticLabelSet — это XrSceneMeshSemanticLabelSetANDROID , используемый для задания набора семантических меток, который будет использоваться для построения сетки сцены. Если задано значение XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID , среда выполнения будет игнорировать поле буфера XrSceneSubmeshDataANDROID::vertexSemantics .
  • enableNormals — это XrBool32 , используемый для указания того, следует ли включать нормали вершин для вершин сетки в буфер сетки сцены при получении данных сетки сцены.

xrDestroySceneMeshingTrackerANDROID

Функция xrDestroySceneMeshingTrackerANDROID освобождает tracker и базовые ресурсы после завершения создания сетки сцены.

XrResult xrDestroySceneMeshingTrackerANDROID(
    XrSceneMeshingTrackerANDROID          tracker);

Описания параметров

Создать маркер снимка сетки сцены

XrSceneMeshSnapshotANDROID

XR_DEFINE_HANDLE(XrSceneMeshSnapshotANDROID)

Дескриптор XrSceneMeshSnapshotANDROID представляет собой снимок сетки сцены. Он создаётся с помощью функции xrCreateSceneMeshSnapshotANDROID , которая, по сути, делает снимок данных сетки сцены на момент вызова функции.

Этот дескриптор можно использовать для извлечения информации и данных подсетки с помощью xrGetAllSubmeshStatesANDROID и xrGetSubmeshDataANDROID .

XrSceneMeshSnapshotCreateInfoANDROID

Структура XrSceneMeshSnapshotCreateInfoANDROID описывает информацию для создания дескриптора XrSceneMeshSnapshotANDROID.

typedef struct XrSceneMeshSnapshotCreateInfoANDROID {
    XrStructureType    type;
    const void*        next;
    XrSpace            baseSpace;
    XrTime             time;
    XrBoxf             boundingBox;
} XrSceneMeshSnapshotCreateInfoANDROID;

Описания участников

  • typeXrStructureType этой структуры.
  • next — это NULL или указатель на следующую структуру в цепочке структур. Такие структуры не определены ни в ядре OpenXR, ни в этом расширении.
  • baseSpace — это XrSpace , используемый для описания опорного пространства, в котором должна быть представлена информация о позе подсеток сцены.
  • time — это XrTime , которое описывает время, когда сетка сцены будет обработана или отображена.
  • boundingBox — это XrBoxf, описывающий ограничивающий прямоугольник, внутри которого будет получена сетка сцены.

XrSceneMeshTrackingStateANDROID

Перечисление XrSceneMeshTrackingStateANDROID описывает состояние отслеживания для объекта отслеживания сетки сцены. Каждое значение в этом перечислении представляет состояние объекта отслеживания сетки сцены. Это перечисление заключено в структуру XrSceneMeshSnapshotCreationResultANDROID , возвращаемую функцией 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

Структура XrSceneMeshSnapshotCreationResultANDROID хранит результат создания снимка сетки сцены, возвращаемый функцией xrCreateSceneMeshSnapshotANDROID . Результат включает в себя дескриптор снимка и состояние отслеживания объекта отслеживания сетки сцены на момент создания снимка.

typedef struct XrSceneMeshSnapshotCreationResultANDROID {
    XrStructureType                  type;
    void*                            next;
    XrSceneMeshSnapshotANDROID       snapshot;
    XrSceneMeshTrackingStateANDROID    trackingState;
} XrSceneMeshSnapshotCreationResultANDROID;

Описания участников

  • typeXrStructureType этой структуры.
  • next — это NULL или указатель на следующую структуру в цепочке структур. Такие структуры не определены ни в ядре OpenXR, ни в этом расширении.
  • snapshot представляет собой дескриптор XrSceneMeshSnapshotANDROID, созданный средой выполнения.
  • trackingState — это XrSceneMeshTrackingStateANDROID , который описывает состояние трекера сетки сцены во время создания снимка.

xrCreateSceneMeshSnapshotANDROID

Приложение может использовать функцию xrCreateSceneMeshSnapshotANDROID для создания снимка сетки сцены из трекера сетки сцены. Эта функция возвращает дескриптор XrSceneMeshSnapshotANDROID вместе с XrSceneMeshTrackingStateANDROID, обёрнутым в структуру XrSceneMeshSnapshotCreationResultANDROID . Технически дескриптор представляет собой снимок данных сетки сцены на момент её создания. Этот дескриптор можно использовать для запроса информации и данных сетки сцены с помощью функций xrGetAllSubmeshStatesANDROID и xrGetSubmeshDataANDROID соответственно.

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

Описания параметров

Получение данных сетки сцены из снимка сетки сцены

XrSceneSubmeshStateANDROID

XrSceneSubmeshStateANDROID описывает подсетку. Он содержит основную информацию о ней (идентификатор, поза, границы, время последнего обновления).

typedef struct XrSceneSubmeshStateANDROID {
    XrStructureType    type;
    void*              next;
    XrUuid             submeshId;
    XrTime             lastUpdatedTime;
    XrPosef            submeshPoseInBaseSpace;
    XrExtent3Df        bounds;
} XrSceneSubmeshStateANDROID;

Описания участников

  • typeXrStructureType этой структуры.
  • next — это NULL или указатель на следующую структуру в цепочке структур. Такие структуры не определены ни в ядре OpenXR, ни в этом расширении.
  • submeshId — это XrUuid , идентифицирующий подсетку.
  • lastUpdatedTime — это XrTime , представляющее время последнего обновления подсетки.
  • submeshPoseInBaseSpace — это XrPosef , представляющий позу подсетки в базовом пространстве, используемом для создания снимка сетки сцены. Это также поза центра ограничивающего прямоугольника подсетки.
  • bounds — это XrExtent3Df, описывающий размеры ограничивающего прямоугольника, охватывающего подсетку. Эти границы находятся в базовом пространстве, которое использовалось для создания маркера сетки сцены.

xrGetAllSubmeshStatesANDROID

Приложение может использовать функцию xrGetAllSubmeshStatesANDROID для получения состояния всех подсеток в сетке сцены. Эта функция содержит базовую информацию, позволяющую приложению выбирать подсетки, для которых ему требуются данные. Эту функцию можно использовать в идиоме с двумя вызовами.

XrResult xrGetAllSubmeshStatesANDROID(
    XrSceneMeshSnapshotANDROID            snapshot,
    uint32_t                              submeshStateCapacityInput,
    uint32_t*                             submeshStateCountOutput,
    XrSceneSubmeshStateANDROID*           submeshStates);

Описания параметров

  • snapshot — это дескриптор XrSceneMeshSnapshotANDROID , ранее созданный с помощью xrCreateSceneMeshSnapshotANDROID .
  • submeshStateCapacityInput — это длина submeshStates .
  • submeshStateCountOutput — это количество элементов в submeshStates , которые изменяются средой выполнения, начиная с начала массива.
  • submeshStates — это массив структур XrSceneSubmeshStateANDROID , в который среда выполнения будет выводить состояние всех подсеток в сетке сцены.

XrSceneSubmeshDataANDROID

XrSceneSubmeshDataANDROID содержит данные треугольников для подсетки вместе с идентификатором подсетки. Эта структура используется в xrGetSubmeshDataANDROID для получения данных подсетки. Приложение должно установить идентификатор подсетки этой структуры и указатели на выделенные буферы, чтобы возвращаемые данные для подсетки могли быть помещены в выделенные буферы. Приложение может использовать xrGetSubmeshDataANDROID как идиому с двумя вызовами, где первый вызов потребует от приложения установить идентификатор подсетки и получить размеры буферов, необходимых для данных подсетки, а затем приложение может выделить буферы и получить данные во втором вызове.

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;

Описания участников

  • typeXrStructureType этой структуры.
  • next — это NULL или указатель на следующую структуру в цепочке структур. Такие структуры не определены ни в ядре OpenXR, ни в этом расширении.
  • submeshId — это XrUuid , идентифицирующий подсетку.
  • vertexCapacityInput — это длина vertexPositions , vertexNormals и vertexSemantics .
  • vertexCountOutput — это количество элементов в vertexPositions , vertexNormals и vertexSemantics , которые были изменены средой выполнения, начиная с начала массива.
  • vertexPositions — это массив XrVector3f , в который среда выполнения будет выводить позиции вершин подсетки.
  • vertexNormals — это массив XrVector3f , в который среда выполнения выводит нормали вершин подсетки. Это поле можно оставить NULL если приложение создало трекер с отключенными нормалями.
  • vertexSemantics — это массив uint8_t , в который среда выполнения выводит семантику вершин подсетки. Это поле можно оставить NULL , если приложение создало трекер с набором семантических меток XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID .
  • indexCapacityInput — длина indices .
  • indexCountOutput — это количество элементов в indices , которые были изменены средой выполнения, начиная с начала массива.
  • indices — это массив uint32_t , в который среда выполнения будет выводить индексы подсетки.

xrGetSubmeshDataANDROID

Приложение может использовать функцию xrGetSubmeshDataANDROID для получения данных для выбранного списка подсеток. Эту функцию можно использовать в идиоме с двумя вызовами. В первом вызове приложение должно установить действительный идентификатор подсетки (например, доступный из xrGetAllSubmeshStatesANDROID с тем же снимком сетки сцены) и нулевую ёмкость для каждого элемента в выбранном списке подсеток, чтобы получить размеры буферов, необходимых для данных подсеток. Во втором вызове приложение должно установить указатели буферов на выделенный буфер для каждого элемента в выбранном списке подсеток, а также ёмкость буферов для получения данных подсеток.

XrResult xrGetSubmeshDataANDROID(
    XrSceneMeshSnapshotANDROID            snapshot,
    uint32_t                              submeshDataCount,
    XrSceneSubmeshDataANDROID*            inoutSubmeshData);

Описания параметров

  • snapshot — это дескриптор XrSceneMeshSnapshotANDROID , ранее созданный с помощью xrCreateSceneMeshSnapshotANDROID .
  • submeshDataCount — это длина inoutSubmeshData .
  • inoutSubmeshData — это массив XrSceneSubmeshDataANDROID , в котором каждый элемент будет заполнен данными сетки средой выполнения на основе идентификатора подсетки.

XrSceneMeshSemanticLabelANDROID

Перечисление XrSceneMeshSemanticLabelANDROID — это набор семантических меток по умолчанию, которые можно использовать для маркировки вершин сетки, чтобы указать, на какой поверхности физической среды находится данная вершина. Этот набор представлен значением XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID в 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;

Уничтожить снимок сетки сцены

xrDestroySceneMeshSnapshotANDROID

Приложение может использовать функцию xrDestroySceneMeshSnapshotANDROID для уничтожения снимка сетки сцены. После уничтожения дескриптора приложение больше не сможет использовать его для получения информации или данных подсетки. Дескриптор автоматически уничтожается при уничтожении трекера, поскольку дескриптор трекера является родительским для дескриптора снимка сетки сцены.

XrResult xrDestroySceneMeshSnapshotANDROID(
    XrSceneMeshSnapshotANDROID            snapshot);

Описания параметров

Пример кода для создания сетки сцены

В следующем примере кода показано, как получить доступ к данным сетки сцены для рендеринга.

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));

Новые типы объектов

Новые константы перечисления

Перечисление XrObjectType расширено:

  • XR_OBJECT_TYPE_SCENE_MESHING_TRACKER_ANDROID
  • XR_OBJECT_TYPE_SCENE_MESH_SNAPSHOT_ANDROID

Перечисление XrStructureType расширено:

  • 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

Новые перечисления

Новые структуры

Новые функции

Проблемы

История версий

  • Редакция 3, 15.05.2025 (Салар Хан) ** Первоначальное описание расширения

OpenXR™ и логотип OpenXR являются товарными знаками компании Khronos Group Inc. и зарегистрированы в качестве товарных знаков в Китае, Европейском Союзе, Японии и Великобритании.