XR_EXT_spatial_object_tracking

Name String

XR_EXT_spatial_object_tracking

Uzantı Türü

Örnek uzantısı

Kayıtlı Dahili Numara

745

Düzeltme

1

Onay Durumu

Onaylanmadı

Uzantı ve Sürüm Bağımlılıkları

XR_EXT_spatial_entity

IP Durumu

Bilinen bir fikri mülkiyet hak talebi yok.

Katkıda bulunanlar

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

Genel Bakış

Bu uzantı, XR_EXT_spatial_entity üzerine kuruludur ve uygulamadan giriş veri kümesi gerektirmeden önceden tanımlanmış bir nesne kümesini izlemek için uzamsal bir özellik tanımlar.

Çalışma Zamanı Desteği

Çalışma zamanı, nesne izlemeyi destekliyorsa bunu xrEnumerateSpatialCapabilitiesEXT içinde XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT değerini numaralandırarak belirtmesi gerekir.

Yapılandırma

XrSpatialCapabilityConfigurationObjectTrackingEXT yapısı şu şekilde tanımlanır:

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

Üye Açıklamaları

  • type, bu yapının XrStructureType değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • capability, bir XrSpatialCapabilityEXT'tir ve XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT olmalıdır.
  • enabledComponentCount, enabledComponents dizisindeki öğe sayısını açıklayan bir uint32_t değeridir.
  • enabledComponents, XrSpatialComponentTypeEXT dizisine işaret eden bir göstergedir.

Uygulamalar, XrSpatialContextCreateInfoEXT :: capabilityConfigs içindeki XrSpatialCapabilityConfigurationObjectTrackingEXT yapısına bir işaretçi ekleyerek XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT uzamsal özelliğini etkinleştirebilir.

capability, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT değilse çalışma zamanı XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir.

Geçerli Kullanım (Dolaylı)

Garantili Bileşenler

XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT özelliğini destekleyen bir çalışma zamanı, bu özellik tarafından keşfedilen varlıkların garantili bileşenleri olarak aşağıdaki uzamsal bileşenleri desteklemeli (must) ve bunları xrEnumerateSpatialCapabilityComponentTypesEXT içinde listelemelidir (must):

  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT
  • İzlenen nesneler için bir dizi anlamsal etiket sağlayan en az bir bileşen türü. Nesne izleme özelliği, anlamsal etiket bileşeni olmadan anlamsızdır. Bu uzantı, çalışma zamanlarının desteklemesi için olası semantik etiket bileşenleri olarak XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT ve XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT değerlerini tanımlarken diğer uzantılar, izlenen bir nesneyi açıklayan farklı semantik etiket sınıfları sağlamak için yeni bileşen türleri tanımlayabilir. Anlamsal etiket kümeleri ve bileşen türleri tasarımı hakkında ayrıntılı bilgi için [ext_spatial_semantic_labels_guidelines] adresini ziyaret edin. Çalışma zamanları, nesne dosyası özelliği için XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT veya XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT'yi desteklemeyebilir ancak anlamsal etiket sağlayan en az bir bileşen türünü desteklemesi gerekir.

Sınırlı 3D Bileşen

Sınırlı 3D bileşeni, üzerinde bulunduğu varlık tarafından temsil edilen nesnenin merkezini ve kapsamını sağlar. Daha fazla bilgi için Sınırlı 3D bölümüne bakın.

İsteğe Bağlı Bileşenler

XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT destekleyen bir çalışma zamanı, Garantili Bileşenler bölümünde listelenenlere ek olarak uzamsal bileşenleri destekleyebilir (may). Uygulama, bir çalışma zamanının desteklediği bileşenlerin tam listesini almak için xrEnumerateSpatialCapabilityComponentTypesEXT'yi kullanabilir ve ardından uzamsal bağlamı oluştururken ilgilendiği bileşenleri yapılandırabilir.

Nesne Anlamsal Etiketi

