XR_EXT_spatial_object_tracking

String Nama

XR_EXT_spatial_object_tracking

Jenis Ekstensi

Ekstensi instance

Nomor Ekstensi Terdaftar

745

Revisi

1

Status Ratifikasi

Belum diratifikasi

Dependensi Ekstensi dan Versi

XR_EXT_spatial_entity

Status IP

Tidak ada klaim kekayaan intelektual yang diketahui.

Kontributor

Nihav Jain, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Ron Bessems, Meta
Yin Li, Microsoft
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
Jun Yan, ByteDance
Andy Biar, Unity Technologies
Rebecca Nordhauser, Unity Technologies

Ringkasan

Ekstensi ini dibuat berdasarkan XR_EXT_spatial_entity dan menentukan kemampuan spasial untuk melacak sekumpulan objek yang telah ditentukan tanpa memerlukan set data input dari aplikasi.

Dukungan Runtime

Jika runtime mendukung pelacakan objek, runtime harus menunjukkan hal ini dengan menghitung XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT di xrEnumerateSpatialCapabilitiesEXT .

Konfigurasi

Struktur XrSpatialCapabilityConfigurationObjectTrackingEXT didefinisikan sebagai:

typedef struct XrSpatialCapabilityConfigurationObjectTrackingEXT {
    XrStructureType                     type;
    const void*                         next;
    XrSpatialCapabilityEXT              capability;
    uint32_t                            enabledComponentCount;
    const XrSpatialComponentTypeEXT*    enabledComponents;
} XrSpatialCapabilityConfigurationObjectTrackingEXT;

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur.
  • capability adalah XrSpatialCapabilityEXT dan harus berupa XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT .
  • enabledComponentCount adalah uint32_t yang menjelaskan jumlah elemen dalam array enabledComponents.
  • enabledComponents adalah pointer ke array XrSpatialComponentTypeEXT .

Aplikasi dapat mengaktifkan kemampuan spasial XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT dengan menambahkan pointer ke struktur XrSpatialCapabilityConfigurationObjectTrackingEXT di XrSpatialContextCreateInfoEXT :: capabilityConfigs .

Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE jika capability bukan XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT .

Penggunaan yang Valid (Implisit)

Komponen Dijamin

Runtime yang mendukung XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT , harus mendukung komponen spasial berikut sebagai komponen yang dijamin dari entity yang ditemukan oleh kemampuan ini dan harus menghitungnya dalam xrEnumerateSpatialCapabilityComponentTypesEXT :

  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT
  • Setidaknya satu jenis komponen yang menyediakan sekumpulan label semantik untuk objek yang dilacak. Kemampuan pelacakan objek tidak ada artinya tanpa komponen label semantik. Meskipun ekstensi ini menentukan XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT dan XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT sebagai kemungkinan komponen label semantik yang didukung runtime, ekstensi lain dapat menentukan jenis komponen baru untuk menyediakan berbagai class label semantik yang mendeskripsikan objek yang dilacak. Lihat [ext_spatial_semantic_labels_guidelines] untuk mengetahui detail tentang set label semantik dan desain jenis komponen. Runtime mungkin tidak mendukung XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT atau XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT untuk kemampuan pelacakan objek, tetapi harus mendukung setidaknya satu jenis komponen yang menyediakan label semantik.

Komponen 3D Terbatas

Komponen 3D yang dibatasi menyediakan pusat dan batas objek yang diwakili oleh entitas tempatnya berada. Lihat 3D Terbatas untuk mengetahui detail selengkapnya.

Komponen Opsional

Runtime yang mendukung XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT , mungkin mendukung komponen spasial selain yang tercantum di bagian Komponen yang Dijamin. Aplikasi dapat menggunakan xrEnumerateSpatialCapabilityComponentTypesEXT untuk mendapatkan daftar lengkap komponen yang didukung runtime dan dapat mengonfigurasi komponen yang diinginkan saat membuat konteks spasial.

Label Semantik Objek

Data komponen

