XR_EXT_spatial_marker_tracking

Name String

XR_EXT_spatial_marker_tracking

Uzantı Türü

Örnek uzantısı

Kayıtlı Dahili Numara

744

Düzeltme

1

Onay Durumu

Onaylandı

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

XR_EXT_spatial_entity

Katkıda bulunanlar

Ron Bessems, Meta
Nihav Jain, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Yin Li, Microsoft
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
Jun Yan, ByteDance

Genel Bakış

Bu uzantı, XR_EXT_spatial_entity üzerine kuruludur ve uygulamaların ortamlarındaki işaretçileri algılayıp izlemesine olanak tanır. İşaretçiler; QR kodları, mikro QR kodları, ArUco işaretçileri veya AprilTag'leri içerebilen 2D kodlardır.

İzlenen bir işaretçi, aşağıdaki bileşenlere sahip (veya "sahip olan") uzamsal bir varlık olarak temsil edilir:

  • XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT
  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT

Çalışma zamanı desteği

Çalışma zamanı, aşağıdaki özelliklerden herhangi birini listeleyerek xrEnumerateSpatialCapabilitiesEXT kullanarak çeşitli işaretçi izleme özellikleri için desteğini bildirmelidir (must):

  • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT
  • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT
  • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT
  • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT

Yapılandırma

Bir işaretçi türünün algılanmasını etkinleştirmek için uygulamanın, ilgili yapılandırma yapısını xrCreateSpatialContextAsyncEXT'ye iletmesi gerekir.

İşaretçi Türü Yapılandırmaları

QR kodları

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

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

Ü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 XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT olmalıdır.
  • enabledComponentCount, enabledComponents içindeki öğe sayısını içeren bir uint32_t.
  • enabledComponents, bu özellik için etkinleştirilecek bileşen dizisine işaret eder.

QR kodları destekleniyorsa çalışma zamanı, xrCreateSpatialContextAsyncEXT çağrılırken XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde bir XrSpatialCapabilityConfigurationQrCodeEXT yapısı iletildiğinde QR kodu izlemeyi etkinleştirmelidir .

XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT, xrEnumerateSpatialCapabilitiesEXT tarafından numaralandırılmamışsa çalışma zamanı XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT değerini döndürmelidir (must).

Geçerli Kullanım (Dolaylı)

Mikro QR kodları

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

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

Ü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 XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT olmalıdır.
  • enabledComponentCount, enabledComponents içindeki öğe sayısını içeren bir uint32_t.
  • enabledComponents, bu özellik için etkinleştirilecek bileşen dizisine işaret eder.

Mikro QR kodları destekleniyorsa çalışma zamanı, xrCreateSpatialContextAsyncEXT çağrılırken XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde bir XrSpatialCapabilityConfigurationMicroQrCodeEXT yapısı iletildiğinde Mikro QR Kodu izlemeyi etkinleştirmelidir .

XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT, xrEnumerateSpatialCapabilitiesEXT tarafından numaralandırılmamışsa çalışma zamanı XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT değerini döndürmelidir (must).

Geçerli Kullanım (Dolaylı)

ArUco İşaretçileri

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

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

Ü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 XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT olmalıdır.
  • enabledComponentCount, enabledComponents içindeki öğe sayısını içeren bir uint32_t.
  • enabledComponents, bu özellik için etkinleştirilecek bileşen dizisine işaret eder.
  • arUcoDict, algılanacak işaretçi sözlüğüdür.

ArUco işaretçileri destekleniyorsa çalışma zamanı, xrCreateSpatialContextAsyncEXT çağrılırken XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde bir XrSpatialCapabilityConfigurationArucoMarkerEXT yapısı iletildiğinde ArUco işaretçi takibini etkinleştirmelidir.

XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde bir XrSpatialCapabilityConfigurationArucoMarkerEXT yapısı varsa ancak XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT, xrEnumerateSpatialCapabilitiesEXT tarafından listelenmiyorsa çalışma zamanı, xrCreateSpatialContextAsyncEXT'ten XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT değerini döndürmelidir.

Geçerli Kullanım (Dolaylı)

XrSpatialMarkerArucoDictEXT numaralandırması şu şekilde tanımlanır:

