XR_ANDROID_spatial_discovery_bounds

Name String

XR_ANDROID_spatial_discovery_bounds

Тип расширения

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

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

762

Revision

1

Статус ратификации

Не ратифицировано

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

XR_EXT_spatial_entity

Авторы

Нихав Джайн (Nihav Jain), Google
Натали Флери (Natalie Fleury), Meta
Юичи Тагучи (Yuichi Taguchi), Meta
Инь Ли (Yin Li), Microsoft
Рон Бессемс (Ron Bessems), Meta
Картик Кадаппан (Karthik Kadappan), Magic Leap
Джимми Алампарамбил (Jimmy Alamparambil), ByteDance
Чжипэн Лю (Zhipeng Liu), ByteDance
Цзюнь Янь (Jun Yan), ByteDance

Обзор

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

Пространственные границы

Структура XrSpatialBoundsSpherefANDROID определяется следующим образом:

typedef struct XrSpatialBoundsSpherefANDROID {
    XrStructureType    type;
    const void*        next;
    XrSpace            space;
    XrTime             time;
    XrSpheref          sphere;
} XrSpatialBoundsSpherefANDROID;

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

  • type – это XrStructureType этой структуры.
  • next – это NULL или указатель на следующую структуру в цепочке.
  • space – это XrSpace, в котором определены все позы для границ.
  • time – это XrTime, в котором определены позы для границ.
  • sphere – это XrSpheref, описывающий сферический объем, в пределах которого среда выполнения должна ограничить обнаружение пространственных объектов.

Пространственные возможности, поддерживающие XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID (перечисленные в xrEnumerateSpatialCapabilityFeaturesEXT), позволяют приложению ограничить обнаружение пространственными объектами, местоположение или границы которых находятся в пределах sphere или пересекаются с ним. Для этого нужно связать XrSpatialBoundsSpherefANDROID с XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Для снимка обнаружения, в котором применимая возможность поддерживает XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID, если эта структура присутствует в цепочке next, среда выполнения не должна включать пространственные объекты, местоположение или границы которых полностью находятся за пределами sphere .

Важно отметить, что включение XrSpatialBoundsSpherefANDROID в следующую цепочку XrSpatialDiscoverySnapshotCreateInfoEXT действует как условие И с другими предоставленными фильтрами. Объекты, полученные с помощью пространственных возможностей, которые не поддерживают XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID, не должны включаться в снимок обнаружения. Это отличается от остальной спецификации OpenXR, где нераспознанные или неподдерживаемые структуры в следующей цепочке указателей игнорируются средой выполнения. Кроме того, как описано в разделе Уникальность структуры следующей цепочки, среда выполнения обработает только первое вхождение структуры XrSpatialBoundsSpherefANDROID в следующей цепочке.

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

Структура XrSpatialBoundsBoxfANDROID определяется следующим образом:

typedef struct XrSpatialBoundsBoxfANDROID {
    XrStructureType    type;
    const void*        next;
    XrSpace            space;
    XrTime             time;
    XrBoxf             box;
} XrSpatialBoundsBoxfANDROID;

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

  • type – это XrStructureType этой структуры.
  • next – это NULL или указатель на следующую структуру в цепочке.
  • space – это XrSpace, в котором определены все позы для границ.
  • time – это XrTime, в котором определены позы для границ.
  • box – это XrBoxf, описывающий объем параллелепипеда, в пределах которого среда выполнения должна ограничить обнаружение пространственных объектов.

Пространственные возможности, поддерживающие XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID (перечисленные в xrEnumerateSpatialCapabilityFeaturesEXT), позволяют приложению ограничить обнаружение пространственными объектами, местоположение или границы которых находятся в пределах box или пересекаются с ним. Для этого нужно связать XrSpatialBoundsBoxfANDROID с XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Для снимка обнаружения, в котором применимая возможность поддерживает XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID, если эта структура присутствует в цепочке next, среда выполнения не должна включать пространственные объекты, местоположение или границы которых полностью находятся за пределами box .

Важно отметить, что включение XrSpatialBoundsBoxfANDROID в следующую цепочку XrSpatialDiscoverySnapshotCreateInfoEXT действует как условие "И" с другими предоставленными фильтрами. Объекты, полученные с помощью пространственных возможностей, которые не поддерживают XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID, не должны включаться в снимок обнаружения. Это отличается от остальной спецификации OpenXR, где нераспознанные или неподдерживаемые структуры в следующей цепочке указателей игнорируются средой выполнения. Кроме того, как описано в разделе Уникальность структуры следующей цепочки, среда выполнения будет обрабатывать только первое вхождение структуры XrSpatialBoundsBoxfANDROID в следующей цепочке.

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