typedef enum XrSpatialObjectSemanticLabelEXT {
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT = 2,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_BED_EXT = 3,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CHAIR_EXT = 4,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT = 5,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_LAMP_EXT = 6,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_PLANT_EXT = 7,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT = 8,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT = 9,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CABINET_EXT = 10,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialObjectSemanticLabelEXT;

Enumerasi XrSpatialObjectSemanticLabelEXT menjelaskan kumpulan label semantik untuk objek.

Untuk entity dengan label XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT, sumbu +Z dari komponen Bounded 3D harus kurang lebih cocok dengan normal permukaan layar.

Untuk entity dengan label XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT, sumbu +Z komponen Bounded 3D harus cocok dengan normal permukaan dinding tempat karya seni ditemukan.

Untuk entity dengan label XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT, sumbu +Z dari komponen Bounded 3D harus cocok dengan normal permukaan tabel.

Untuk semua label lain di XrSpatialObjectSemanticLabelEXT , aplikasi tidak boleh membuat asumsi apa pun tentang bagaimana XrBoxf :: center :: orientation yang disediakan oleh komponen Bounded 3D pada entitas selaras dengan atribut fisik objek tersebut.

Nilai enumerasi memiliki arti berikut:

Deskripsi Enum

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT

Runtime tidak dapat mengklasifikasikan entity ini.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT

Entity-nya adalah sofa.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_BED_EXT

Entitasnya adalah tempat tidur.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CHAIR_EXT

Entitasnya adalah kursi.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT

Entity adalah tabel.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_LAMP_EXT

Entity-nya adalah lampu.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_PLANT_EXT

Entity tersebut adalah tanaman.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT

Entitasnya adalah layar tampilan, seperti monitor atau TV.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT

Entitasnya adalah hiasan dinding.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CABINET_EXT

Entity adalah lemari.

Struktur Daftar Komponen untuk Membuat Kueri Data

Struktur XrSpatialComponentObjectSemanticLabelListEXT didefinisikan sebagai:

typedef struct XrSpatialComponentObjectSemanticLabelListEXT {
    XrStructureType                     type;
    void*                               next;
    uint32_t                            semanticLabelCount;
    XrSpatialObjectSemanticLabelEXT*    semanticLabels;
} XrSpatialComponentObjectSemanticLabelListEXT;

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.
  • semanticLabelCount adalah uint32_t yang menjelaskan jumlah elemen dalam array semanticLabels.
  • semanticLabels adalah array XrSpatialObjectSemanticLabelEXT .

Untuk mengkueri komponen label semantik objek dari entity spasial dalam XrSpatialSnapshotEXT , sertakan XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes dan tambahkan XrSpatialComponentObjectSemanticLabelListEXT ke rantai XrSpatialComponentDataQueryResultEXT :: next.

Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE dari xrQuerySpatialComponentDataEXT jika XrSpatialComponentObjectSemanticLabelListEXT berada dalam rantai XrSpatialComponentDataQueryResultEXT :: next, tetapi XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT tidak disertakan dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes .

Runtime harus menampilkan XR_ERROR_SIZE_INSUFFICIENT dari xrQuerySpatialComponentDataEXT jika semanticLabelCount kurang dari XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .

Penggunaan yang Valid (Implisit)

Konfigurasi

Jika XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT dienumerasi di XrSpatialCapabilityComponentTypesEXT :: componentTypes untuk beberapa kemampuan, aplikasi dapat mengaktifkannya dengan menyertakan enumerasi dalam daftar XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents dari struktur turunan XrSpatialCapabilityConfigurationBaseHeaderEXT dari kemampuan yang mendukung komponen ini.

Komponen ini tidak memerlukan konfigurasi khusus untuk disertakan dalam rantai XrSpatialCapabilityConfigurationBaseHeaderEXT :: next, tetapi menawarkan konfigurasi opsional untuk disediakan aplikasi.

Struktur XrSpatialFeatureObjectSemanticLabelSubsetEXT didefinisikan sebagai:

typedef struct XrSpatialFeatureObjectSemanticLabelSubsetEXT {
    XrStructureType                           type;
    const void*                               next;
    uint32_t                                  semanticLabelCount;
    const XrSpatialObjectSemanticLabelEXT*    semanticLabels;
} XrSpatialFeatureObjectSemanticLabelSubsetEXT;

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur.
  • semanticLabelCount adalah uint32_t yang menjelaskan jumlah elemen dalam array semanticLabels.
  • semanticLabels adalah array XrSpatialObjectSemanticLabelEXT .

Jika runtime menghitung XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT dari xrEnumerateSpatialCapabilityComponentTypesEXT untuk kemampuan tertentu, runtime harus juga menghitung XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT dari xrEnumerateSpatialCapabilityFeaturesEXT untuk kemampuan yang sama. Jika aplikasi mengaktifkan XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT saat mengonfigurasi kemampuan tersebut, aplikasi dapat merantai XrSpatialFeatureObjectSemanticLabelSubsetEXT ke struktur konfigurasi yang sesuai dari kemampuan tersebut untuk memberikan subset label yang ditentukan dalam XrSpatialObjectSemanticLabelEXT ke runtime. Runtime dapat menggunakan subset label ini untuk mengoptimalkan pipeline pelacakannya.

Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE dari xrCreateSpatialContextAsyncEXT jika semanticLabels berisi label apa pun yang tidak ditentukan di XrSpatialObjectSemanticLabelEXT atau jika semanticLabels berisi XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT .

Runtime harus menampilkan XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT dari xrCreateSpatialContextAsyncEXT jika aplikasi memberikan daftar label yang valid di semanticLabels, tetapi XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT tidak disertakan dalam array XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents dari struktur konfigurasi yang dirantai ke XrSpatialFeatureObjectSemanticLabelSubsetEXT.

Jika aplikasi mengonfigurasi kemampuan dengan XrSpatialFeatureObjectSemanticLabelSubsetEXT yang valid, runtime tidak boleh menyertakan entitas yang memiliki label semantik yang tidak tercantum dalam semanticLabels di snapshot penemuan apa pun yang dibuat untuk konteks spasial yang dikonfigurasi.

Penggunaan yang Valid (Implisit)

Label Semantik Keyboard

Data komponen

typedef enum XrSpatialKeyboardSemanticLabelEXT {
    XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
    XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT = 2,
    XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialKeyboardSemanticLabelEXT;

Enumerasi XrSpatialKeyboardSemanticLabelEXT menjelaskan label semantik untuk keyboard.

Luas dan orientasi XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT yang diwakili oleh komponen Bounded 3D pada entity yang sama ditampilkan dalam gambar berikut (dengan xyz = rgb) yang berasal dari pusat objek.

orientasi keyboard pelacakan objek spasial eksternal

Gambar 30. Orientasi keyboard.

Deskripsi Enum

XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_UNCATEGORIZED_EXT

Runtime tidak dapat mengklasifikasikan entity ini.

XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT

Entitasnya adalah keyboard.

Struct Daftar Komponen untuk Mengkueri Data

Struktur XrSpatialComponentKeyboardSemanticLabelListEXT didefinisikan sebagai:

typedef struct XrSpatialComponentKeyboardSemanticLabelListEXT {
    XrStructureType                       type;
    void*                                 next;
    uint32_t                              semanticLabelCount;
    XrSpatialKeyboardSemanticLabelEXT*    semanticLabels;
} XrSpatialComponentKeyboardSemanticLabelListEXT;

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.
  • semanticLabelCount adalah uint32_t yang menjelaskan jumlah elemen dalam array semanticLabels.
  • semanticLabels adalah array XrSpatialKeyboardSemanticLabelEXT .

Untuk mengkueri komponen label semantik keyboard dari entity spasial dalam XrSpatialSnapshotEXT , sertakan XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes dan tambahkan XrSpatialComponentKeyboardSemanticLabelListEXT ke rantai XrSpatialComponentDataQueryResultEXT :: next.

Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE dari xrQuerySpatialComponentDataEXT jika XrSpatialComponentKeyboardSemanticLabelListEXT berada dalam rantai XrSpatialComponentDataQueryResultEXT :: next, tetapi XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT tidak disertakan dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes .

Runtime harus menampilkan XR_ERROR_SIZE_INSUFFICIENT dari xrQuerySpatialComponentDataEXT jika semanticLabelCount kurang dari XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .

Penggunaan yang Valid (Implisit)

Konfigurasi

Jika XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT dienumerasi di XrSpatialCapabilityComponentTypesEXT :: componentTypes untuk beberapa kemampuan, aplikasi dapat mengaktifkannya dengan menyertakan enumerasi dalam daftar XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents dari struktur turunan XrSpatialCapabilityConfigurationBaseHeaderEXT dari kemampuan yang mendukung komponen ini.

Komponen ini tidak memerlukan konfigurasi khusus untuk disertakan dalam rantai XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.

Label Semantik Mouse

Data komponen

typedef enum XrSpatialMouseSemanticLabelEXT {
    XR_SPATIAL_MOUSE_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
    XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MOUSE_EXT = 2,
    XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialMouseSemanticLabelEXT;

Enumerasi XrSpatialMouseSemanticLabelEXT menjelaskan label semantik untuk mouse.

Deskripsi Enum

XR_SPATIAL_MOUSE_SEMANTIC_LABEL_UNCATEGORIZED_EXT

Runtime tidak dapat mengklasifikasikan entity ini.

XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MOUSE_EXT

Entity adalah mouse.

Struct Daftar Komponen untuk Mengkueri Data

Struktur XrSpatialComponentMouseSemanticLabelListEXT didefinisikan sebagai:

typedef struct XrSpatialComponentMouseSemanticLabelListEXT {
    XrStructureType                    type;
    void*                              next;
    uint32_t                           semanticLabelCount;
    XrSpatialMouseSemanticLabelEXT*    semanticLabels;
} XrSpatialComponentMouseSemanticLabelListEXT;

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.
  • semanticLabelCount adalah uint32_t yang menjelaskan jumlah elemen dalam array semanticLabels.
  • semanticLabels adalah array XrSpatialMouseSemanticLabelEXT .

Untuk mengkueri komponen label semantik mouse dari entity spasial dalam XrSpatialSnapshotEXT , sertakan XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes dan tambahkan XrSpatialComponentMouseSemanticLabelListEXT ke rantai XrSpatialComponentDataQueryResultEXT :: next.

Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE dari xrQuerySpatialComponentDataEXT jika XrSpatialComponentMouseSemanticLabelListEXT berada dalam rantai XrSpatialComponentDataQueryResultEXT :: next, tetapi XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT tidak disertakan dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes .

Runtime harus menampilkan XR_ERROR_SIZE_INSUFFICIENT dari xrQuerySpatialComponentDataEXT jika semanticLabelCount kurang dari XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .

Penggunaan yang Valid (Implisit)

Konfigurasi

Jika XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT dienumerasi di XrSpatialCapabilityComponentTypesEXT :: componentTypes untuk beberapa kemampuan, aplikasi dapat mengaktifkannya dengan menyertakan enumerasi dalam daftar XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents dari struktur turunan XrSpatialCapabilityConfigurationBaseHeaderEXT dari kemampuan yang mendukung komponen ini.

Komponen ini tidak memerlukan konfigurasi khusus untuk disertakan dalam rantai XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.

Kode contoh

Mengonfigurasi Kemampuan Pelacakan Objek

Contoh kode berikut menunjukkan cara mengonfigurasi kemampuan pelacakan objek saat membuat konteks spasial.

// Check if object tracking capability is supported
uint32_t capabilityCount;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0, &capabilityCount, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCount);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilityCount, &capabilityCount, capabilities.data()));

