XR_ANDROID_spatial_discovery_bounds

String Nama

XR_ANDROID_spatial_discovery_bounds

Jenis Ekstensi

Ekstensi instance

Nomor Ekstensi Terdaftar

762

Revisi

1

Status Ratifikasi

Belum diratifikasi

Dependensi Ekstensi dan Versi

XR_EXT_spatial_entity

Kontributor

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

Ringkasan

Ekstensi ini menambahkan definisi untuk batas spasial yang memungkinkan aplikasi memfilter entity spasial yang ditemukan saat memanggil xrCreateSpatialDiscoverySnapshotAsyncEXT .

Batas Spasial

Struktur XrSpatialBoundsSpherefANDROID didefinisikan sebagai:

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

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur.
  • space adalah XrSpace yang menentukan pose untuk batas.
  • time adalah XrTime tempat pose untuk batas ditentukan.
  • sphere adalah XrSpheref yang menjelaskan volume bola tempat runtime harus membatasi penemuan entity spasialnya.

Kemampuan spasial yang mendukung XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID (seperti yang disebutkan oleh xrEnumerateSpatialCapabilityFeaturesEXT ) memungkinkan aplikasi membatasi penemuan ke entity spasial yang lokasi atau batasnya berada di dalam atau berpotongan dengan sphere dengan merantai XrSpatialBoundsSpherefANDROID ke XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Untuk snapshot penemuan yang kemampuan yang berlaku mendukung XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID , jika struktur ini ada dalam rantai next, runtime tidak boleh menyertakan entity spasial yang lokasi atau batasnya sepenuhnya berada di luar sphere .

Perlu diperhatikan bahwa penyertaan XrSpatialBoundsSpherefANDROID dalam rantai berikutnya dari XrSpatialDiscoverySnapshotCreateInfoEXT bertindak sebagai kondisi 'AND' dengan filter lain yang disediakan. Entity yang berasal dari kemampuan spasial yang tidak mendukung XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID tidak boleh disertakan dalam snapshot penemuan. Perilaku ini berbeda dengan spesifikasi OpenXR lainnya, yang mengabaikan struktur yang tidak dikenali atau tidak didukung dalam rantai pointer berikutnya oleh runtime. Selain itu, seperti yang dijelaskan di bagian Keunikan Struktur Rantai Berikutnya, runtime hanya akan memproses kemunculan pertama struktur XrSpatialBoundsSpherefANDROID di rantai berikutnya.

Penggunaan yang Valid (Implisit)

Struktur XrSpatialBoundsBoxfANDROID didefinisikan sebagai:

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

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur.
  • space adalah XrSpace yang menentukan pose untuk batas.
  • time adalah XrTime tempat pose untuk batas ditentukan.
  • box adalah XrBoxf yang menjelaskan volume kotak tempat runtime harus membatasi penemuan entity spasialnya.

Kemampuan spasial yang mendukung XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID (seperti yang disebutkan oleh xrEnumerateSpatialCapabilityFeaturesEXT ) memungkinkan aplikasi membatasi penemuan ke entity spasial yang lokasi atau batasnya berada di dalam atau berpotongan dengan box dengan merantai XrSpatialBoundsBoxfANDROID ke XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Untuk snapshot penemuan yang kemampuan yang berlaku mendukung XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID , jika struktur ini ada dalam rantai next, runtime tidak boleh menyertakan entity spasial yang lokasi atau batasnya sepenuhnya berada di luar box .

Perlu diperhatikan bahwa penyertaan XrSpatialBoundsBoxfANDROID dalam rantai berikutnya dari XrSpatialDiscoverySnapshotCreateInfoEXT bertindak sebagai kondisi 'AND' dengan filter lain yang disediakan. Entity yang berasal dari kemampuan spasial yang tidak mendukung XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID tidak boleh disertakan dalam snapshot penemuan. Perilaku ini berbeda dengan spesifikasi OpenXR lainnya, yang mengabaikan struktur yang tidak dikenali atau tidak didukung dalam rantai pointer berikutnya oleh runtime. Selain itu, seperti yang dijelaskan di bagian Keunikan Struktur Next Chain, runtime hanya akan memproses kemunculan pertama struktur XrSpatialBoundsBoxfANDROID di next chain.

Penggunaan yang Valid (Implisit)

Struktur XrSpatialBoundsFrustumfANDROID didefinisikan sebagai:

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

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur.
  • space adalah XrSpace yang menentukan pose untuk batas.
  • time adalah XrTime tempat pose untuk batas ditentukan.
  • frustum adalah XrFrustumf yang menjelaskan volume frustum tempat runtime harus membatasi penemuan entity spasialnya.

Kemampuan spasial yang mendukung XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID (seperti yang disebutkan oleh xrEnumerateSpatialCapabilityFeaturesEXT ) memungkinkan aplikasi membatasi penemuan ke entity spasial yang lokasi atau batasnya berada di dalam atau berpotongan dengan frustum dengan merantai XrSpatialBoundsFrustumfANDROID ke XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Untuk snapshot penemuan yang kemampuan yang berlaku mendukung XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID , jika struktur ini ada dalam rantai next, runtime tidak boleh menyertakan entity spasial yang lokasi atau batasnya sepenuhnya berada di luar frustum .

Perlu diperhatikan bahwa penyertaan XrSpatialBoundsFrustumfANDROID dalam rantai berikutnya dari XrSpatialDiscoverySnapshotCreateInfoEXT bertindak sebagai kondisi 'AND' dengan filter lain yang disediakan. Entity yang berasal dari kemampuan spasial yang tidak mendukung XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID tidak boleh disertakan dalam snapshot penemuan. Perilaku ini berbeda dengan spesifikasi OpenXR lainnya, yang mengabaikan struktur yang tidak dikenali atau tidak didukung dalam rantai pointer berikutnya oleh runtime. Selain itu, seperti yang dijelaskan di bagian Keunikan Struktur Next Chain, runtime hanya akan memproses kemunculan pertama struktur XrSpatialBoundsFrustumfANDROID di next chain.

Penggunaan yang Valid (Implisit)

Contoh

Kode berikut menunjukkan cara menggunakan batas spasial untuk memfilter penemuan entity spasial.

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

Struktur Baru

Konstanta Enum Baru

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

    • XR_TYPE_SPATIAL_BOUNDS_BOXF_ANDROID
    • XR_TYPE_SPATIAL_BOUNDS_FRUSTUMF_ANDROID
    • XR_TYPE_SPATIAL_BOUNDS_SPHEREF_ANDROID

Masalah

  • Mengapa dukungan untuk batas spasial bergantung pada definisi XrSpatialCapabilityFeatureEXT?

    • Selesai
    • Jawaban: Tidak semua kemampuan spasial dapat mendukung batas spasial. Contohnya adalah entitas penampung global hipotetis yang tidak memiliki posisi atau batas spasialnya sendiri, tetapi hanya membantu mengumpulkan dan mengatur entitas lain di dalamnya. Nilai XrSpatialCapabilityFeatureEXT yang dihitung oleh kemampuan membantu menginformasikan aplikasi tentang dukungan untuk pemfilteran batas spasial.

Riwayat Versi

  • Revisi 1, 03-05-2025 (Nihav Jain, Google)

    • Deskripsi ekstensi awal