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

  • type es el XrStructureType de esta estructura.
  • next es NULL o un puntero a la siguiente estructura en una cadena de estructuras.
  • space es el XrSpace en el que se definen las poses de los límites.
  • time es un XrTime en el que se definen las poses de los límites.
  • sphere es 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 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

  • type es el XrStructureType de esta estructura.
  • next es NULL o un puntero a la siguiente estructura en una cadena de estructuras.
  • space es el XrSpace en el que se definen las poses de los límites.
  • time es un XrTime en el que se definen las poses de los límites.
  • box es 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 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

  • type es el XrStructureType de esta estructura.
  • next es NULL o un puntero a la siguiente estructura en una cadena de estructuras.
  • space es el XrSpace en el que se definen las poses de los límites.
  • time es un XrTime en el que se definen las poses de los límites.
  • frustum es 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)

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

Nuevas constantes de enum

  • XR_ANDROID_SPATIAL_DISCOVERY_BOUNDS_EXTENSION_NAME
  • XR_ANDROID_spatial_discovery_bounds_SPEC_VERSION
  • Extensión de 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
  • Extiende XrStructureType :

    • XR_TYPE_SPATIAL_BOUNDS_BOXF_ANDROID
    • XR_TYPE_SPATIAL_BOUNDS_FRUSTUMF_ANDROID
    • XR_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