if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT) == capabilities.end()) {
  return;
}

// Enumerate supported components for object tracking capability
XrSpatialCapabilityComponentTypesEXT objectComponents{XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, &objectComponents));
std::vector<XrSpatialComponentTypeEXT> objectCapabilityComponents(objectComponents.componentTypeCountOutput);
objectComponents.componentTypeCapacityInput = objectCapabilityComponents.size();
objectComponents.componentTypes = objectCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, &objectComponents));

// Check if the object & keyboard semantic labels component is supported
const auto supportsComponent = [&objectCapabilityComponents](XrSpatialComponentTypeEXT component) {
  return std::find(objectCapabilityComponents.begin(), objectCapabilityComponents.end(), component) != objectCapabilityComponents.end();
};

const bool supportsObjectSemanticLabel = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT);
const bool supportsKeyboardSemanticLabel = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT);

// Enumerate supported features for object tracking capability
uint32_t featureCount;
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, 0, &featureCount, nullptr));
std::vector<XrSpatialCapabilityFeatureEXT> features(featureCount);
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, featureCount, &featureCount, features.data()));

const bool supportsObjectSemanticLabelSubsetFeature = std::find(features.begin(), features.end(), XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT) != features.end();

// Create a spatial context
XrSpatialContextEXT spatialContext{};