Структура XrSpatialBoundsFrustumfANDROID определяется следующим образом:

typedef struct XrSpatialBoundsFrustumfANDROID {
    XrStructureType    type;
    const void*        next;
    XrSpace            space;
    XrTime             time;
    XrFrustumf         frustum;
} XrSpatialBoundsFrustumfANDROID;

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

  • type – это XrStructureType этой структуры.
  • next – это NULL или указатель на следующую структуру в цепочке.
  • space – это XrSpace, в котором определены все позы для границ.
  • time – это XrTime, в котором определены позы для границ.
  • frustum – это XrFrustumf, описывающий объем усеченной пирамиды, в пределах которого среда выполнения должна ограничить обнаружение пространственных объектов.

Пространственные возможности, поддерживающие XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID (перечисленные в xrEnumerateSpatialCapabilityFeaturesEXT), позволяют приложению ограничить обнаружение пространственными объектами, местоположение или границы которых находятся внутри frustum или пересекаются с ним. Для этого нужно связать XrSpatialBoundsFrustumfANDROID с XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Для снимка обнаружения, в котором применимая возможность поддерживает XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID, если эта структура присутствует в цепочке next, среда выполнения не должна включать пространственные объекты, местоположение или границы которых полностью находятся за пределами frustum .

Важно отметить, что включение XrSpatialBoundsFrustumfANDROID в следующую цепочку XrSpatialDiscoverySnapshotCreateInfoEXT действует как условие И с другими предоставленными фильтрами. Объекты, полученные с помощью пространственных возможностей, которые не поддерживают XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID, не должны включаться в снимок обнаружения. Это отличается от остальной спецификации OpenXR, где нераспознанные или неподдерживаемые структуры в следующей цепочке указателей игнорируются средой выполнения. Кроме того, как описано в разделе Уникальность структуры Next Chain, среда выполнения обработает только первое вхождение структуры XrSpatialBoundsFrustumfANDROID в Next Chain.

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

Пример

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

// previously initialized & configured with the XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT capability.
XrSpatialContextEXT spatialContext;

// Enumerate supported features for XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT capability
uint32_t featureCount = 0;
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, 0, &featureCount, nullptr));
std::vector<XrSpatialCapabilityFeatureEXT> fooFeatures(featureCount);
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, featureCount, &featureCount, fooFeatures.data()));

// Check if spatial sphere bounds filter is supported
const auto supportsFeature = [&fooFeatures](XrSpatialCapabilityFeatureEXT feature) {
  return std::find(fooFeatures.begin(), fooFeatures.end(), feature) != fooFeatures.end();
};

const bool supportsSphereBoundsFilter = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID);

// We want to look for entities in a sphere around the head with a radius of 2m.
XrSpatialBoundsSpherefANDROID sphereBounds {
  .type = XR_TYPE_SPATIAL_BOUNDS_SPHEREF_ANDROID,
  .space = viewSpace,
  .time = predictedDisplayTime,
  .sphere = {
    .center = {
      .orientation = {
        .w = 1.0f,
      },
    },
    .radius = 2.0f,
  },
};

// We want to look for entities that have the following components.
std::array<XrSpatialComponentTypeEXT, 1> snapshotComponents{XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT};

XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{
  .type = XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT,
  .next = supportsSphereBoundsFilter ? &sphereBounds : nullptr,
  .componentTypeCount = snapshotComponents.size(),
  .componentTypes = snapshotComponents.data(),
};

XrFutureEXT future = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));

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

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

  • XR_ANDROID_SPATIAL_DISCOVERY_BOUNDS_EXTENSION_NAME
  • XR_ANDROID_spatial_discovery_bounds_SPEC_VERSION
  • Расширение XrSpatialCapabilityFeatureEXT :

    • XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID
    • XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID
    • XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID
  • Расширение XrStructureType :

    • XR_TYPE_SPATIAL_BOUNDS_BOXF_ANDROID
    • XR_TYPE_SPATIAL_BOUNDS_FRUSTUMF_ANDROID
    • XR_TYPE_SPATIAL_BOUNDS_SPHEREF_ANDROID

Проблемы

  • Почему поддержка пространственных границ зависит от определения XrSpatialCapabilityFeatureEXT?

    • Вопрос решен
    • Ответ. Не все пространственные возможности поддерживают пространственные границы. Примером может служить гипотетический глобальный объект-контейнер, который не имеет собственного пространственного положения или границ, а лишь помогает собирать и упорядочивать другие объекты внутри него. Значения XrSpatialCapabilityFeatureEXT, перечисленные в функции, помогают приложению определить, поддерживается ли фильтрация пространственных границ.

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

  • Версия 1, 3 мая 2025 г. (Нихав Джайн, Google)

    • Описание расширения