typedef enum XrSpatialMarkerArucoDictEXT {
    XR_SPATIAL_MARKER_ARUCO_DICT_4X4_50_EXT = 1,
    XR_SPATIAL_MARKER_ARUCO_DICT_4X4_100_EXT = 2,
    XR_SPATIAL_MARKER_ARUCO_DICT_4X4_250_EXT = 3,
    XR_SPATIAL_MARKER_ARUCO_DICT_4X4_1000_EXT = 4,
    XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT = 5,
    XR_SPATIAL_MARKER_ARUCO_DICT_5X5_100_EXT = 6,
    XR_SPATIAL_MARKER_ARUCO_DICT_5X5_250_EXT = 7,
    XR_SPATIAL_MARKER_ARUCO_DICT_5X5_1000_EXT = 8,
    XR_SPATIAL_MARKER_ARUCO_DICT_6X6_50_EXT = 9,
    XR_SPATIAL_MARKER_ARUCO_DICT_6X6_100_EXT = 10,
    XR_SPATIAL_MARKER_ARUCO_DICT_6X6_250_EXT = 11,
    XR_SPATIAL_MARKER_ARUCO_DICT_6X6_1000_EXT = 12,
    XR_SPATIAL_MARKER_ARUCO_DICT_7X7_50_EXT = 13,
    XR_SPATIAL_MARKER_ARUCO_DICT_7X7_100_EXT = 14,
    XR_SPATIAL_MARKER_ARUCO_DICT_7X7_250_EXT = 15,
    XR_SPATIAL_MARKER_ARUCO_DICT_7X7_1000_EXT = 16,
    XR_SPATIAL_MARKER_ARUCO_DICT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialMarkerArucoDictEXT;

Desteklenen önceden tanımlanmış ArUco sözlüğü:

Numaralandırma Açıklamaları

  • XR_SPATIAL_MARKER_ARUCO_DICT_4X4_50_EXT: 50 kimlik içeren 4x4 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_4X4_100_EXT: 100 kimlik içeren 4x4 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_4X4_250_EXT: 250 kimlik içeren 4x4 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_4X4_1000_EXT: 1.000 kimlik içeren 4x4 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT: 50 kimlik içeren 5x5 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_5X5_100_EXT: 100 kimlik içeren 5x5 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_5X5_250_EXT: 250 kimlik içeren 5x5 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_5X5_1000_EXT: 1.000 kimlik içeren 5x5 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_6X6_50_EXT: 50 kimlik içeren 6x6 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_6X6_100_EXT: 100 kimlik içeren 6x6 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_6X6_250_EXT: 250 kimlik içeren 6x6 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_6X6_1000_EXT: 1.000 kimlik içeren 6x6 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_7X7_50_EXT: 50 kimlik içeren 7x7 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_7X7_100_EXT: 100 kimlik içeren 7x7 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_7X7_250_EXT: 250 kimlik içeren 7x7 piksellik ArUco işaretçi sözlüğü.
  • XR_SPATIAL_MARKER_ARUCO_DICT_7X7_1000_EXT: 1.000 kimlik içeren 7x7 piksellik ArUco işaretçi sözlüğü.
AprilTags

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

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

Ü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 XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT olmalıdır.
  • enabledComponentCount, enabledComponents içindeki öğe sayısını içeren bir uint32_t.
  • enabledComponents, bu özellik için etkinleştirilecek bileşen dizisine işaret eder.
  • aprilDict, algılanacak işaretçi sözlüğüdür.

AprilTag'ler destekleniyorsa çalışma zamanı, xrCreateSpatialContextAsyncEXT çağrılırken XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde bir XrSpatialCapabilityConfigurationAprilTagEXT yapısı iletildiğinde AprilTag takibini etkinleştirmelidir (must).

XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde bir XrSpatialCapabilityConfigurationAprilTagEXT yapısı varsa ancak XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT, xrEnumerateSpatialCapabilitiesEXT tarafından numaralandırılmamışsa çalışma zamanı, xrCreateSpatialContextAsyncEXT'ten XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT değerini döndürmelidir (must).

Geçerli Kullanım (Dolaylı)

XrSpatialMarkerAprilTagDictEXT numaralandırması şu şekilde tanımlanır:

typedef enum XrSpatialMarkerAprilTagDictEXT {
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_16H5_EXT = 1,
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_25H9_EXT = 2,
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H10_EXT = 3,
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT = 4,
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialMarkerAprilTagDictEXT;

Desteklenen önceden tanımlanmış AprilTag sözlüğü:

Numaralandırma Açıklamaları

  • XR_SPATIAL_MARKER_APRIL_TAG_DICT_16H5_EXT: 4x4 bit, herhangi iki kod arasındaki minimum Hamming mesafesi = 5, 30 kod.
  • XR_SPATIAL_MARKER_APRIL_TAG_DICT_25H9_EXT: 5x5 bit, iki kod arasındaki minimum Hamming mesafesi = 9, 35 kod.
  • XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H10_EXT: 6x6 bit, herhangi iki kod arasındaki minimum Hamming mesafesi = 10, 2.320 kod.
  • XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT: 6x6 bit, herhangi iki kod arasındaki minimum Hamming mesafesi = 11, 587 kod.

İsteğe Bağlı İşaretçi Yapılandırmaları

Uygulamalar, desteklenen isteğe bağlı özelliklerin listesini almak için xrEnumerateSpatialCapabilityFeaturesEXT'i çağırmalıdır (should).

Herhangi bir uzantı tarafından desteklenen tüm uzamsal özelliklerin tam listesi için XrSpatialCapabilityFeatureEXT sayfasına bakın.

İşaretçi Boyutu

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

typedef struct XrSpatialMarkerSizeEXT {
    XrStructureType    type;
    const void*        next;
    float              markerSideLength;
} XrSpatialMarkerSizeEXT;

Ü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.
  • markerSideLength, tüm işaretçilerin metre cinsinden boyutudur.

XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT, belirli bir özellik için xrEnumerateSpatialCapabilityFeaturesEXT tarafından numaralandırılıyorsa ve uygulama, XrSpatialMarkerSizeEXT'yi bu özelliğin ilgili yapılandırma yapısına zincirliyorsa çalışma zamanı, algılanan tüm işaretçilerin genişliğinin ve yüksekliğinin markerSideLength olduğunu varsaymalıdır. Bu bilgilerin çalışma zamanına sağlanması, çalışma zamanının daha doğru bir poz ve boyut döndürmesine olanak tanır. Bu yapı, XrSpatialCapabilityConfigurationQrCodeEXT, XrSpatialCapabilityConfigurationMicroQrCodeEXT, XrSpatialCapabilityConfigurationArucoMarkerEXT veya XrSpatialCapabilityConfigurationAprilTagEXT'in next zincirine bağlanmalıdır.

Geçerli Kullanım (Dolaylı)

Statik İşaretçi Optimizasyonu

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

typedef struct XrSpatialMarkerStaticOptimizationEXT {
    XrStructureType    type;
    const void*        next;
    XrBool32           optimizeForStaticMarker;
} XrSpatialMarkerStaticOptimizationEXT;

Ü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.
  • optimizeForStaticMarker, alandaki tüm işaretçilerin hareket etmemesinin beklenip beklenmediğini gösterir.

XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT, belirli bir özellik için xrEnumerateSpatialCapabilityFeaturesEXT tarafından numaralandırılıyorsa ve uygulama, XrSpatialMarkerStaticOptimizationEXT'yi bu özelliğin ilgili yapılandırma yapısına zincirliyorsa optimizeForStaticMarker, XR_TRUE olarak ayarlanmışsa çalışma zamanı, algılanan tüm işaretçilerin statik olduğunu varsaymalıdır (must). Bu sayede çalışma zamanı, daha doğru bir poz ve boyut oluşturabilir. Bu yapı, XrSpatialCapabilityConfigurationQrCodeEXT, XrSpatialCapabilityConfigurationMicroQrCodeEXT, XrSpatialCapabilityConfigurationArucoMarkerEXT veya XrSpatialCapabilityConfigurationAprilTagEXT'in next zincirine bağlanmalıdır.

Geçerli Kullanım (Dolaylı)

Garantili Bileşenler

XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT, XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT, XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT veya XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT'yi destekleyen bir çalışma zamanı, aşağıdaki uzamsal bileşenleri bu özellikler tarafından keşfedilen tüm varlıkların garantili bileşenleri olarak sağlamalı ve bunları xrEnumerateSpatialCapabilityComponentTypesEXT'te listelemelidir:

  • XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT
  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT

İşaretçi Bileşeni

Bileşen verileri

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

typedef struct XrSpatialMarkerDataEXT {
    XrSpatialCapabilityEXT    capability;
    uint32_t                  markerId;
    XrSpatialBufferEXT        data;
} XrSpatialMarkerDataEXT;

Üye Açıklamaları

  • capability, işaretçiyi algılayan XrSpatialCapabilityEXT'dir.
  • markerId, işaretçideki kodlanmış tanımlayıcıdır. ArUco işaretçileri ve AprilTag için bu alan geçerli olmalı ve kodlanmış kimlikle doldurulmalıdır. QR kodları için bu alan sıfır olmalıdır.
  • data, işaretçide bulunan ek bilgilerin türü ve arabellek kimliğidir.

XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT ve XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT ek verileri destekler. capability bunlardan biriyse:

  • Çalışma zamanı, işaretçi için verilerin kodunu başarıyla çözdüyse data arabellek türünü, işaretçideki verilere bağlı olarak XR_SPATIAL_BUFFER_TYPE_UINT8_EXT veya XR_SPATIAL_BUFFER_TYPE_STRING_EXT olarak ayarlaması gerekir. Çalışma zamanı, data içinde geçerli bir arabellek kimliği de ayarlamalıdır. Uygulama, verileri almak için bu kimliği uygun xrGetSpatialBuffer* işleviyle kullanabilir.
  • Çalışma zamanı, işaretçinin verilerinin kodunu henüz çözmediyse data arabellek kimliğini XR_NULL_SPATIAL_BUFFER_ID_EXT, arabellek türünü ise XR_SPATIAL_BUFFER_TYPE_UNKNOWN_EXT olarak ayarlaması gerekir.

XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT ve XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT ek verileri desteklemez ve çalışma zamanı, data öğesinin arabellek kimliğini XR_NULL_SPATIAL_BUFFER_ID_EXT olarak ayarlamalıdır.

Geçerli Kullanım (Dolaylı)

Verileri sorgulamak için bileşen listesi yapısı

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

typedef struct XrSpatialComponentMarkerListEXT {
    XrStructureType            type;
    void*                      next;
    uint32_t                   markerCount;
    XrSpatialMarkerDataEXT*    markers;
} XrSpatialComponentMarkerListEXT;

Ü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.
  • markerCount, markers üyesindeki öğelerin sayısıdır.
  • markers, XrSpatialMarkerDataEXT dizisidir.

Uygulama, XrSpatialComponentDataQueryConditionEXT :: componentTypes içine XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT ekleyerek ve XrSpatialComponentDataQueryResultEXT'nin sonraki işaretçi zincirine XrSpatialComponentMarkerListEXT ekleyerek XrSpatialSnapshotEXT içindeki uzamsal varlıkların işaretçi bileşenini sorgulayabilir.

XrSpatialComponentMarkerListEXT, XrSpatialComponentDataQueryResultEXT :: next öğesinin sonraki zincirindeyse ancak XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes öğesine dahil değilse çalışma zamanı, xrQuerySpatialComponentDataEXT öğesinden XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir.

markerCount, 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_MARKER_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.

Sınırlı 2D Bileşen

Sınırlanmış 2D bileşeni, üzerinde bulunduğu varlık tarafından temsil edilen işaretçinin merkezini ve kapsamını sağlar. Sınırlı 2D bileşeni hakkında daha fazla bilgi için Sınırlı 2D bölümüne bakın.

XrSpatialBounded2DDataEXT :: center must, işaretçinin merkezini göstermelidir. İşaretçinin ön yüzüne bakarken X ekseni sağa, Y ekseni ise işaretçinin üst kısmına doğru olmalıdır. Çalışma zamanı, sağ el koordinat sistemi kuralına uymalıdır. Bu nedenle, Z ekseni işaretçinin ön yüzünden çıkar. Bu, {0, 0, 0} konumuna, {0, 0, 0, 1} dönüşüne (dönüş yok) ve {1, 1} boyutuna sahip bir işaretçinin, {0, 0, 0} merkezli, ön yüz normal vektörü bileşenin alanında +Z yönünü gösteren 1 metre x 1 metrelik bir işaretçiyi ifade ettiği anlamına gelir.

İşaretçinin yönü aşağıda gösterilmiştir.

xr ml işaretçi anlama ekseni

25. şekil. Eksenli QR kodu işaretçisi

Test Kodları

Aşağıdaki kodların X-Y düzlemi belgenin içinde olmalı ve Z ekseni görüntüleyeni göstermelidir. Eksen orijini, her işaretçinin merkezinde görünmelidir. X ekseni sağa, Y ekseni ise belgenin üst kısmına doğru olmalıdır.

ext marker tracking qr

26. şekil. "OpenXR" metnini içeren QR kodu

ext marker tracking apriltag

27. şekil. Kimliği 42 olan AprilTag XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT

ext marker tracking aruco

28. şekil. 43 kimlikli ArUco işaretçisi XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT

Örnek Kod

QR Kodu İzleme Özelliğini Yapılandırma

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

// Check if marker 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_MARKER_TRACKING_QR_CODE_EXT) == capabilities.end()) {
  return;
}

uint32_t featureCount = 0;
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT, 0, &featureCount, nullptr));
std::vector<XrSpatialCapabilityFeatureEXT> capabilityFeatures(featureCount);
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT, featureCount, &featureCount, capabilityFeatures.data()));