// Enable the guaranteed components of the object tracking capability
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
  XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT,
};
// Optionally enable the supported semantic labels
if (supportsObjectSemanticLabel) {
  enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT);
}
if (supportsKeyboardSemanticLabel) {
  enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT);
}

// We only want to track sofa and table.
std::vector<XrSpatialObjectSemanticLabelEXT> objectSemanticLabelSubset = {
  XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT,
  XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT
};
XrSpatialFeatureObjectSemanticLabelSubsetEXT subsetFeature{XR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT};
subsetFeature.semanticLabelCount = objectSemanticLabelSubset.size();
subsetFeature.semanticLabels = objectSemanticLabelSubset.data();

XrSpatialCapabilityConfigurationObjectTrackingEXT objectTrackingConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXT};
objectTrackingConfig.capability = XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT;
objectTrackingConfig.enabledComponentCount = enabledComponents.size();
objectTrackingConfig.enabledComponents = enabledComponents.data();
if (supportsObjectSemanticLabelSubsetFeature) {
  objectTrackingConfig.next = &subsetFeature;
}

std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
  reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&objectTrackingConfig),
};

XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
XrFutureEXT createContextFuture;
CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo, &createContextFuture));

waitUntilReady(createContextFuture);

XrCreateSpatialContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture, &completion));
if (completion.futureResult != XR_SUCCESS) {
  return;
}

