XR_ANDROID_scene_meshing
Name String
XR_ANDROID_scene_meshing
Тип расширения
Расширение экземпляра
Зарегистрированный добавочный номер
719
Revision
3
Статус ратификации
Не ратифицировано
Зависимости расширений и версий
Дата последнего изменения
2025-05-15
Статус IP-адреса
Нет известных претензий в отношении интеллектуальной собственности.
Авторы
Спенсер Куин (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
Обзор
Это расширение предназначено для создания сеток, которые приблизительно представляют физические объекты в окружении пользователя.
Приложения могут использовать это расширение для визуализации сцены и взаимодействия виртуальных объектов с физическими, например при столкновениях.
Данные сетки сцены генерируются средой выполнения и передаются приложению с помощью XrSceneMeshingTrackerANDROID и XrSceneMeshSnapshotANDROID . Приложения могут получать доступ к значениям в информации о подсетке сцены через XrSceneSubmeshStateANDROID, возвращаемый из xrGetAllSubmeshStatesANDROID . Приложения могут получать доступ к значениям в данных о субмешах сцены через XrSceneSubmeshDataANDROID, возвращаемый из xrGetSubmeshDataANDROID .
Данные о сетке сцены – это конфиденциальная личная информация, которая тесно связана с конфиденциальностью и неприкосновенностью частной жизни. Настоятельно рекомендуется, чтобы приложения, которые хранят или передают данные о сетке сцены, всегда запрашивали у пользователя активное и конкретное согласие на это.
Разрешения
В манифесте приложений для Android должно быть указано разрешение android.permission.SCENE_UNDERSTANDING_FINE. Разрешение android.permission.SCENE_UNDERSTANDING_FINE считается разрешением на доступ к конфиденциальной информации, поскольку позволяет среде выполнения изучать окружение пользователя.
Приложение должно запрашивать разрешение на использование следующих функций:
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
(уровень защиты: опасный)
Проверка возможностей системы
Структура XrSystemSceneMeshingPropertiesANDROID определяется следующим образом:
typedef struct XrSystemSceneMeshingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsSceneMeshing;
} XrSystemSceneMeshingPropertiesANDROID;
Описания участников
type– это XrStructureType этой структуры.next– этоNULLили указатель на следующую структуру в цепочке. Такие структуры не определены в ядре OpenXR или этом расширении.supportsSceneMeshing– этоXrBool32, указывающий, поддерживает ли система создание сетки сцены.
Приложение может проверить, способна ли система создавать сетку сцены, связав структуру XrSystemSceneMeshingPropertiesANDROID со структурой XrSystemProperties при вызове xrGetSystemProperties .
Если среда выполнения возвращает XR_FALSE для supportsSceneMeshing, система не поддерживает создание сетки сцены и поэтому должна возвращать XR_ERROR_FEATURE_UNSUPPORTED из xrCreateSceneMeshingTrackerANDROID . Приложение не должно использовать функцию создания сетки сцены, если для supportsSceneMeshing задано значение XR_FALSE .
Если среда выполнения возвращает XR_TRUE для supportsSceneMeshing , система поддерживает создание сетки сцены.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_scene_meshingдолжно быть включено до использования XrSystemSceneMeshingPropertiesANDROID. -
typeдолжно бытьXR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID -
nextдолжно бытьNULLили действительным указателем на следующую структуру в цепочке структур.
Перечисление 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_DEFAULT2_ANDROID = 1000801000,
XR_SCENE_MESH_SEMANTIC_LABEL_SET_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshSemanticLabelSetANDROID;
Перечисляемые значения имеют следующие значения:
Описание перечисления
XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
Этот набор семантических ярлыков представляет отсутствие семантических ярлыков.
XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID
Этот набор семантических ярлыков представляет XrSceneMeshSemanticLabelANDROID.
XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT2_ANDROID
Этот набор семантических ярлыков представляет XrSceneMeshSemanticLabel2ANDROID. (Добавлено расширением XR_ANDROID_scene_meshing_semantic_label2)
Функция xrEnumerateSupportedSemanticLabelSetsANDROID определяется следующим образом:
XrResult xrEnumerateSupportedSemanticLabelSetsANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t supportedSemanticLabelSetsInputCapacity,
uint32_t* supportedSemanticLabelSetsOutputCount,
XrSceneMeshSemanticLabelSetANDROID* supportedSemanticLabelSets);
Описание параметров
instance– это XrInstance, созданный приложением.systemId– этоXrSystemId, полученный из xrGetSystem .supportedSemanticLabelSetsInputCapacity– емкостьsupportedSemanticLabelSetsили 0 для получения требуемой емкости.supportedSemanticLabelSetsOutputCount– указатель на количество записанныхsupportedSemanticLabelSetsили указатель на требуемую емкость, еслиsupportedSemanticLabelSetsInputCapacityнедостаточно.supportedSemanticLabelSets– указатель на массив XrSceneMeshSemanticLabelSetANDROID . Может бытьNULL, еслиsupportedSemanticLabelSetsInputCapacityравно 0.- Подробное описание того, как получить нужный размер
supportedSemanticLabelSets, приведено в разделе Параметры размера буфера.
Приложение может перечислить наборы семантических меток, поддерживаемые системой, с помощью функции xrEnumerateSupportedSemanticLabelSetsANDROID.
Каждая система должна поддерживать как минимум XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID, поскольку это значение перечисления представляет собой набор семантических меток и может использоваться, если приложению не нужна семантика вершин.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_scene_meshingдолжно быть включено до вызова xrEnumerateSupportedSemanticLabelSetsANDROID. -
instanceдолжен быть действительным дескриптором XrInstance. -
supportedSemanticLabelSetsOutputCountдолжен быть указателем на значениеuint32_t. - Если
supportedSemanticLabelSetsInputCapacityне равно0,supportedSemanticLabelSetsдолжен быть указателем на массив значенийsupportedSemanticLabelSetsInputCapacityXrSceneMeshSemanticLabelSetANDROID.
Коды возврата
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
Создать дескриптор трекера сетки сцены
XR_DEFINE_HANDLE(XrSceneMeshingTrackerANDROID)
Дескриптор XrSceneMeshingTrackerANDROID представляет трекер для создания сетки сцены и управления связанными ресурсами.
Этот дескриптор можно использовать для создания снимка сетки сцены с помощью xrCreateSceneMeshSnapshotANDROID в этом расширении.
Функция xrCreateSceneMeshingTrackerANDROID определяется следующим образом:
XrResult xrCreateSceneMeshingTrackerANDROID(
XrSession session,
const XrSceneMeshingTrackerCreateInfoANDROID* createInfo,
XrSceneMeshingTrackerANDROID* tracker);
Описание параметров
session– это XrSession, в котором будет активен трекер сетки сцены.createInfo– указатель на структуру XrSceneMeshingTrackerCreateInfoANDROID, которая описывает создаваемый трекер.tracker– возвращенный дескриптор XrSceneMeshingTrackerANDROID.
Приложение может создать дескриптор XrSceneMeshingTrackerANDROID с помощью функции xrCreateSceneMeshingTrackerANDROID.
Если система не поддерживает мешинг сцены, среда выполнения должна возвращать XR_ERROR_FEATURE_UNSUPPORTED из xrCreateSceneMeshingTrackerANDROID . В этом случае среда выполнения должна возвращать XR_FALSE для XrSystemSceneMeshingPropertiesANDROID :: supportsSceneMeshing при вызове функции xrGetSystemProperties, чтобы приложение могло не создавать трекер разбиения сцены на полигоны.
При создании трекера сетки сцены приложение должно использовать только наборы семантических меток, поддерживаемые системой в XrSceneMeshingTrackerCreateInfoANDROID :: semanticLabelSet. Если приложение использует неподдерживаемый набор семантических меток вершин сетки сцены, среда выполнения должна возвращать XR_ERROR_FEATURE_UNSUPPORTED из xrCreateSceneMeshingTrackerANDROID .
Приложение может перечислить список поддерживаемых наборов семантических меток с помощью функции xrEnumerateSupportedSemanticLabelSetsANDROID.
Дескриптор xrCreateSceneMeshingTrackerANDROID владеет всеми ресурсами для создания сетки сцены. После завершения работы с сеткой сцены приложение должно удалить дескриптор с помощью функции xrDestroySceneMeshingTrackerANDROID.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_scene_meshingдолжно быть включено до вызова xrCreateSceneMeshingTrackerANDROID. -
sessionдолжен быть действительным дескриптором XrSession. -
createInfoдолжен быть указателем на действительную структуру XrSceneMeshingTrackerCreateInfoANDROID. -
trackerдолжен быть указателем на дескриптор XrSceneMeshingTrackerANDROID.
Коды возврата
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
Структура XrSceneMeshingTrackerCreateInfoANDROID определяется следующим образом:
typedef struct XrSceneMeshingTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSceneMeshSemanticLabelSetANDROID semanticLabelSet;
XrBool32 enableNormals;
} XrSceneMeshingTrackerCreateInfoANDROID;
Описания участников
type– это XrStructureType этой структуры.next– этоNULLили указатель на следующую структуру в цепочке. Такие структуры не определены в ядре OpenXR или этом расширении.semanticLabelSet– это XrSceneMeshSemanticLabelSetANDROID, который используется для указания набора семантических меток, используемых для создания сетки сцены. Если задано значениеXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID, среда выполнения будет игнорировать поле буфера XrSceneSubmeshDataANDROID ::vertexSemantics.enableNormals– этоXrBool32, используемый для указания того, следует ли включать нормали вершин для вершин сетки в буфер сетки сцены при получении данных сетки сцены.
Структура XrSceneMeshingTrackerCreateInfoANDROID описывает информацию, необходимую для создания дескриптора XrSceneMeshingTrackerANDROID.
Допустимое использование (неявное)
- Перед использованием XrSceneMeshingTrackerCreateInfoANDROID необходимо включить расширение
XR_ANDROID_scene_meshing. -
typeдолжно бытьXR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROID -
nextдолжно бытьNULLили действительным указателем на следующую структуру в цепочке структур. -
semanticLabelSetдолжно быть допустимым значением XrSceneMeshSemanticLabelSetANDROID.
Функция xrDestroySceneMeshingTrackerANDROID определяется следующим образом:
XrResult xrDestroySceneMeshingTrackerANDROID(
XrSceneMeshingTrackerANDROID tracker);
Описание параметров
tracker– это XrSceneMeshingTrackerANDROID, ранее созданный с помощью xrCreateSceneMeshingTrackerANDROID .
Функция xrDestroySceneMeshingTrackerANDROID освобождает tracker и базовые ресурсы после завершения работы с сеткой сцены.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_scene_meshingдолжно быть включено до вызова xrDestroySceneMeshingTrackerANDROID. -
trackerдолжен быть действительным дескриптором XrSceneMeshingTrackerANDROID.
Потокобезопасность
- Доступ к
trackerи любым дочерним дескрипторам должен быть синхронизирован извне.
Коды возврата
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
Создать дескриптор снимка сетки сцены
XR_DEFINE_HANDLE(XrSceneMeshSnapshotANDROID)
Дескриптор XrSceneMeshSnapshotANDROID представляет снимок сетки сцены. Для этого используется функция xrCreateSceneMeshSnapshotANDROID, которая делает снимок данных сетки сцены в момент вызова функции.
Этот дескриптор можно использовать для получения информации и данных о подсетке с помощью xrGetAllSubmeshStatesANDROID и xrGetSubmeshDataANDROID .
Функция xrCreateSceneMeshSnapshotANDROID определяется следующим образом:
XrResult xrCreateSceneMeshSnapshotANDROID(
XrSceneMeshingTrackerANDROID tracker,
const XrSceneMeshSnapshotCreateInfoANDROID* createInfo,
XrSceneMeshSnapshotCreationResultANDROID* outSnapshotCreationResult);
Описание параметров
tracker– дескриптор XrSceneMeshingTrackerANDROID, ранее созданный с помощью xrCreateSceneMeshingTrackerANDROID .createInfo– указатель на структуру XrSceneMeshSnapshotCreateInfoANDROID, которая содержит информацию, необходимую для создания снимка сетки сцены.outSnapshotCreationResult– указатель на объект XrSceneMeshSnapshotCreationResultANDROID, который заполняется средой выполнения с результатом создания снимка.
Приложение может использовать функцию xrCreateSceneMeshSnapshotANDROID, чтобы создать снимок сетки сцены из трекера сетки сцены. Эта функция возвращает дескриптор XrSceneMeshSnapshotANDROID вместе с XrSceneMeshTrackingStateANDROID, упакованным в структуру XrSceneMeshSnapshotCreationResultANDROID. Технически дескриптор – это снимок данных сетки сцены на момент создания. Этот дескриптор можно использовать для запроса информации о сетке сцены и данных с помощью xrGetAllSubmeshStatesANDROID и xrGetSubmeshDataANDROID соответственно.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_scene_meshingдолжно быть включено до вызова xrCreateSceneMeshSnapshotANDROID. -
trackerдолжен быть действительным дескриптором XrSceneMeshingTrackerANDROID. -
createInfoдолжен быть указателем на действительную структуру XrSceneMeshSnapshotCreateInfoANDROID. -
outSnapshotCreationResultдолжен быть указателем на структуру XrSceneMeshSnapshotCreationResultANDROID.
Коды возврата
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_POSE_INVALIDXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_TIME_INVALID
Структура XrSceneMeshSnapshotCreateInfoANDROID определяется следующим образом:
typedef struct XrSceneMeshSnapshotCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
XrBoxf boundingBox;
} XrSceneMeshSnapshotCreateInfoANDROID;
Описания участников
type– это XrStructureType этой структуры.next– этоNULLили указатель на следующую структуру в цепочке. Такие структуры не определены в ядре OpenXR или этом расширении.baseSpace– это XrSpace, в котором представлена информация о позе подсетки сцены.time– этоXrTime, описывающий время, когда сетка сцены будет обработана или показана. Обычно это XrFrameState ::predictedDisplayTime.boundingBox– это XrBoxf, описывающий граничную рамку, в которой нужно получить сетку сцены.
Структура XrSceneMeshSnapshotCreateInfoANDROID описывает информацию, необходимую для создания дескриптора XrSceneMeshSnapshotANDROID.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_scene_meshingдолжно быть включено до использования XrSceneMeshSnapshotCreateInfoANDROID. -
typeдолжно бытьXR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROID -
nextдолжно бытьNULLили действительным указателем на следующую структуру в цепочке структур. -
baseSpaceдолжен быть действительным идентификатором XrSpace.
Структура XrSceneMeshSnapshotCreationResultANDROID определяется следующим образом:
typedef struct XrSceneMeshSnapshotCreationResultANDROID {
XrStructureType type;
const void* next;
XrSceneMeshSnapshotANDROID snapshot;
XrSceneMeshTrackingStateANDROID trackingState;
} XrSceneMeshSnapshotCreationResultANDROID;
Описания участников
type– это XrStructureType этой структуры.next– этоNULLили указатель на следующую структуру в цепочке. Такие структуры не определены в ядре OpenXR или этом расширении.snapshot– дескриптор XrSceneMeshSnapshotANDROID, созданный средой выполнения.trackingState– это XrSceneMeshTrackingStateANDROID, описывающий состояние трекера сетки сцены на момент создания снимка.
Структура XrSceneMeshSnapshotCreationResultANDROID хранит результат создания снимка сетки сцены, возвращенный из xrCreateSceneMeshSnapshotANDROID .
Допустимое использование (неявное)
- Перед использованием XrSceneMeshSnapshotCreationResultANDROID необходимо включить расширение
XR_ANDROID_scene_meshing. -
typeдолжно бытьXR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROID -
nextдолжно бытьNULLили действительным указателем на следующую структуру в цепочке структур. -
snapshotдолжен быть действительным дескриптором XrSceneMeshSnapshotANDROID. -
trackingStateдолжно быть допустимым значением XrSceneMeshTrackingStateANDROID.
Перечисление XrSceneMeshTrackingStateANDROID описывает состояние отслеживания для трекера сетки сцены. Каждое значение в этом перечислении представляет состояние трекера сетки сцены.
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;
Перечисляемые значения имеют следующие значения:
Описание перечисления
XR_SCENE_MESH_TRACKING_STATE_INITIALIZING_ANDROID
Трекер пока не готов предоставлять данные сетки.
XR_SCENE_MESH_TRACKING_STATE_TRACKING_ANDROID
Трекер активно отслеживает.
XR_SCENE_MESH_TRACKING_STATE_WAITING_ANDROID
Трекер ожидает действительных измерений для интеграции с момента последнего обновления сетки.
XR_SCENE_MESH_TRACKING_STATE_ERROR_ANDROID
Трекер не получал действительных измерений в течение нескольких циклов и находится в состоянии ошибки.
Это состояние служит только дополнительной информацией для приложения. Если других источников ошибок нет, среда выполнения должна по-прежнему разрешать приложению создавать снимки и получать из них данные независимо от текущего значения XrSceneMeshTrackingStateANDROID трекера. Если статус не XR_SCENE_MESH_TRACKING_STATE_TRACKING_ANDROID , снимки могут быть неактуальными или пустыми.
Получение данных сетки сцены из ее снимка
Функция xrGetAllSubmeshStatesANDROID определяется следующим образом:
XrResult xrGetAllSubmeshStatesANDROID(
XrSceneMeshSnapshotANDROID snapshot,
uint32_t submeshStateCapacityInput,
uint32_t* submeshStateCountOutput,
XrSceneSubmeshStateANDROID* submeshStates);
Описание параметров
snapshot– дескриптор XrSceneMeshSnapshotANDROID, ранее созданный с помощью xrCreateSceneMeshSnapshotANDROID .submeshStateCapacityInput– емкостьsubmeshStatesили 0 для получения требуемой емкости.submeshStateCountOutput– указатель на количество записанныхsubmeshStatesили указатель на требуемую емкость, еслиsubmeshStateCapacityInputнедостаточно.submeshStates– указатель на массив структур XrSceneSubmeshStateANDROID, в которые среда выполнения будет выводить состояние всех подсеток в сетке сцены. Может бытьNULL, еслиsubmeshStateCapacityInputравно 0.- Подробное описание того, как получить нужный размер
submeshStates, приведено в разделе Параметры размера буфера.
Приложение может использовать функцию xrGetAllSubmeshStatesANDROID, чтобы получить состояние всех подсеток в сетке сцены. Она содержит базовую информацию, которая позволяет приложению выбирать подсетки, для которых ему нужны данные.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_scene_meshingдолжно быть включено до вызова xrGetAllSubmeshStatesANDROID. -
snapshotдолжен быть действительным дескриптором XrSceneMeshSnapshotANDROID. -
submeshStateCountOutputдолжен быть указателем на значениеuint32_t. - Если
submeshStateCapacityInputне равно0,submeshStatesдолжен быть указателем на массив структурsubmeshStateCapacityInputXrSceneSubmeshStateANDROID.
Коды возврата
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_VALIDATION_FAILURE
Структура XrSceneSubmeshStateANDROID определяется следующим образом:
typedef struct XrSceneSubmeshStateANDROID {
XrStructureType type;
void* next;
XrUuid submeshId;
XrTime lastUpdatedTime;
XrPosef submeshPoseInBaseSpace;
XrExtent3Df bounds;
} XrSceneSubmeshStateANDROID;
Описания участников
type– это XrStructureType этой структуры.next– этоNULLили указатель на следующую структуру в цепочке. Такие структуры не определены в ядре OpenXR или этом расширении.submeshId– это XrUuid, идентифицирующий подсетку.lastUpdatedTime– этоXrTime, представляющий время последнего обновления подсетки.submeshPoseInBaseSpace– это XrPosef, представляющий позу подсетки в базовом пространстве, используемом для создания снимка сетки сцены. Поза также является центром ограничивающей рамки подсетки.bounds– это XrExtent3Df, описывающий размеры ограничивающей рамки, которая включает подсетку. Эти границы определяются в базовом пространстве, которое использовалось для создания дескриптора сетки сцены.
Среда выполнения пытается сопоставить submeshId с областью физического пространства, занимаемой подсеткой. Среды выполнения могут в любое время потерять это сопоставление и назначить новый UUID любому подмножеству обнаруженных подсеток. В частности, средам выполнения не требуется повторно использовать одни и те же UUID для одних и тех же сеток в последующих экземплярах приложения.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_scene_meshingдолжно быть включено до использования XrSceneSubmeshStateANDROID. -
typeдолжно бытьXR_TYPE_SCENE_SUBMESH_STATE_ANDROID -
nextдолжно бытьNULLили действительным указателем на следующую структуру в цепочке структур.
Функция xrGetSubmeshDataANDROID определяется следующим образом:
XrResult xrGetSubmeshDataANDROID(
XrSceneMeshSnapshotANDROID snapshot,
uint32_t submeshDataCount,
XrSceneSubmeshDataANDROID* inoutSubmeshData);
Описание параметров
snapshot– дескриптор XrSceneMeshSnapshotANDROID, ранее созданный с помощью xrCreateSceneMeshSnapshotANDROID .submeshDataCount– длинаinoutSubmeshData.inoutSubmeshData– это выделенный приложением массив XrSceneSubmeshDataANDROID, в котором среда выполнения заполняет каждый элемент данными сетки, связанными с идентификатором подсетки, переданным в XrSceneSubmeshDataANDROID ::submeshId.
Приложение может использовать функцию xrGetSubmeshDataANDROID, чтобы получить пакеты субмешей или все субмеши сразу. Для этого нужно передать список XrSceneSubmeshDataANDROID, в котором для каждого XrSceneSubmeshDataANDROID :: submeshId задан соответствующий идентификатор субмеша.
XrSceneSubmeshDataANDROID :: submeshId должен быть уникальным для каждого элемента в inoutSubmeshData и извлекаемым с помощью xrGetAllSubmeshStatesANDROID для того же snapshot . Если идентификатор подсетки недействителен или у нескольких элементов в inoutSubmeshData одинаковый идентификатор подсетки, то среда выполнения должна возвращать XR_ERROR_VALIDATION_FAILURE .
submeshDataCount должно быть меньше или равно значению, возвращаемому xrGetAllSubmeshStatesANDROID :: submeshStateCountOutput, иначе среда выполнения должна вернуть XR_ERROR_VALIDATION_FAILURE .
Этот метод можно использовать в идиоме с двумя вызовами, чтобы запросить количество вершин и индексов для всех выбранных подсеток.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_scene_meshingдолжно быть включено до вызова xrGetSubmeshDataANDROID. -
snapshotдолжен быть действительным дескриптором XrSceneMeshSnapshotANDROID. -
inoutSubmeshDataдолжен быть указателем на массив структурsubmeshDataCountXrSceneSubmeshDataANDROID. - Значение параметра
submeshDataCountдолжно быть больше0.
Коды возврата
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_VALIDATION_FAILURE
Структура XrSceneSubmeshDataANDROID определяется следующим образом:
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;
Описания участников
type– это XrStructureType этой структуры.next– этоNULLили указатель на следующую структуру в цепочке. Такие структуры не определены в ядре OpenXR или этом расширении.submeshId– это XrUuid, идентифицирующий подсетку.vertexCapacityInput– емкостьvertexPositions,vertexNormalsиvertexSemanticsили 0 для получения требуемой емкости.vertexCountOutput– указатель на количество записанныхvertexPositions,vertexNormalsиvertexSemanticsили указатель на требуемую емкость, еслиvertexCapacityInputнедостаточно.vertexPositions– массив XrVector3f, в который среда выполнения выведет позиции вершин подсетки.vertexNormals– массив XrVector3f, в который среда выполнения выведет нормали вершин подсетки. Это поле может быть пустым (NULL), если приложение создало трекер с отключенными нормалями.vertexSemantics– массивuint8_t, в который среда выполнения выводит семантику вершин подсетки. Это поле можно оставитьNULL, если приложение создало трекер с набором семантических метокXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID.indexCapacityInput– емкостьindicesили 0 для получения требуемой емкости.indexCountOutput– указатель на количество записанныхindicesили указатель на требуемую емкость, еслиvertexCapacityInputнедостаточно.indices– массивuint32_t, в который среда выполнения выведет индексы подсетки.- Подробное описание того, как получить нужный размер
vertexPositions,vertexNormals,vertexSemanticsиindices, приведено в разделе Параметры размера буфера.
Допустимое использование (неявное)
- Перед использованием XrSceneSubmeshDataANDROID необходимо включить расширение
XR_ANDROID_scene_meshing. -
typeдолжно бытьXR_TYPE_SCENE_SUBMESH_DATA_ANDROID -
nextдолжно бытьNULLили действительным указателем на следующую структуру в цепочке структур. - Если
vertexCapacityInputне равно0,vertexPositionsдолжен быть указателем на массив структурvertexCapacityInputXrVector3f. - Если
vertexCapacityInputне равно0,vertexNormalsдолжен быть указателем на массив структурvertexCapacityInputXrVector3f. - Если
vertexCapacityInputне равно0,vertexSemanticsдолжен быть указателем на массив значенийvertexCapacityInputuint8_t. - Если
indexCapacityInputне равно0,indicesдолжен быть указателем на массив значенийindexCapacityInputuint32_t.
Перечисление 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;
Перечисления имеют следующие значения:
Описание перечисления
XR_SCENE_MESH_SEMANTIC_LABEL_OTHER_ANDROID
Эта семантическая метка указывает, что соответствующий элемент сетки представляет неизвестный объект.
XR_SCENE_MESH_SEMANTIC_LABEL_FLOOR_ANDROID
Этот семантический ярлык указывает, что соответствующий элемент сетки представляет собой пол.
XR_SCENE_MESH_SEMANTIC_LABEL_CEILING_ANDROID
Эта семантическая метка указывает, что соответствующий элемент сетки представляет собой потолок.
XR_SCENE_MESH_SEMANTIC_LABEL_WALL_ANDROID
Эта семантическая метка указывает, что соответствующий элемент сетки представляет собой стену.
XR_SCENE_MESH_SEMANTIC_LABEL_TABLE_ANDROID
Эта семантическая метка указывает, что соответствующий элемент сетки представляет собой таблицу.
Удалить снимок сетки сцены
Функция xrDestroySceneMeshSnapshotANDROID определяется следующим образом:
XrResult xrDestroySceneMeshSnapshotANDROID(
XrSceneMeshSnapshotANDROID snapshot);
Описание параметров
snapshot– дескриптор XrSceneMeshSnapshotANDROID, ранее созданный с помощью xrCreateSceneMeshSnapshotANDROID, который будет удален этой функцией.
Приложение может использовать функцию xrDestroySceneMeshSnapshotANDROID, чтобы удалить снимок сетки сцены. После уничтожения дескриптора приложение не сможет использовать его для получения информации или данных о подсетке. Дескриптор автоматически уничтожается при уничтожении трекера, поскольку дескриптор трекера является родительским для дескриптора снимка сетки сцены.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_scene_meshingдолжно быть включено до вызова xrDestroySceneMeshSnapshotANDROID. -
snapshotдолжен быть действительным дескриптором XrSceneMeshSnapshotANDROID.
Потокобезопасность
- Доступ к
snapshotи любым дочерним дескрипторам должен быть синхронизирован извне.
Коды возврата
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
Пример кода для создания сетки сцены
В примере кода ниже показано, как получить доступ к данным сетки сцены для рендеринга.
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
uint32_t submeshCount = 0;
CHK_XR(xrGetAllSubmeshStatesANDROID(snapshot, 0, &submeshCount, nullptr));
std::vector<XrSceneSubmeshStateANDROID> states(submeshCount, {
.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.vertexCapacityInput];
submesh.vertexNormals = new XrVector3f[submesh.vertexCapacityInput];
submesh.vertexSemantics = new uint8_t[submesh.vertexCapacityInput];
submesh.indexCapacityInput = submesh.indexCountOutput;
submesh.indexCountOutput = 0;
submesh.indices = new uint32_t[submesh.indexCapacityInput];
}
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 =
new XrSceneMeshSemanticLabelANDROID[data.vertexCountOutput];
for (uint32_t j = 0; j < data.vertexCountOutput; j++) {
vertexSemantics[j] =
static_cast<XrSceneMeshSemanticLabelANDROID>(data.vertexSemantics[j]);
}
XrPosef pose = submeshesPoses[i];
// *** Use the data as per needs ***
// Release the allocated memory for the data buffers when done using
delete [] vertexSemantics;
delete [] data.vertexPositions;
delete [] data.vertexNormals;
delete [] data.vertexSemantics;
delete [] data.indices;
}
// ...
// Finish frame loop
// ...
}
CHK_XR(xrDestroySceneMeshingTrackerANDROID(tracker));
Новые типы объектов
Новые команды
- xrCreateSceneMeshSnapshotANDROID
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrEnumerateSupportedSemanticLabelSetsANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
Новые структуры
- XrSceneMeshSnapshotCreateInfoANDROID
- XrSceneMeshSnapshotCreationResultANDROID
- XrSceneMeshingTrackerCreateInfoANDROID
- XrSceneSubmeshDataANDROID
- XrSceneSubmeshStateANDROID
Расширение XrSystemProperties :
Новые перечисления
Новые константы перечисления
XR_ANDROID_SCENE_MESHING_EXTENSION_NAMEXR_ANDROID_scene_meshing_SPEC_VERSIONРасширение XrObjectType :
XR_OBJECT_TYPE_SCENE_MESHING_TRACKER_ANDROIDXR_OBJECT_TYPE_SCENE_MESH_SNAPSHOT_ANDROID
Расширение XrStructureType :
XR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROIDXR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROIDXR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROIDXR_TYPE_SCENE_SUBMESH_DATA_ANDROIDXR_TYPE_SCENE_SUBMESH_STATE_ANDROIDXR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
Проблемы
История версий
Версия 3, 15 мая 2025 г. (Салар Хан)
- Описание расширения