Bileşen verileri

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;

XrSpatialObjectSemanticLabelEXT numaralandırması, nesneler için bir dizi anlamsal etiketi tanımlar.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT etiketine sahip varlıklar için Sınırlı 3D bileşeninin +Z ekseni, ekranın yüzey normaliyle kabaca eşleşmelidir.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT etiketine sahip varlıklar için Sınırlı 3D bileşeninin +Z ekseni, sanat eserinin keşfedildiği duvarın yüzey normaliyle eşleşmelidir.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT etiketine sahip varlıklar için Sınırlı 3D bileşeninin +Z ekseni, tablonun yüzey normaliyle eşleşmelidir.

XrSpatialObjectSemanticLabelEXT içindeki diğer tüm etiketler için uygulama, varlıktaki Bounded 3D bileşeni tarafından sağlanan XrBoxf :: center :: orientation değerinin, ilgili nesnenin fiziksel özellikleriyle nasıl uyumlu olduğu konusunda herhangi bir varsayımda bulunmamalıdır.

Numaralandırma değerleri aşağıdaki anlamlara sahiptir:

Enum Açıklaması

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT

Çalışma zamanı bu varlığı sınıflandıramadı.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT

Öğe bir kanepedir.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_BED_EXT

Varlık bir yataktır.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CHAIR_EXT

Öğe bir sandalyedir.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT

Varlık bir tablodur.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_LAMP_EXT

Öğe bir lamba.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_PLANT_EXT

Varlık bir bitkidir.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT

Varlık, monitör veya TV gibi bir ekrandır.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT

Varlık, duvar sanatı.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CABINET_EXT

Varlık bir dolaptır.

Verileri Sorgulamak İçin Bileşen Listesi Yapısı

XrSpatialComponentObjectSemanticLabelListEXT yapısı şu şekilde tanımlanır:

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

Üye Açıklamaları

  • type, bu yapının XrStructureType değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir. Temel OpenXR'da veya bu uzantıda bu tür yapılar tanımlanmamıştır.
  • semanticLabelCount, semanticLabels dizisindeki öğe sayısını açıklayan bir uint32_t değeridir.
  • semanticLabels, XrSpatialObjectSemanticLabelEXT dizisidir.

XrSpatialSnapshotEXT içindeki uzamsal varlıkların nesne semantik etiket bileşenini sorgulamak için XrSpatialComponentDataQueryConditionEXT :: componentTypes içine XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT ekleyin ve XrSpatialComponentDataQueryResultEXT :: next zincirine XrSpatialComponentObjectSemanticLabelListEXT ekleyin.

XrSpatialComponentDataQueryResultEXT :: next zincirinde XrSpatialComponentObjectSemanticLabelListEXT varsa ancak XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT yoksa çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_VALIDATION_FAILURE döndürmelidir.

semanticLabelCount, XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir.

Geçerli Kullanım (Dolaylı)

Yapılandırma

XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT, bir özellik için XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde listeleniyorsa uygulama, bu bileşeni destekleyen özelliğin XrSpatialCapabilityConfigurationBaseHeaderEXT türetilmiş yapısının XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine numaralandırıcıyı ekleyerek bu özelliği etkinleştirebilir.

Bu bileşenin XrSpatialCapabilityConfigurationBaseHeaderEXT :: next zincirine dahil edilmesi için özel bir yapılandırma gerekmez ancak uygulamaların sağlayabileceği isteğe bağlı bir yapılandırma sunar.

XrSpatialFeatureObjectSemanticLabelSubsetEXT yapısı şu şekilde tanımlanır:

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

Üye Açıklamaları

  • type, bu yapının XrStructureType değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • semanticLabelCount, semanticLabels dizisindeki öğe sayısını açıklayan bir uint32_t değeridir.
  • semanticLabels, XrSpatialObjectSemanticLabelEXT dizisidir.