spatialContext = completion.spatialContext;

// ...
// Discovery entities with the spatial context
// ...

CHK_XR(xrDestroySpatialContextEXT(spatialContext));

Menemukan Entity Spasial & Membuat Kueri Data Komponen

Contoh kode berikut menunjukkan cara menemukan entity spasial untuk konteks yang dikonfigurasi dengan XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT dan mengkueri data komponennya.

XrFutureEXT future = XR_NULL_FUTURE_EXT;

// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
  XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT,
};
if (supportsKeyboardSemanticLabel) {
  snapshotComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT);
}

auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
  XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
  snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
  snapshotCreateInfo.componentTypes = snapshotComponents.data();
  CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));

  waitUntilReady(future);

  XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
  completionInfo.baseSpace = localSpace;
  completionInfo.time = time;
  completionInfo.future = future;

  XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
  if (completion.futureResult == XR_SUCCESS) {

    // Query for the semantic label component data
    XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
    queryCond.componentTypeCount = snapshotComponents.size();
    queryCond.componentTypes = snapshotComponents.data();

    XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));

    std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
    std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
    queryResult.entityIdCapacityInput = entityIds.size();
    queryResult.entityIds = entityIds.data();
    queryResult.entityStateCapacityInput = entityStates.size();
    queryResult.entityStates = entityStates.data();

    std::vector<XrBoxf> bounded3D(queryResult.entityIdCountOutput);
    XrSpatialComponentBounded3DListEXT bounded3DList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_3D_LIST_EXT};
    bounded3DList.boundCount = bounded3D.size();
    bounded3DList.bounds = bounded3D.data();
    queryResult.next = &bounded3DList;

    std::vector<XrSpatialKeyboardSemanticLabelEXT> semanticLabels;
    XrSpatialComponentKeyboardSemanticLabelListEXT semanticLabelsList{XR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXT};
    if (supportsKeyboardSemanticLabel) {
      semanticLabels.resize(queryResult.entityIdCountOutput);
      semanticLabelsList.semanticLabelCount = semanticLabels.size();
      semanticLabelsList.semanticLabels = semanticLabels.data();
      semanticLabelsList.next = queryResult.next;
      queryResult.next = &semanticLabelsList;
    }

    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));

    for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
      if (entityStates[i] != XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT) {
        continue;
      }

      // 3D bounds for entity entityIds[i] is bounded3D[i].extents centered on bounded3D[i].center.

      if (supportsKeyboardSemanticLabel) {
        // semantic label for entity entityIds[i] is semanticLabels[i].
      }
    }

    CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
  }
};

while (1) {
  // ...
  // For every frame in frame loop
  // ...

  XrFrameState frameState;  // previously returned from xrWaitFrame
  const XrTime time = frameState.predictedDisplayTime;

  // Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
  XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
  XrResult result = xrPollEvent(instance, &event);
  if (result == XR_SUCCESS) {
      switch (event.type) {
          case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
              const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata =
                  *reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
              // Discover spatial entities for the context that we received the "discovery
              // recommended" event for.
              discoverSpatialEntities(eventdata.spatialContext, time);
              break;
          }
      }
  }

  // ...
  // Finish frame loop
  // ...
}

Struktur Baru

Enum Baru

Konstanta Enum Baru

  • XR_EXT_SPATIAL_OBJECT_TRACKING_EXTENSION_NAME
  • XR_EXT_spatial_object_tracking_SPEC_VERSION
  • Memperluas XrSpatialCapabilityEXT :

    • XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT
  • Memperluas XrSpatialCapabilityFeatureEXT :

    • XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT
  • Memperluas XrSpatialComponentTypeEXT :

    • XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT
    • XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT
    • XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT
  • Memperluas XrStructureType :

    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXT
    • XR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_COMPONENT_MOUSE_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_COMPONENT_OBJECT_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT

Masalah

Riwayat Versi

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

    • Deskripsi ekstensi awal