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_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_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_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_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_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
  // ...
}

Новые сооружения

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

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

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

    • Первоначальное описание расширения