Имя Строка 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
считается конфиденциальным, поскольку позволяет среде выполнения изучать пользовательскую среду.
Приложение должно запросить разрешение во время выполнения для использования этих функций:
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
(уровень защиты: опасно)
Проверить возможности системы
Приложение может проверить, способна ли система создавать сетку сцены, прикрепив структуру XrSystemSceneMeshingPropertiesANDROID к XrSystemProperties при вызове xrGetSystemProperties .
XrSystemSceneMeshingPropertiesANDROID
typedef struct XrSystemSceneMeshingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsSceneMeshing;
} XrSystemSceneMeshingPropertiesANDROID;
Описания участников
-
type
— XrStructureType этой структуры. -
next
— этоNULL
или указатель на следующую структуру в цепочке структур. Такие структуры не определены ни в ядре OpenXR, ни в этом расширении. -
supportsSceneMeshing
— это XrBool32 , указывающий, поддерживает ли система сетку сцены.
Если supportsSceneMeshing
равно XR_FALSE
, система не поддерживает сетку сцены. Приложению следует избегать использования функции сетки сцены, если значение supportsSceneMeshing
равно XR_FALSE
, так как вызовы xrCreateSceneMeshingTrackerANDROID приведут к ошибке.
Если supportsSceneMeshing
равно XR_TRUE
, система поддерживает сетку сцены.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_scene_meshing
должно быть включено перед использованием XrSystemSceneMeshingPropertiesANDROID. -
type
должен бытьXR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
-
next
должен бытьNULL
или действительным указателем на следующую структуру в цепочке структур
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;
Описания участников
-
type
— XrStructureType этой структуры. -
next
— этоNULL
или указатель на следующую структуру в цепочке структур. Такие структуры не определены ни в ядре OpenXR, ни в этом расширении. -
semanticLabelSet
— это XrSceneMeshSemanticLabelSetANDROID , используемый для задания набора семантических меток, который будет использоваться для построения сетки сцены. Если задано значениеXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
, среда выполнения будет игнорировать поле буфера XrSceneSubmeshDataANDROID::vertexSemantics . -
enableNormals
— это XrBool32 , используемый для указания того, следует ли включать нормали вершин для вершин сетки в буфер сетки сцены при получении данных сетки сцены.
xrDestroySceneMeshingTrackerANDROID
Функция xrDestroySceneMeshingTrackerANDROID освобождает tracker
и базовые ресурсы после завершения создания сетки сцены.
XrResult xrDestroySceneMeshingTrackerANDROID(
XrSceneMeshingTrackerANDROID tracker);
Описания параметров
-
tracker
— это XrSceneMeshingTrackerANDROID , ранее созданный xrCreateSceneMeshingTrackerANDROID .
Создать маркер снимка сетки сцены
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;
Описания участников
-
type
— XrStructureType этой структуры. -
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;
Описания участников
-
type
— XrStructureType этой структуры. -
next
— этоNULL
или указатель на следующую структуру в цепочке структур. Такие структуры не определены ни в ядре OpenXR, ни в этом расширении. -
snapshot
представляет собой дескриптор XrSceneMeshSnapshotANDROID, созданный средой выполнения. -
trackingState
— это XrSceneMeshTrackingStateANDROID , который описывает состояние трекера сетки сцены во время создания снимка.
xrCreateSceneMeshSnapshotANDROID
Приложение может использовать функцию xrCreateSceneMeshSnapshotANDROID для создания снимка сетки сцены из трекера сетки сцены. Эта функция возвращает дескриптор XrSceneMeshSnapshotANDROID вместе с XrSceneMeshTrackingStateANDROID, обёрнутым в структуру XrSceneMeshSnapshotCreationResultANDROID . Технически дескриптор представляет собой снимок данных сетки сцены на момент её создания. Этот дескриптор можно использовать для запроса информации и данных сетки сцены с помощью функций xrGetAllSubmeshStatesANDROID и xrGetSubmeshDataANDROID соответственно.
XrResult xrCreateSceneMeshSnapshotANDROID(
XrSceneMeshingTrackerANDROID tracker,
const XrSceneMeshSnapshotCreateInfoANDROID* createInfo,
XrSceneMeshSnapshotCreationResultANDROID* outSnapshotCreationResult);
Описания параметров
-
tracker
— это дескриптор XrSceneMeshingTrackerANDROID , ранее созданный с помощью xrCreateSceneMeshingTrackerANDROID . -
createInfo
— указатель на структуру XrSceneMeshSnapshotCreateInfoANDROID , которая содержит необходимую информацию для создания снимка сетки сцены. -
outSnapshotCreationResult
— указатель на объект XrSceneMeshSnapshotCreationResultANDROID , который заполняется средой выполнения результатом создания снимка.
Получение данных сетки сцены из снимка сетки сцены
XrSceneSubmeshStateANDROID
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, описывающий размеры ограничивающего прямоугольника, охватывающего подсетку. Эти границы находятся в базовом пространстве, которое использовалось для создания маркера сетки сцены.
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;
Описания участников
-
type
— XrStructureType этой структуры. -
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);
Описания параметров
-
snapshot
— это дескриптор XrSceneMeshSnapshotANDROID , ранее созданный с помощью xrCreateSceneMeshSnapshotANDROID , который будет уничтожен этой функцией.
Пример кода для создания сетки сцены
В следующем примере кода показано, как получить доступ к данным сетки сцены для рендеринга.
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
Новые перечисления
Новые структуры
- XrSystemSceneMeshingPropertiesANDROID
- XrSceneMeshingTrackerCreateInfoANDROID
- XrSceneMeshSnapshotCreateInfoANDROID
- XrSceneMeshSnapshotCreationResultANDROID
- XrSceneSubmeshStateANDROID
- XrSceneSubmeshDataANDROID
Новые функции
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrEnumerateSupportedSemanticLabelSetsANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
Проблемы
История версий
- Редакция 3, 15.05.2025 (Салар Хан) ** Первоначальное описание расширения
OpenXR™ и логотип OpenXR являются товарными знаками компании Khronos Group Inc. и зарегистрированы в качестве товарных знаков в Китае, Европейском Союзе, Японии и Великобритании.