XR_ANDROID_spatial_discovery_bounds

Name String

XR_ANDROID_spatial_discovery_bounds

Tipo di estensione

Estensione dell'istanza

Numero di interno registrato

762

Revisione

1

Stato della ratifica

Non ratificato

Dipendenze di estensioni e versioni

XR_EXT_spatial_entity

Collaboratori

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

Panoramica

Questa estensione aggiunge definizioni per i limiti spaziali che consentono alle applicazioni di filtrare le entità spaziali rilevate quando chiamano xrCreateSpatialDiscoverySnapshotAsyncEXT .

Limiti spaziali

La struttura XrSpatialBoundsSpherefANDROID è definita come:

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

Descrizioni dei membri

  • type è l'XrStructureType di questa struttura.
  • next è NULL o un puntatore alla struttura successiva in una catena di strutture.
  • space è l'XrSpace in cui sono definite le posizioni per i limiti.
  • time è un XrTime in cui sono definite le posizioni per i limiti.
  • sphere è un XrSpheref che descrive il volume sferico all'interno del quale il runtime deve limitare il rilevamento delle entità spaziali.

Le funzionalità spaziali che supportano XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID (come elencate da xrEnumerateSpatialCapabilityFeaturesEXT) consentono all'applicazione di limitare il rilevamento alle entità spaziali la cui posizione o i cui limiti si trovano all'interno o si intersecano con sphere concatenando XrSpatialBoundsSpherefANDROID a XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Per uno snapshot di rilevamento in cui la funzionalità applicabile supporta XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID , se questa struttura è presente nella catena next, il runtime non deve includere entità spaziali la cui posizione o i cui limiti sono completamente al di fuori di sphere .

È importante notare che l'inclusione di XrSpatialBoundsSpherefANDROID nella catena successiva di XrSpatialDiscoverySnapshotCreateInfoEXT agisce come una condizione "AND" con gli altri filtri forniti. Le entità provenienti da funzionalità spaziali che non supportano XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID non devono essere incluse nello snapshot di discovery. Questo comportamento è diverso dal resto della specifica OpenXR, in cui le strutture non riconosciute o non supportate nella catena di puntatori successiva vengono ignorate dal runtime. Inoltre, come descritto nella sezione Unicità della struttura della catena successiva, il runtime elaborerà solo la prima occorrenza della struttura XrSpatialBoundsSpherefANDROID nella catena successiva.

Utilizzo valido (implicito)

La struttura XrSpatialBoundsBoxfANDROID è definita come:

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

Descrizioni dei membri

  • type è l'XrStructureType di questa struttura.
  • next è NULL o un puntatore alla struttura successiva in una catena di strutture.
  • space è l'XrSpace in cui sono definite le posizioni per i limiti.
  • time è un XrTime in cui sono definite le posizioni per i limiti.
  • box è un XrBoxf che descrive il volume del box entro il quale il runtime deve limitare il rilevamento delle entità spaziali.

Le funzionalità spaziali che supportano XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID (come enumerate da xrEnumerateSpatialCapabilityFeaturesEXT) consentono all'applicazione di limitare il rilevamento alle entità spaziali la cui posizione o i cui limiti si trovano all'interno o si intersecano con box concatenando XrSpatialBoundsBoxfANDROID a XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Per uno snapshot di rilevamento in cui la funzionalità applicabile supporta XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID , se questa struttura è presente nella catena next, il runtime non deve includere entità spaziali la cui posizione o i cui limiti sono completamente al di fuori di box .

È importante notare che l'inclusione di XrSpatialBoundsBoxfANDROID nella catena successiva di XrSpatialDiscoverySnapshotCreateInfoEXT agisce come una condizione "AND" con gli altri filtri forniti. Le entità provenienti da funzionalità spaziali che non supportano XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID non devono essere incluse nello snapshot di discovery. Questo comportamento è diverso dal resto della specifica OpenXR, in cui le strutture non riconosciute o non supportate nella catena di puntatori successiva vengono ignorate dal runtime. Inoltre, come descritto nella sezione Unicità della struttura della catena successiva, il runtime elaborerà solo la prima occorrenza della struttura XrSpatialBoundsBoxfANDROID nella catena successiva.

Utilizzo valido (implicito)

La struttura XrSpatialBoundsFrustumfANDROID è definita come:

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

Descrizioni dei membri

  • type è l'XrStructureType di questa struttura.
  • next è NULL o un puntatore alla struttura successiva in una catena di strutture.
  • space è l'XrSpace in cui sono definite le posizioni per i limiti.
  • time è un XrTime in cui sono definite le posizioni per i limiti.
  • frustum è un XrFrustumf che descrive il volume del frustum entro il quale il runtime deve limitare il rilevamento delle entità spaziali.

Le funzionalità spaziali che supportano XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID (come enumerate da xrEnumerateSpatialCapabilityFeaturesEXT) consentono all'applicazione di limitare il rilevamento alle entità spaziali la cui posizione o i cui limiti si trovano all'interno o si intersecano con frustum concatenando XrSpatialBoundsFrustumfANDROID a XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Per uno snapshot di rilevamento in cui la funzionalità applicabile supporta XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID , se questa struttura è presente nella catena next, il runtime non deve includere entità spaziali la cui posizione o i cui limiti sono completamente al di fuori di frustum .

È importante notare che l'inclusione di XrSpatialBoundsFrustumfANDROID nella catena successiva di XrSpatialDiscoverySnapshotCreateInfoEXT funge da condizione "AND" con gli altri filtri forniti. Le entità provenienti da funzionalità spaziali che non supportano XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID non devono essere incluse nello snapshot di discovery. Questo comportamento è diverso dal resto della specifica OpenXR, in cui le strutture non riconosciute o non supportate nella catena di puntatori successiva vengono ignorate dal runtime. Inoltre, come descritto nella sezione Unicità della struttura della catena successiva, il runtime elaborerà solo la prima occorrenza della struttura XrSpatialBoundsFrustumfANDROID nella catena successiva.

Utilizzo valido (implicito)

Esempio

Il codice seguente mostra come utilizzare i limiti spaziali per filtrare il rilevamento delle entità spaziali.

// 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));

Nuove strutture

Nuove costanti enum

  • XR_ANDROID_SPATIAL_DISCOVERY_BOUNDS_EXTENSION_NAME
  • XR_ANDROID_spatial_discovery_bounds_SPEC_VERSION
  • Estensione di 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
  • Estensione di XrStructureType :

    • XR_TYPE_SPATIAL_BOUNDS_BOXF_ANDROID
    • XR_TYPE_SPATIAL_BOUNDS_FRUSTUMF_ANDROID
    • XR_TYPE_SPATIAL_BOUNDS_SPHEREF_ANDROID

Problemi

  • Perché il supporto dei limiti spaziali dipende da una definizione XrSpatialCapabilityFeatureEXT?

    • Risolto
    • Risposta: non tutte le funzionalità spaziali sono in grado di supportare i limiti spaziali. Un esempio è un'ipotetica entità contenitore globale che non ha una posizione o dei limiti spaziali propri, ma aiuta semplicemente a raccogliere e organizzare le altre entità al suo interno. I valori XrSpatialCapabilityFeatureEXT enumerati dalla funzionalità aiutano l'app a capire se è supportato il filtro dei limiti spaziali.

Cronologia delle versioni

  • Revisione 1, 03/05/2025 (Nihav Jain, Google)

    • Descrizione iniziale dell'estensione