XR_EXT_spatial_plane_tracking
Строка имени
XR_EXT_spatial_plane_tracking
Тип расширения
Расширение экземпляра
Зарегистрированный добавочный номер
742
Пересмотр
1
Статус ратификации
Ратифицирован
Зависимости расширений и версий
XR_EXT_spatial_entity
Авторы
Нихав Джайн, Google
Натали Флери, Мета
Юичи Тагучи, Мета
Рон Бессемс, Мета
Инь Ли, Microsoft
Джимми Алампарамбил, ByteDance
Чжипен Лю, ByteDance
Джун Ян, ByteDance
Обзор
Это расширение основано на XR_EXT_spatial_entity и определяет возможности отслеживания плоскости в пространственном пространстве для структуры пространственных объектов.
Поддержка во время выполнения
Если среда выполнения поддерживает отслеживание плоскости, она должна указать это, перечислив переменную XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT в переменной xrEnumerateSpatialCapabilitiesEXT .
Конфигурация
Структура XrSpatialCapabilityConfigurationPlaneTrackingEXT определяется следующим образом:
typedef struct XrSpatialCapabilityConfigurationPlaneTrackingEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationPlaneTrackingEXT;
Описание участников
-
type— это XrStructureType данной структуры. -
next— этоNULLили указатель на следующую структуру в цепочке структур. -
capabilityпредставляет собой XrSpatialCapabilityEXT и должна бытьXR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT. -
enabledComponentCount— это типuint32_t, описывающий количество элементов в массивеenabledComponents. -
enabledComponents— это указатель на массив XrSpatialComponentTypeEXT .
Приложения могут включить пространственную возможность XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT , добавив указатель на структуру XrSpatialCapabilityConfigurationPlaneTrackingEXT в XrSpatialContextCreateInfoEXT :: capabilityConfigs .
Если capability не равен XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT , среда выполнения должна вернуть XR_ERROR_VALIDATION_FAILURE .
Допустимое использование (неявное)
- Расширение
XR_EXT_spatial_plane_trackingнеобходимо включить перед использованием XrSpatialCapabilityConfigurationPlaneTrackingEXT. -
typeдолжен бытьXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. - Значение
capabilityдолжно быть допустимым значением XrSpatialCapabilityEXT. -
enabledComponentsдолжен быть указателем на массив допустимых значений XrSpatialComponentTypeEXT, равныхenabledComponentCount. - Параметр
enabledComponentCountдолжен быть больше0
Гарантированные компоненты
Среда выполнения, поддерживающая XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT , должна предоставлять следующие пространственные компоненты в качестве гарантированных компонентов всех объектов, обнаруженных с помощью этой возможности, и должна перечислять их в xrEnumerateSpatialCapabilityComponentTypesEXT :
-
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT -
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT
Ограниченная двумерная компонента
Ограниченная двумерная составляющая определяет центр и границы плоскости, на которой находится объект. Более подробную информацию см. в разделе «Ограниченная двумерная составляющая» .
Компонент выравнивания плоскости
Данные компонентов
typedef enum XrSpatialPlaneAlignmentEXT {
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_UPWARD_EXT = 0,
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_DOWNWARD_EXT = 1,
XR_SPATIAL_PLANE_ALIGNMENT_VERTICAL_EXT = 2,
XR_SPATIAL_PLANE_ALIGNMENT_ARBITRARY_EXT = 3,
XR_SPATIAL_PLANE_ALIGNMENT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPlaneAlignmentEXT;
Перечисление XrSpatialPlaneAlignmentEXT описывает выравнивание плоскости, связанной с пространственным объектом, с помощью компонента XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT .
Значения перечисления имеют следующие значения:
Описание перечисления
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_UPWARD_EXT
Объект расположен горизонтально и обращен вверх (например, к полу).
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_DOWNWARD_EXT
Объект расположен горизонтально и обращен вниз (например, к потолку).
XR_SPATIAL_PLANE_ALIGNMENT_VERTICAL_EXT
Объект имеет вертикальную форму (например, стена).
XR_SPATIAL_PLANE_ALIGNMENT_ARBITRARY_EXT
Объект имеет произвольную, невертикальную и негоризонтальную ориентацию.
Структура списка компонентов для запроса данных
Структура XrSpatialComponentPlaneAlignmentListEXT определяется следующим образом:
typedef struct XrSpatialComponentPlaneAlignmentListEXT {
XrStructureType type;
void* next;
uint32_t planeAlignmentCount;
XrSpatialPlaneAlignmentEXT* planeAlignments;
} XrSpatialComponentPlaneAlignmentListEXT;
Описание участников
-
type— это XrStructureType данной структуры. -
next— этоNULLили указатель на следующую структуру в цепочке структур. -
planeAlignmentCount— это тип данныхuint32_t, описывающий количество элементов в массивеplaneAlignments. -
planeAlignments— это массив объектов XrSpatialPlaneAlignmentEXT .
Для запроса компонента выравнивания плоскости пространственных объектов в XrSpatialSnapshotEXT необходимо включить XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT в XrSpatialComponentDataQueryConditionEXT :: componentTypes и добавить XrSpatialComponentPlaneAlignmentListEXT в цепочку XrSpatialComponentDataQueryResultEXT :: next .
Если XrSpatialComponentPlaneAlignmentListEXT находится в цепочке XrSpatialComponentDataQueryResultEXT :: next , но XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT не включен в XrSpatialComponentDataQueryConditionEXT :: componentTypes, среда выполнения должна возвращать XR_ERROR_VALIDATION_FAILURE из xrQuerySpatialComponentDataDataDataEXT , но XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT не включен в XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Если planeAlignmentCount меньше, чем XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput , среда выполнения должна возвращать XR_ERROR_SIZE_INSUFFICIENT из xrQuerySpatialComponentDataEXT .
Допустимое использование (неявное)
- Расширение
XR_EXT_spatial_plane_trackingнеобходимо включить перед использованием XrSpatialComponentPlaneAlignmentListEXT. -
typeдолжен бытьXR_TYPE_SPATIAL_COMPONENT_PLANE_ALIGNMENT_LIST_EXT -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. -
planeAlignmentsдолжен быть указателем на массив значенийplaneAlignmentCountXrSpatialPlaneAlignmentEXT. - Параметр
planeAlignmentCountдолжен быть больше0
Конфигурация
Если для какой-либо возможности перечислено значение XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT в структуре XrSpatialCapabilityComponentTypesEXT :: componentTypes , приложение может включить его, указав это значение в списке XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents структуры, производной от XrSpatialCapabilityConfigurationBaseHeaderEXT , которая поддерживает этот компонент.
Для этого компонента не требуется включать какую-либо специальную конфигурацию в цепочку XrSpatialCapabilityConfigurationBaseHeaderEXT :: next .
Дополнительные компоненты
Среда выполнения, поддерживающая XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT , может поддерживать и другие пространственные компоненты в дополнение к тем, которые перечислены в разделе «Гарантированные компоненты» . Приложение использует xrEnumerateSpatialCapabilityComponentTypesEXT для получения полного списка компонентов, поддерживаемых средой выполнения, а затем настраивает те, которые его интересуют, при создании пространственного контекста.
Компонент сетки 2D
Данные компонентов
XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT использует структуру XrSpatialMeshDataEXT для хранения данных.
Структура списка компонентов для запроса данных
Структура XrSpatialComponentMesh2DListEXT определяется следующим образом:
typedef struct XrSpatialComponentMesh2DListEXT {
XrStructureType type;
void* next;
uint32_t meshCount;
XrSpatialMeshDataEXT* meshes;
} XrSpatialComponentMesh2DListEXT;
Описание участников
-
type— это XrStructureType данной структуры. -
next— этоNULLили указатель на следующую структуру в цепочке структур. -
meshCount— это тип данныхuint32_t, описывающий количество элементов в массивеmeshes. -
meshes— это массив объектов XrSpatialMeshDataEXT .
Для запроса 2D-компонента сетки пространственных объектов в XrSpatialSnapshotEXT необходимо включить XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT в XrSpatialComponentDataQueryConditionEXT :: componentTypes и добавить XrSpatialComponentMesh2DListEXT в цепочку XrSpatialComponentDataQueryResultEXT :: next .
Если XrSpatialComponentMesh2DListEXT находится в цепочке XrSpatialComponentDataResultEXT :: next , но XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT не включен в XrSpatialComponentDataQueryConditionEXT :: componentTypes, среда выполнения должна возвращать XR_ERROR_VALIDATION_FAILURE из xrQuerySpatialComponentDataDataDataEXT , но XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT не включен в XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Если meshCount меньше, чем XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput , среда выполнения должна возвращать XR_ERROR_SIZE_INSUFFICIENT из xrQuerySpatialComponentDataEXT .
Для объекта XrSpatialMeshDataEXT, заполняемого средой выполнения в массиве meshes , значение XrSpatialBufferEXT :: bufferType для XrSpatialMeshDataEXT :: vertexBuffer должно быть XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT , а значение XrSpatialBufferEXT :: bufferType для XrSpatialMeshDataEXT :: indexBuffer должно быть XR_SPATIAL_BUFFER_TYPE_UINT16_EXT .
Допустимое использование (неявное)
- Расширение
XR_EXT_spatial_plane_trackingнеобходимо включить перед использованием XrSpatialComponentMesh2DListEXT. -
typeдолжен бытьXR_TYPE_SPATIAL_COMPONENT_MESH_2D_LIST_EXT -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. -
meshesдолжен представлять собой указатель на массив структурmeshCountXrSpatialMeshDataEXT. - Параметр
meshCountдолжен быть больше0
Конфигурация
Если для какой-либо возможности перечислен XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT в XrSpatialCapabilityComponentTypesEXT :: componentTypes , приложение может включить её, включив перечисление в список XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents производной структуры XrSpatialCapabilityConfigurationBaseHeaderEXT , поддерживающей этот компонент.
Для этого компонента не требуется включать какую-либо специальную конфигурацию в цепочку XrSpatialCapabilityConfigurationBaseHeaderEXT :: next .
Двумерный полигональный компонент
Данные компонентов
Структура XrSpatialPolygon2DDataEXT определяется следующим образом:
typedef struct XrSpatialPolygon2DDataEXT {
XrPosef origin;
XrSpatialBufferEXT vertexBuffer;
} XrSpatialPolygon2DDataEXT;
Описание участников
-
originпредставляет собой XrPosef, определяющий начало координат многоугольника. Все вершины многоугольника определяются относительно этого начала координат в плоскости XY. -
vertexBuffer— это объект типа XrSpatialBufferEXT , который предоставляет идентификатор буфера типаXR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXTи представляет собой буфер вершин объекта, на котором находится этот компонент. Вершины должны быть возвращены в порядке против часовой стрелки. Многоугольник, представленный этими вершинами, не должен быть самопересекающимся и может быть вогнутым.
XrSpatialBufferEXT :: bufferType для vertexBuffer должен быть XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT .
Допустимое использование (неявное)
- Расширение
XR_EXT_spatial_plane_trackingнеобходимо включить перед использованием XrSpatialPolygon2DDataEXT. -
vertexBufferдолжен быть допустимой структурой XrSpatialBufferEXT.
Структура списка компонентов для запроса данных
Структура XrSpatialComponentPolygon2DListEXT определяется следующим образом:
typedef struct XrSpatialComponentPolygon2DListEXT {
XrStructureType type;
void* next;
uint32_t polygonCount;
XrSpatialPolygon2DDataEXT* polygons;
} XrSpatialComponentPolygon2DListEXT;
Описание участников
-
type— это XrStructureType данной структуры. -
next— этоNULLили указатель на следующую структуру в цепочке структур. -
polygonCount— это тип данныхuint32_t, описывающий количество элементов в массивеpolygons. -
polygons— это массив объектов XrSpatialPolygon2DDataEXT .
Для запроса двумерной полигональной компоненты пространственных объектов в XrSpatialSnapshotEXT необходимо включить XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT в XrSpatialComponentDataQueryConditionEXT :: componentTypes и добавить XrSpatialComponentPolygon2DListEXT в цепочку XrSpatialComponentDataQueryResultEXT :: next .
Среда выполнения должна возвращать XR_ERROR_VALIDATION_FAILURE из xrQuerySpatialComponentDataEXT , если XrSpatialComponentPolygon2DListEXT находится в цепочке XrSpatialComponentDataQueryResultEXT :: next , но XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT не включен в XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Если polygonCount меньше, чем XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput , среда выполнения должна возвращать XR_ERROR_SIZE_INSUFFICIENT из xrQuerySpatialComponentDataEXT .
Допустимое использование (неявное)
- Расширение
XR_EXT_spatial_plane_trackingнеобходимо включить перед использованием XrSpatialComponentPolygon2DListEXT. -
typeдолжен бытьXR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXT -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. -
polygonsдолжен быть указателем на массив структурpolygonCountXrSpatialPolygon2DDataEXT. - Параметр
polygonCountдолжен быть больше0
Конфигурация
Если для какой-либо возможности перечислено значение XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT в структуре XrSpatialCapabilityComponentTypesEXT :: componentTypes , приложение может включить его, включив это перечисление в список XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents структуры, производной от XrSpatialCapabilityConfigurationBaseHeaderEXT , которая поддерживает этот компонент.
Для этого компонента не требуется включать какую-либо специальную конфигурацию в цепочку XrSpatialCapabilityConfigurationBaseHeaderEXT :: next .
Семантическая метка плоскости
Данные компонентов
typedef enum XrSpatialPlaneSemanticLabelEXT {
XR_SPATIAL_PLANE_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_FLOOR_EXT = 2,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_WALL_EXT = 3,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_CEILING_EXT = 4,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_TABLE_EXT = 5,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPlaneSemanticLabelEXT;
Перечисление XrSpatialPlaneSemanticLabelEXT описывает набор семантических меток для плоскостей.
Описание перечисления
XR_SPATIAL_PLANE_SEMANTIC_LABEL_UNCATEGORIZED_EXT
Программа выполнения не смогла классифицировать этот объект.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_FLOOR_EXT
Данный объект представляет собой пол.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_WALL_EXT
Объект представляет собой стену.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_CEILING_EXT
Данный объект представляет собой потолок.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_TABLE_EXT
Объект представляет собой таблицу.
Структура списка компонентов для запроса данных
Структура XrSpatialComponentPlaneSemanticLabelListEXT определяется следующим образом:
typedef struct XrSpatialComponentPlaneSemanticLabelListEXT {
XrStructureType type;
void* next;
uint32_t semanticLabelCount;
XrSpatialPlaneSemanticLabelEXT* semanticLabels;
} XrSpatialComponentPlaneSemanticLabelListEXT;
Описание участников
-
type— это XrStructureType данной структуры. -
next— этоNULLили указатель на следующую структуру в цепочке структур. -
semanticLabelCount— это типuint32_t, описывающий количество элементов в массивеsemanticLabels. -
semanticLabels— это массив объектов XrSpatialPlaneSemanticLabelEXT .
Для запроса компонента семантической метки плоскости пространственных объектов в XrSpatialSnapshotEXT необходимо включить XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT в XrSpatialComponentDataQueryConditionEXT :: componentTypes и добавить XrSpatialComponentPlaneSemanticLabelListEXT в цепочку XrSpatialComponentDataQueryResultEXT :: next .
Среда выполнения должна возвращать XR_ERROR_VALIDATION_FAILURE из xrQuerySpatialComponentDataEXT , если XrSpatialComponentPlaneSemanticLabelListEXT находится в следующей цепочке XrSpatialComponentDataQueryResultEXT :: next , но XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT не включен в XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Если semanticLabelCount меньше, чем XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput , среда выполнения должна возвращать XR_ERROR_SIZE_INSUFFICIENT из xrQuerySpatialComponentDataEXT .
Допустимое использование (неявное)
- Расширение
XR_EXT_spatial_plane_trackingнеобходимо включить перед использованием XrSpatialComponentPlaneSemanticLabelListEXT. -
typeдолжен бытьXR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXT -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. -
semanticLabelsдолжна быть указателем на массив значенийsemanticLabelCountXrSpatialPlaneSemanticLabelEXT. - Параметр
semanticLabelCountдолжен быть больше0
Конфигурация
Если для какой-либо возможности перечислено значение XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT в структуре XrSpatialCapabilityComponentTypesEXT :: componentTypes , приложение может включить его, указав это значение в списке XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents структуры, производной от XrSpatialCapabilityConfigurationBaseHeaderEXT , которая поддерживает этот компонент.
Для этого компонента не требуется включать какую-либо специальную конфигурацию в цепочку XrSpatialCapabilityConfigurationBaseHeaderEXT :: next .
Пример кода
Настройка функции отслеживания плоскости
Приведенный ниже пример кода демонстрирует, как настроить отслеживание плоскости при создании пространственного контекста.
// Check if plane tracking capability is supported
uint32_t capabilityCount;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0, &capabilityCount, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCount);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilityCount, &capabilityCount, capabilities.data()));
if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT) == capabilities.end()) {
return;
}
// Enumerate supported components for plane tracking capability
XrSpatialCapabilityComponentTypesEXT planeComponents{XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &planeComponents));
std::vector<XrSpatialComponentTypeEXT> planeCapabilityComponents(planeComponents.componentTypeCountOutput);
planeComponents.componentTypeCapacityInput = planeCapabilityComponents.size();
planeComponents.componentTypes = planeCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &planeComponents));
// Check if polygon 2D and plane semantic labels optional components are supported
const auto supportsComponent = [&planeCapabilityComponents](XrSpatialComponentTypeEXT component) {
return std::find(planeCapabilityComponents.begin(), planeCapabilityComponents.end(), component) != planeCapabilityComponents.end();
};
const bool supportsPolygon2DComponent = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT);
const bool supportsSemanticLabelComponent = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT);
// Create a spatial context
XrSpatialContextEXT spatialContext{};
// Enable the 2 guaranteed components of the plane tracking capability
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
};
// Optionally enable polygon2D if it is supported
if (supportsPolygon2DComponent) {
enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT);
}
// Optionally enable semantic labels if it is supported
if (supportsSemanticLabelComponent) {
enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT);
}
XrSpatialCapabilityConfigurationPlaneTrackingEXT planeConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT};
planeConfig.capability = XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT;
planeConfig.enabledComponentCount = enabledComponents.size();
planeConfig.enabledComponents = enabledComponents.data();
std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&planeConfig),
};
XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
XrFutureEXT createContextFuture;
CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo, &createContextFuture));
waitUntilReady(createContextFuture);
XrCreateSpatialContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture, &completion));
if (completion.futureResult != XR_SUCCESS) {
return;
}
spatialContext = completion.spatialContext;
// ...
// Discover entities with the spatial context
// ...
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
Обнаружение пространственных объектов и запрос данных компонентов.
Приведенный ниже пример кода демонстрирует, как обнаруживать пространственные объекты для контекста, настроенного с XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT , и запрашивать данные его компонентов.
XrFutureEXT future = XR_NULL_FUTURE_EXT;
// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
};
if (supportsPolygon2DComponent) {
snapshotComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT);
}
if (supportsSemanticLabelComponent) {
snapshotComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT);
}
auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
snapshotCreateInfo.componentTypes = snapshotComponents.data();
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));
waitUntilReady(future);
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
completionInfo.baseSpace = localSpace;
completionInfo.time = time;
completionInfo.future = future;
XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
if (completion.futureResult == XR_SUCCESS) {
// Query for the semantic label component data
XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypeCount = snapshotComponents.size();
queryCond.componentTypes = snapshotComponents.data();
XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));
std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
queryResult.entityIdCapacityInput = entityIds.size();
queryResult.entityIds = entityIds.data();
queryResult.entityStateCapacityInput = entityStates.size();
queryResult.entityStates = entityStates.data();
std::vector<XrSpatialBounded2DDataEXT> bounded2D(queryResult.entityIdCountOutput);
XrSpatialComponentBounded2DListEXT bounded2DList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT};
bounded2DList.boundCount = bounded2D.size();
bounded2DList.bounds = bounded2D.data();
queryResult.next = &bounded2DList;
std::vector<XrSpatialPolygon2DDataEXT> polygons;
XrSpatialComponentPolygon2DListEXT polygonList{XR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXT};
if (supportsPolygon2DComponent) {
polygons.resize(queryResult.entityIdCountOutput);
polygonList.polygonCount = polygons.size();
polygonList.polygons = polygons.data();
polygonList.next = queryResult.next;
queryResult.next = &polygonList;
}
std::vector<XrSpatialPlaneSemanticLabelEXT> semanticLabels;
XrSpatialComponentPlaneSemanticLabelListEXT semanticLabelsList{XR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXT};
if (supportsSemanticLabelComponent) {
semanticLabels.resize(queryResult.entityIdCountOutput);
semanticLabelsList.semanticLabelCount = semanticLabels.size();
semanticLabelsList.semanticLabels = semanticLabels.data();
semanticLabelsList.next = queryResult.next;
queryResult.next = &semanticLabelsList;
}
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));
for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
if (entityStates[i] != XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT) {
continue;
}
// 2D bounds for entity entityIds[i] is bounded2D[i].extents centered on bounded2D[i].center.
if (supportsPolygon2DComponent) {
// 2D polygon for entity entityIds[i] is the buffer represented by polygons[i].bufferId.
// Application uses flink:xrGetSpatialBufferVector2fEXT to get the buffer data.
}
if (supportsSemanticLabelComponent) {
// semantic label for entity entityIds[i] is semanticLabels[i].
}
}
CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
}
};
while (1) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
// Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
XrResult result = xrPollEvent(instance, &event);
if (result == XR_SUCCESS) {
switch (event.type) {
case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata =
*reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
// Discover spatial entities for the context that we received the "discovery
// recommended" event for.
discoverSpatialEntities(eventdata.spatialContext, time);
break;
}
}
}
// ...
// Finish frame loop
// ...
}
Новые сооружения
- XrSpatialCapabilityConfigurationPlanTrackingEXT
- XrSpatialPolygon2DDataEXT
Расширение XrSpatialComponentDataQueryResultEXT :
Новые перечисления
Новые константы перечислений
-
XR_EXT_SPATIAL_PLANE_TRACKING_EXTENSION_NAME -
XR_EXT_spatial_plane_tracking_SPEC_VERSION Расширение XrSpatialCapabilityEXT :
-
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT
-
Расширение XrSpatialComponentTypeEXT :
-
XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT -
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT -
XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT -
XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT
-
Расширение XrStructureType :
-
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT -
XR_TYPE_SPATIAL_COMPONENT_MESH_2D_LIST_EXT -
XR_TYPE_SPATIAL_COMPONENT_PLANE_ALIGNMENT_LIST_EXT -
XR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXT -
XR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXT
-
Проблемы
История версий
Редакция 1, 02.07.2024 (Нихав Джайн, Google)
- Первоначальное описание расширения