bool supportsFixedMarkerSize = std::find(capabilityFeatures.begin(), capabilityFeatures.end(), XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT) != capabilityFeatures.end();

// Create a spatial context
XrSpatialContextEXT spatialContext{};

// Enable the 2 guaranteed components of the qr code tracking capability
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
  XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
  XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT,
};
XrSpatialCapabilityConfigurationQrCodeEXT markerConfiguration{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_QR_CODE_EXT};
markerConfiguration.capability = XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT;
markerConfiguration.enabledComponentCount = static_cast<uint32_t>(enabledComponents.size());
markerConfiguration.enabledComponents = enabledComponents.data();

// only chained if features.markerSideLength is true.
XrSpatialMarkerSizeEXT markerSize{XR_TYPE_SPATIAL_MARKER_SIZE_EXT};
markerSize.markerSideLength = 0.10f;
if (supportsFixedMarkerSize) {
  markerConfiguration.next = &markerSize;
}


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

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_MARKER_TRACKING_QR_CODE_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_2D_EXT,
  XR_SPATIAL_COMPONENT_TYPE_MARKER_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 bounded2D and marker 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<XrSpatialBounded2DDataEXT> bounded2D(queryResult.entityIdCountOutput);
    XrSpatialComponentBounded2DListEXT bounded2DList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT};
    bounded2DList.boundCount = bounded2D.size();
    bounded2DList.bounds = bounded2D.data();
    queryResult.next = &bounded2DList;

    std::vector<XrSpatialMarkerDataEXT> markers;
    XrSpatialComponentMarkerListEXT markerList{XR_TYPE_SPATIAL_COMPONENT_MARKER_LIST_EXT};
    markers.resize(queryResult.entityIdCountOutput);
    markerList.markerCount = markers.size();
    markerList.markers = markers.data();
    bounded2DList.next = &markerList;

    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;
      }

      // 2D bounds for entity entityIds[i] is bounded2D[i].extents centered on bounded2D[i].center.

      if (markers[i].capability == XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT) {
        // Check if marker data has been decoded.
        if (markers[i].data.bufferId != XR_NULL_SPATIAL_BUFFER_ID_EXT) {
          if (markers[i].data.bufferType == XR_SPATIAL_BUFFER_TYPE_STRING_EXT) {
            // Qr Code data can be queried using
            // XrSpatialBufferGetInfoEXT getInfo{XR_TYPE_SPATIAL_BUFFER_GET_INFO_EXT};
            // info.bufferId = markers[i].data.bufferId;
            // xrGetSpatialBufferStringEXT(completion.snapshot, &getInfo, ...)
          } else if (markers[i].data.bufferType == XR_SPATIAL_BUFFER_TYPE_UINT8_EXT) {
            // Qr Code data can be queried using
            // XrSpatialBufferGetInfoEXT getInfo{XR_TYPE_SPATIAL_BUFFER_GET_INFO_EXT};
            // info.bufferId = markers[i].data.bufferId;
            // xrGetSpatialBufferUint8(completion.snapshot, &getInfo, ...)
          }
        }
      }
    }

    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_MARKER_TRACKING_EXTENSION_NAME
  • XR_EXT_spatial_marker_tracking_SPEC_VERSION
  • XrSpatialCapabilityEXT'yi genişletme:

    • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT
    • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT
    • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT
    • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT
  • XrSpatialCapabilityFeatureEXT'yi genişletme:

    • XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT
    • XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT
  • XrSpatialComponentTypeEXT'yi genişletme:

    • XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT
  • XrStructureType'ı genişletme:

    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_APRIL_TAG_EXT
    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ARUCO_MARKER_EXT
    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_MICRO_QR_CODE_EXT
    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_QR_CODE_EXT
    • XR_TYPE_SPATIAL_COMPONENT_MARKER_LIST_EXT
    • XR_TYPE_SPATIAL_MARKER_SIZE_EXT
    • XR_TYPE_SPATIAL_MARKER_STATIC_OPTIMIZATION_EXT

Sürüm Geçmişi

  • Düzeltme 1, 29.07.2024 (Ron Bessems, Meta)

    • İlk uzantı açıklaması