XR_ANDROID_spatial_discovery_bounds
Name String
XR_ANDROID_spatial_discovery_bounds
Tipo de extensión
Extensión de instancia
Número de extensión registrado
762
Revisión
1
Estado de ratificación
No ratificado
Dependencias de extensiones y versiones
XR_EXT_spatial_entity
Colaboradores
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
Descripción general
Esta extensión agrega definiciones para los límites espaciales que permiten que las aplicaciones filtren las entidades espaciales descubiertas cuando se llama a xrCreateSpatialDiscoverySnapshotAsyncEXT .
Límites espaciales
La estructura XrSpatialBoundsSpherefANDROID se define de la siguiente manera:
typedef struct XrSpatialBoundsSpherefANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrSpheref sphere;
} XrSpatialBoundsSpherefANDROID;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.spacees el XrSpace en el que se definen las poses de los límites.timees unXrTimeen el que se definen las poses de los límites.spherees un XrSpheref que describe el volumen esférico dentro del cual el entorno de ejecución debe restringir su descubrimiento de entidades espaciales.
Las capacidades espaciales que admiten XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID (como se enumera en xrEnumerateSpatialCapabilityFeaturesEXT) permiten que la aplicación restrinja el descubrimiento a entidades espaciales cuya ubicación o límites estén dentro de sphere o se crucen con él encadenando XrSpatialBoundsSpherefANDROID a XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Para una instantánea de descubrimiento en la que la capacidad aplicable admita XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID , si esta estructura está presente en la cadena next, el entorno de ejecución no debe incluir ninguna entidad espacial cuya ubicación o límites estén completamente fuera de sphere .
Es importante tener en cuenta que la inclusión de XrSpatialBoundsSpherefANDROID en la siguiente cadena de XrSpatialDiscoverySnapshotCreateInfoEXT actúa como una condición "Y" con los otros filtros proporcionados. Las entidades que provienen de funciones espaciales que no admiten XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID no deben incluirse en la instantánea de descubrimiento. Este comportamiento es diferente del resto de la especificación de OpenXR, en la que el entorno de ejecución ignora las estructuras no reconocidas o no compatibles en la siguiente cadena de punteros. Además, como se describe en la sección Unicidad de la estructura de la cadena siguiente, el entorno de ejecución solo procesará la primera instancia de la estructura XrSpatialBoundsSpherefANDROID en la cadena siguiente.
Uso válido (implícito)
- La extensión
XR_ANDROID_spatial_discovery_boundsdebe estar habilitada antes de usar XrSpatialBoundsSpherefANDROID. -
typedebe serXR_TYPE_SPATIAL_BOUNDS_SPHEREF_ANDROID -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras -
spacedebe ser un controlador XrSpace válido.
La estructura XrSpatialBoundsBoxfANDROID se define de la siguiente manera:
typedef struct XrSpatialBoundsBoxfANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrBoxf box;
} XrSpatialBoundsBoxfANDROID;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.spacees el XrSpace en el que se definen las poses de los límites.timees unXrTimeen el que se definen las poses de los límites.boxes un XrBoxf que describe el volumen de la caja dentro del cual el entorno de ejecución debe restringir su descubrimiento de entidades espaciales.
Las capacidades espaciales que admiten XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID (como se enumera en xrEnumerateSpatialCapabilityFeaturesEXT) permiten que la aplicación restrinja el descubrimiento a entidades espaciales cuya ubicación o límites estén dentro de box o se crucen con él encadenando XrSpatialBoundsBoxfANDROID a XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Para una instantánea de descubrimiento en la que la capacidad aplicable admita XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID , si esta estructura está presente en la cadena next, el entorno de ejecución no debe incluir ninguna entidad espacial cuya ubicación o límites estén completamente fuera de box .
Es importante tener en cuenta que la inclusión de XrSpatialBoundsBoxfANDROID en la siguiente cadena de XrSpatialDiscoverySnapshotCreateInfoEXT actúa como una condición "Y" con los otros filtros proporcionados. Las entidades que provienen de funciones espaciales que no admiten XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID no deben incluirse en la instantánea de descubrimiento. Este comportamiento es diferente del resto de la especificación de OpenXR, en la que el entorno de ejecución ignora las estructuras no reconocidas o no compatibles en la siguiente cadena de punteros. Además, como se describe en la sección Unicidad de la estructura de la cadena siguiente, el entorno de ejecución solo procesará la primera instancia de la estructura XrSpatialBoundsBoxfANDROID en la cadena siguiente.
Uso válido (implícito)
- La extensión
XR_ANDROID_spatial_discovery_boundsdebe estar habilitada antes de usar XrSpatialBoundsBoxfANDROID. -
typedebe serXR_TYPE_SPATIAL_BOUNDS_BOXF_ANDROID -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras -
spacedebe ser un controlador XrSpace válido.
La estructura XrSpatialBoundsFrustumfANDROID se define de la siguiente manera:
typedef struct XrSpatialBoundsFrustumfANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrFrustumf frustum;
} XrSpatialBoundsFrustumfANDROID;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.spacees el XrSpace en el que se definen las poses de los límites.timees unXrTimeen el que se definen las poses de los límites.frustumes un XrFrustumf que describe el volumen de tronco dentro del cual el entorno de ejecución debe restringir su descubrimiento de entidades espaciales.
Las capacidades espaciales que admiten XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID (como se enumeran en xrEnumerateSpatialCapabilityFeaturesEXT) permiten que la aplicación restrinja el descubrimiento a entidades espaciales cuya ubicación o límites estén dentro de frustum o se crucen con él encadenando XrSpatialBoundsFrustumfANDROID a XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Para una instantánea de descubrimiento en la que la capacidad aplicable admita XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID , si esta estructura está presente en la cadena next, el entorno de ejecución no debe incluir ninguna entidad espacial cuya ubicación o límites estén completamente fuera de frustum .
Es importante tener en cuenta que la inclusión de XrSpatialBoundsFrustumfANDROID en la siguiente cadena de XrSpatialDiscoverySnapshotCreateInfoEXT actúa como una condición "Y" con los otros filtros proporcionados. Las entidades que provienen de funciones espaciales que no admiten XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID no deben incluirse en la instantánea de descubrimiento. Este comportamiento es diferente del resto de la especificación de OpenXR, en la que el entorno de ejecución ignora las estructuras no reconocidas o no compatibles en la siguiente cadena de punteros. Además, como se describe en la sección Unicidad de la estructura de la cadena siguiente, el entorno de ejecución solo procesará la primera instancia de la estructura XrSpatialBoundsFrustumfANDROID en la cadena siguiente.
Uso válido (implícito)
- La extensión
XR_ANDROID_spatial_discovery_boundsdebe estar habilitada antes de usar XrSpatialBoundsFrustumfANDROID. -
typedebe serXR_TYPE_SPATIAL_BOUNDS_FRUSTUMF_ANDROID -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras -
spacedebe ser un controlador XrSpace válido.
Ejemplo
En el siguiente código, se muestra cómo usar los límites espaciales para filtrar el descubrimiento de entidades espaciales.
// 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));
Estructuras nuevas
Extiende XrSpatialDiscoverySnapshotCreateInfoEXT :
Nuevas constantes de enum
XR_ANDROID_SPATIAL_DISCOVERY_BOUNDS_EXTENSION_NAMEXR_ANDROID_spatial_discovery_bounds_SPEC_VERSIONExtensión de XrSpatialCapabilityFeatureEXT :
XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROIDXR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROIDXR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID
Extiende XrStructureType :
XR_TYPE_SPATIAL_BOUNDS_BOXF_ANDROIDXR_TYPE_SPATIAL_BOUNDS_FRUSTUMF_ANDROIDXR_TYPE_SPATIAL_BOUNDS_SPHEREF_ANDROID
Problemas
¿Por qué la compatibilidad con los límites espaciales depende de una definición de XrSpatialCapabilityFeatureEXT?
- Resuelto
- Respuesta: No todas las funciones espaciales pueden admitir límites espaciales. Un ejemplo de esto es una entidad de contenedor global hipotética que no tiene ninguna posición espacial ni límites propios, sino que simplemente ayuda a recopilar y organizar las otras entidades que contiene. Los valores de XrSpatialCapabilityFeatureEXT enumerados por la función ayudan a informar a la app sobre la compatibilidad con el filtrado de límites espaciales.
Historial de versiones
Revisión 1, 3 de mayo de 2025 (Nihav Jain, Google)
- Descripción inicial de la extensión