Çalışma zamanı, belirli bir özellik için xrEnumerateSpatialCapabilityComponentTypesEXT'ten XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT değerini listeliyorsa aynı özellik için xrEnumerateSpatialCapabilityFeaturesEXT'ten XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT değerini de listelemesi gerekir. Bir uygulama, bu özelliği yapılandırırken XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT özelliğini etkinleştirirse XrSpatialFeatureObjectSemanticLabelSubsetEXT özelliğini bu özelliğin ilgili yapılandırma yapısına zincirleyerek çalışma zamanına XrSpatialObjectSemanticLabelEXT içinde tanımlanan etiketlerin bir alt kümesini sağlayabilir. Çalışma zamanı, izleme ardışık düzenlerini optimize etmek için bu etiket alt kümesini kullanabilir.

semanticLabels, XrSpatialObjectSemanticLabelEXT içinde tanımlanmamış bir etiket içeriyorsa veya semanticLabels, XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT içeriyorsa çalışma zamanı, xrCreateSpatialContextAsyncEXT'ten XR_ERROR_VALIDATION_FAILURE döndürmelidir.

Uygulama, semanticLabels içinde geçerli bir etiket listesi sağlıyorsa ancak XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT, XrSpatialFeatureObjectSemanticLabelSubsetEXT'nin bağlı olduğu yapılandırma yapısının XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents dizisine dahil edilmemişse çalışma zamanı, xrCreateSpatialContextAsyncEXT'ten XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT değerini döndürmelidir.

Uygulama, geçerli bir XrSpatialFeatureObjectSemanticLabelSubsetEXT ile bir özelliği yapılandırırsa çalışma zamanı, yapılandırılmış uzamsal bağlam için oluşturulan herhangi bir keşif anlık görüntüsünde semanticLabels içinde listelenmeyen semantik etiketlere sahip varlıkları içermemelidir.

Geçerli Kullanım (Dolaylı)

Klavye Anlamsal Etiketi

Bileşen verileri

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;

XrSpatialKeyboardSemanticLabelEXT numaralandırması, klavyenin semantik etiketini açıklar.

Aynı varlıktaki Sınırlı 3D bileşeniyle temsil edilen XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT öğesinin kapsamı ve yönü, nesnenin merkezinden kaynaklanan aşağıdaki resimde (xyz = rgb ile) gösterilmektedir.

ext spatial object tracking keyboard orientation

30. şekil Klavye yönü.

Enum Açıklaması

XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_UNCATEGORIZED_EXT

Çalışma zamanı bu varlığı sınıflandıramadı.

XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT

Öğe bir klavyedir.

Sorgu Verileri İçin Bileşen Listesi Yapısı

XrSpatialComponentKeyboardSemanticLabelListEXT yapısı şu şekilde tanımlanır:

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

Üye Açıklamaları

  • type, bu yapının XrStructureType değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir. Temel OpenXR'da veya bu uzantıda bu tür yapılar tanımlanmamıştır.
  • semanticLabelCount, semanticLabels dizisindeki öğe sayısını açıklayan bir uint32_t değeridir.
  • semanticLabels, XrSpatialKeyboardSemanticLabelEXT dizisidir.

XrSpatialSnapshotEXT içindeki uzamsal varlıkların klavye semantik etiket bileşenini sorgulamak için XrSpatialComponentDataQueryConditionEXT :: componentTypes içine XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT ekleyin ve XrSpatialComponentDataQueryResultEXT :: next zincirine XrSpatialComponentKeyboardSemanticLabelListEXT ekleyin.

XrSpatialComponentKeyboardSemanticLabelListEXT, XrSpatialComponentDataQueryResultEXT :: next zincirindeyse ancak XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde yer almıyorsa çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir.

semanticLabelCount, XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir.

Geçerli Kullanım (Dolaylı)

Yapılandırma

XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT, bir özellik için XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde listeleniyorsa uygulama, bu bileşeni destekleyen özelliğin XrSpatialCapabilityConfigurationBaseHeaderEXT türetilmiş yapısının XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine numaralandırıcıyı ekleyerek bu özelliği etkinleştirebilir.

Bu bileşenin XrSpatialCapabilityConfigurationBaseHeaderEXT :: next zincirine dahil edilmesi için özel bir yapılandırma gerekmez.

Fare Anlamsal Etiketi

Bileşen verileri

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;

XrSpatialMouseSemanticLabelEXT numaralandırması, fare için anlamsal bir etiketi açıklar.

Enum Açıklaması

XR_SPATIAL_MOUSE_SEMANTIC_LABEL_UNCATEGORIZED_EXT

Çalışma zamanı bu varlığı sınıflandıramadı.

XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MOUSE_EXT

Varlık bir faredir.

Sorgu Verileri İçin Bileşen Listesi Yapısı

XrSpatialComponentMouseSemanticLabelListEXT yapısı şu şekilde tanımlanır:

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

Üye Açıklamaları

  • type, bu yapının XrStructureType değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir. Temel OpenXR'da veya bu uzantıda bu tür yapılar tanımlanmamıştır.
  • semanticLabelCount, semanticLabels dizisindeki öğe sayısını açıklayan bir uint32_t değeridir.
  • semanticLabels, XrSpatialMouseSemanticLabelEXT dizisidir.

XrSpatialSnapshotEXT içindeki uzamsal varlıkların fare semantik etiket bileşenini sorgulamak için XrSpatialComponentDataQueryConditionEXT :: componentTypes içine XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT ekleyin ve XrSpatialComponentDataQueryResultEXT :: next zincirine XrSpatialComponentMouseSemanticLabelListEXT ekleyin.

XrSpatialComponentMouseSemanticLabelListEXT, XrSpatialComponentDataQueryResultEXT :: next zincirindeyse ancak XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde yer almıyorsa çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_VALIDATION_FAILURE döndürmelidir.

semanticLabelCount, XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir.

Geçerli Kullanım (Dolaylı)

Yapılandırma

XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT, bir özellik için XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde listeleniyorsa uygulama, bu bileşeni destekleyen özelliğin XrSpatialCapabilityConfigurationBaseHeaderEXT türetilmiş yapısının XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine numaralandırıcıyı ekleyerek bu özelliği etkinleştirebilir.

Bu bileşenin XrSpatialCapabilityConfigurationBaseHeaderEXT :: next zincirine dahil edilmesi için özel bir yapılandırma gerekmez.

Örnek kod

Nesne İzleme Özelliğini Yapılandırma

Aşağıdaki örnek kodda, uzamsal bağlam oluştururken nesne izleme özelliğinin nasıl yapılandırılacağı gösterilmektedir.

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

Mekansal Varlıkları Keşfetme ve Bileşen Verilerini Sorgulama

Aşağıdaki örnek kodda, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT ile yapılandırılmış bir bağlam için uzamsal varlıkların nasıl keşfedileceği ve bileşen verilerinin nasıl sorgulanacağı gösterilmektedir.

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
  // ...
}

Yeni Yapılar

Yeni Enum Veri Türleri

Yeni Enum Sabitleri

  • XR_EXT_SPATIAL_OBJECT_TRACKING_EXTENSION_NAME
  • XR_EXT_spatial_object_tracking_SPEC_VERSION
  • XrSpatialCapabilityEXT'yi genişletme:

    • XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT
  • XrSpatialCapabilityFeatureEXT'yi genişletme:

    • XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT
  • XrSpatialComponentTypeEXT'yi genişletme:

    • XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT
    • XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT
    • XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT
  • XrStructureType'ı genişletme:

    • 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

Sayılar

Sürüm Geçmişi

  • Revizyon 1, 03.06.2025 (Nihav Jain, Google)

    • İlk uzantı açıklaması