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 в следующей цепочке.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_spatial_discovery_boundsдолжно быть включено до использования XrSpatialBoundsSpherefANDROID. -
typeдолжно бытьXR_TYPE_SPATIAL_BOUNDS_SPHEREF_ANDROID -
nextдолжно бытьNULLили действительным указателем на следующую структуру в цепочке структур. -
spaceдолжен быть действительным идентификатором XrSpace.
Структура 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 в следующей цепочке.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_spatial_discovery_boundsдолжно быть включено до использования XrSpatialBoundsBoxfANDROID. -
typeдолжно бытьXR_TYPE_SPATIAL_BOUNDS_BOXF_ANDROID -
nextдолжно бытьNULLили действительным указателем на следующую структуру в цепочке структур. -
spaceдолжен быть действительным идентификатором XrSpace.
Структура 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.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_spatial_discovery_boundsдолжно быть включено до использования XrSpatialBoundsFrustumfANDROID. -
typeдолжно бытьXR_TYPE_SPATIAL_BOUNDS_FRUSTUMF_ANDROID -
nextдолжно бытьNULLили действительным указателем на следующую структуру в цепочке структур. -
spaceдолжен быть действительным идентификатором XrSpace.
Пример
В следующем коде показано, как использовать пространственные границы для фильтрации обнаружения пространственных объектов.
// 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));
Новые структуры
Расширение XrSpatialDiscoverySnapshotCreateInfoEXT :
Новые константы перечисления
XR_ANDROID_SPATIAL_DISCOVERY_BOUNDS_EXTENSION_NAMEXR_ANDROID_spatial_discovery_bounds_SPEC_VERSIONРасширение XrSpatialCapabilityFeatureEXT :
XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROIDXR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROIDXR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID
Расширение XrStructureType :
XR_TYPE_SPATIAL_BOUNDS_BOXF_ANDROIDXR_TYPE_SPATIAL_BOUNDS_FRUSTUMF_ANDROIDXR_TYPE_SPATIAL_BOUNDS_SPHEREF_ANDROID
Проблемы
Почему поддержка пространственных границ зависит от определения XrSpatialCapabilityFeatureEXT?
- Вопрос решен
- Ответ. Не все пространственные возможности поддерживают пространственные границы. Примером может служить гипотетический глобальный объект-контейнер, который не имеет собственного пространственного положения или границ, а лишь помогает собирать и упорядочивать другие объекты внутри него. Значения XrSpatialCapabilityFeatureEXT, перечисленные в функции, помогают приложению определить, поддерживается ли фильтрация пространственных границ.
История версий
Версия 1, 3 мая 2025 г. (Нихав Джайн, Google)
- Описание расширения