XR_EXT_spatial_marker_tracking
Name String
XR_EXT_spatial_marker_tracking
Uzantı Türü
Örnek uzantısı
Kayıtlı Uzantı Numarası
744
Düzeltme
1
Onay durumu
Onaylanma tarihi
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 kurulmuştur 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 2 boyutlu kodlardır.
İzlenen bir işaretçi, aşağıdaki bileşenlere sahip bir uzamsal öğe olarak gösterilir:
XR_SPATIAL_COMPONENT_TYPE_MARKER_EXTXR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
Çalışma zamanı desteği
Bir çalışma zamanı, aşağıdaki özelliklerden herhangi birini listeleyerek xrEnumerateSpatialCapabilitiesEXT kullanarak çeşitli işaretçi izleme özelliklerine verdiği desteği bildirmelidir:
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXTXR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXTXR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXTXR_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 uygulama, ilgili yapılandırma yapısını xrCreateSpatialContextAsyncEXT'ye geçirmelidir .
İş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'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.capabilityXR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXTolmalıdır .enabledComponentCount,enabledComponentsiçindeki öğe sayısını içeren biruint32_t'dir .enabledComponents, bu özellik için etkinleştirilecek bileşenler dizisine yönelik bir işaretçidir.
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 .
Çalışma zamanı, XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT xrEnumerateSpatialCapabilitiesEXT tarafından numaralandırılmamışsa XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT değerini döndürmelidir.
Geçerli Kullanım (Dolaylı)
- XrSpatialCapabilityConfigurationQrCodeEXT kullanılmadan önce
XR_EXT_spatial_marker_trackinguzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_QR_CODE_EXTolmalıdır. -
nextmust beNULLor a valid pointer to the next structure in a structure chain . Ayrıca bkz: XrSpatialMarkerSizeEXT , XrSpatialMarkerStaticOptimizationEXT -
capabilitygeçerli bir XrSpatialCapabilityEXT değeri olmalıdır. -
enabledComponentsenabledComponentCountgeçerli XrSpatialComponentTypeEXT değerlerinden oluşan bir dizinin işaretçisi olmalıdır. -
enabledComponentCountparametresi değerinden büyük olmalıdır.0
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'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.capabilityXR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXTolmalıdır .enabledComponentCount,enabledComponentsiçindeki öğe sayısını içeren biruint32_t'dir .enabledComponents, bu özellik için etkinleştirilecek bileşenler dizisine yönelik bir işaretçidir.
Micro QR kodları destekleniyorsa çalışma zamanı, xrCreateSpatialContextAsyncEXT çağrılırken XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde XrSpatialCapabilityConfigurationMicroQrCodeEXT yapısı geçirildiğinde Micro QR kodu izlemeyi etkinleştirmelidir .
Çalışma zamanı, XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT xrEnumerateSpatialCapabilitiesEXT tarafından numaralandırılmamışsa XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT değerini döndürmelidir.
Geçerli Kullanım (Dolaylı)
- XrSpatialCapabilityConfigurationMicroQrCodeEXT kullanılmadan önce
XR_EXT_spatial_marker_trackinguzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_MICRO_QR_CODE_EXTolmalıdır. -
nextmust beNULLor a valid pointer to the next structure in a structure chain . Ayrıca bkz: XrSpatialMarkerSizeEXT , XrSpatialMarkerStaticOptimizationEXT -
capabilitygeçerli bir XrSpatialCapabilityEXT değeri olmalıdır. -
enabledComponentsenabledComponentCountgeçerli XrSpatialComponentTypeEXT değerlerinden oluşan bir dizinin işaretçisi olmalıdır. -
enabledComponentCountparametresi değerinden büyük olmalıdır.0
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'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.capabilityXR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXTolmalıdır .enabledComponentCount,enabledComponentsiçindeki öğe sayısını içeren biruint32_t'dir .enabledComponents, bu özellik için etkinleştirilecek bileşenler dizisine yönelik bir işaretçidir.arUcoDict, algılanacak işaretleyici sözlüktü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 izlemeyi etkinleştirmelidir .
Çalışma zamanı, XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde bir XrSpatialCapabilityConfigurationArucoMarkerEXT yapısı varsa ancak XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT, xrEnumerateSpatialCapabilitiesEXT tarafından numaralandırılmamışsa xrCreateSpatialContextAsyncEXT işlevinden XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT değerini döndürmelidir .
Geçerli Kullanım (Dolaylı)
-
XR_EXT_spatial_marker_trackinguzantısı, XrSpatialCapabilityConfigurationArucoMarkerEXT kullanılmadan önce etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ARUCO_MARKER_EXTolmalıdır. -
nextmust beNULLor a valid pointer to the next structure in a structure chain . Ayrıca bkz: XrSpatialMarkerSizeEXT , XrSpatialMarkerStaticOptimizationEXT -
capabilitygeçerli bir XrSpatialCapabilityEXT değeri olmalıdır. -
enabledComponentsenabledComponentCountgeçerli XrSpatialComponentTypeEXT değerlerinden oluşan bir dizinin işaretçisi olmalıdır. -
arUcoDictgeçerli bir XrSpatialMarkerArucoDictEXT değeri olmalıdır. -
enabledComponentCountparametresi değerinden büyük olmalıdır.0
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ırılmış Değer Açıklamaları
XR_SPATIAL_MARKER_ARUCO_DICT_4X4_50_EXT— 50 kimlikli 4x4 piksel Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_4X4_100_EXT: 100 kimlikli 4x4 piksellik Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_4X4_250_EXT: 250 kimlikli, 4x4 piksellik Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_4X4_1000_EXT— 1.000 kimliğe sahip 4x4 piksellik Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT: 50 kimlikli, 5x5 piksellik Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_5X5_100_EXT: 100 kimlikli 5x5 piksellik Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_5X5_250_EXT: 250 kimlikli, 5x5 piksellik Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_5X5_1000_EXT: 1.000 kimliğe sahip 5x5 piksellik Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_6X6_50_EXT: 50 kimlikli, 6 x 6 piksel Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_6X6_100_EXT: 100 kimlikli 6x6 piksellik Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_6X6_250_EXT: 250 kimlikli 6 x 6 piksel Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_6X6_1000_EXT: 1.000 kimliğe sahip 6x6 piksellik Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_7X7_50_EXT: 50 kimlikli, 7x7 piksellik Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_7X7_100_EXT: 100 kimlikli 7x7 piksellik Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_7X7_250_EXT: 250 kimlikli, 7x7 piksellik Aruco işaretleyici sözlüğü.XR_SPATIAL_MARKER_ARUCO_DICT_7X7_1000_EXT: 1.000 kimliğe sahip 7x7 piksellik Aruco işaretleyici 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'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.capabilityXR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXTolmalıdır .enabledComponentCount,enabledComponentsiçindeki öğe sayısını içeren biruint32_t'dir .enabledComponents, bu özellik için etkinleştirilecek bileşenler dizisine yönelik bir işaretçidir.aprilDict, algılanacak işaretleyici sözlüktür.
AprilTag'ler destekleniyorsa çalışma zamanı, xrCreateSpatialContextAsyncEXT çağrılırken XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde bir XrSpatialCapabilityConfigurationAprilTagEXT yapısı geçirildiğinde AprilTag izlemeyi etkinleştirmelidir .
Bir XrSpatialCapabilityConfigurationAprilTagEXT yapısı XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde bulunuyorsa ancak XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT, xrEnumerateSpatialCapabilitiesEXT tarafından numaralandırılmıyorsa çalışma zamanı xrCreateSpatialContextAsyncEXT işlevinden XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT değerini döndürmelidir.
Geçerli Kullanım (Dolaylı)
- XrSpatialCapabilityConfigurationAprilTagEXT kullanılmadan önce
XR_EXT_spatial_marker_trackinguzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_APRIL_TAG_EXTolmalıdır. -
nextmust beNULLor a valid pointer to the next structure in a structure chain . Ayrıca bkz: XrSpatialMarkerSizeEXT , XrSpatialMarkerStaticOptimizationEXT -
capabilitygeçerli bir XrSpatialCapabilityEXT değeri olmalıdır. -
enabledComponentsenabledComponentCountgeçerli XrSpatialComponentTypeEXT değerlerinden oluşan bir dizinin işaretçisi olmalıdır. -
aprilDictgeçerli bir XrSpatialMarkerAprilTagDictEXT değeri olmalıdır. -
enabledComponentCountparametresi değerinden büyük olmalıdır.0
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ırılmış Değer Açıklamaları
XR_SPATIAL_MARKER_APRIL_TAG_DICT_16H5_EXT: 4 x 4 bit, herhangi iki kod arasındaki minimum Hamming mesafesi = 5, 30 kod.XR_SPATIAL_MARKER_APRIL_TAG_DICT_25H9_EXT: 5x5 bit, herhangi iki kod arasındaki minimum Hamming mesafesi = 9, 35 kod.XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H10_EXT— 6 x 6 bit, herhangi iki kod arasındaki minimum Hamming mesafesi = 10, 2320 kod.XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT: 6 x 6 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'yi çağırmalıdır.
Herhangi bir uzantı tarafından desteklenen tüm mekansal özelliklerin tam listesi için XrSpatialCapabilityFeatureEXT'ye 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'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.markerSideLength, tüm işaretçilerin metre cinsinden boyutudur.
Belirli bir özellik için XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT, xrEnumerateSpatialCapabilityFeaturesEXT tarafından numaralandırılıyorsa ve uygulama, XrSpatialMarkerSizeEXT'i bu özelliğin karşılık gelen yapılandırma yapısına zincirliyorsa çalışma zamanı, algılanan tüm işaretlerin 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 next zincirine bağlanmalıdır .
Geçerli Kullanım (Dolaylı)
-
XR_EXT_spatial_marker_trackinguzantısı, XrSpatialMarkerSizeEXT kullanılmadan önce etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_MARKER_SIZE_EXTolmalıdır. -
nextzorunlu olarakNULLveya bir yapı zincirindeki sonraki yapıya yönelik geçerli bir işaretçi olmalıdır.
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'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.optimizeForStaticMarker, alandaki tüm işaretçilerin hareket etmemesinin beklendiğini gösterir.
XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT, belirli bir capability nesnesi için xrEnumerateSpatialCapabilityFeaturesEXT tarafından numaralandırılmışsa ve uygulama, XrSpatialMarkerStaticOptimizationEXT öğesini bu capability nesnesinin karşılık gelen yapılandırma yapısına zincirliyorsa çalışma zamanı, optimizeForStaticMarker XR_TRUE olarak ayarlanmışsa algılanan tüm işaretçilerin statik olduğunu varsaymalıdır . Bu sayede çalışma zamanı daha doğru bir poz ve boyut oluşturabilir. Bu yapı , XrSpatialCapabilityConfigurationQrCodeEXT , XrSpatialCapabilityConfigurationMicroQrCodeEXT , XrSpatialCapabilityConfigurationArucoMarkerEXT veya XrSpatialCapabilityConfigurationAprilTagEXT next zincirine bağlanmalıdır .
Geçerli Kullanım (Dolaylı)
-
XR_EXT_spatial_marker_trackinguzantısı, XrSpatialMarkerStaticOptimizationEXT kullanılmadan önce etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_MARKER_STATIC_OPTIMIZATION_EXTolmalıdır. -
nextzorunlu olarakNULLveya bir yapı zincirindeki sonraki yapıya yönelik geçerli bir işaretçi olmalıdır.
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'ü destekleyen bir çalışma zamanı, bu özellikler tarafından keşfedilen tüm varlıkların garantili bileşenleri olarak aşağıdaki uzamsal bileşenleri sağlamalı ve bunları xrEnumerateSpatialCapabilityComponentTypesEXT içinde numaralandırmalıdır:
XR_SPATIAL_COMPONENT_TYPE_MARKER_EXTXR_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çiden alınan 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 arabellek kimliği ve türüdür.
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT ve XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT, ek verileri destekler. capability şu karakterlerden biriyse:
- Çalışma zamanı, işaretçi için verilerin kodunu başarıyla çözdüyse işaretçideki verilere bağlı olarak
dataarabellek türünüXR_SPATIAL_BUFFER_TYPE_UINT8_EXTveyaXR_SPATIAL_BUFFER_TYPE_STRING_EXTolarak ayarlamalıdır. Çalışma zamanı, uygulamanın verileri almak için uygunxrGetSpatialBuffer*işleviyle kullanabileceğidataiçinde geçerli bir arabellek kimliği de ayarlamalıdır. - Çalışma zamanı, işaretçinin verilerini henüz kod çözmediyse
dataarabellek kimliğini XR_NULL_SPATIAL_BUFFER_ID_EXT, arabellek türünü iseXR_SPATIAL_BUFFER_TYPE_UNKNOWN_EXTolarak ayarlamalıdır .
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ı)
- XrSpatialMarkerDataEXT kullanılmadan önce
XR_EXT_spatial_marker_trackinguzantısı etkinleştirilmelidir. -
capabilitygeçerli bir XrSpatialCapabilityEXT değeri olmalıdır. -
datageçerli bir XrSpatialBufferEXT yapısı olmalıdır.
Verilere sorgu uygulamak 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'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir. Temel OpenXR'de veya bu uzantıda bu tür yapılar tanımlanmamıştır.markerCount,markersüyesindeki öğe sayısıdır.markers, XrSpatialMarkerDataEXT dizisidir .
Uygulama, XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT ekleyerek XrSpatialSnapshotEXT içindeki uzamsal öğelerin işaretçi bileşenini XrSpatialComponentDataQueryConditionEXT :: componentTypes sorgulayabilir ve XrSpatialComponentDataQueryResultEXT öğesinin sonraki işaretçi zincirine XrSpatialComponentMarkerListEXT ekleyebilir.
Çalışma zamanı, XrSpatialComponentMarkerListEXT, XrSpatialComponentDataQueryResultEXT :: next zincirinde yer alıyorsa ancak XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde yer almıyorsa xrQuerySpatialComponentDataEXT'den XR_ERROR_VALIDATION_FAILURE döndürmelidir.
Çalışma zamanı, markerCount değeri XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse xrQuerySpatialComponentDataEXT işlevinden XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir.
Geçerli Kullanım (Dolaylı)
-
XR_EXT_spatial_marker_trackinguzantısı, XrSpatialComponentMarkerListEXT kullanılmadan önce etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_COMPONENT_MARKER_LIST_EXTolmalıdır. -
nextzorunlu olarakNULLveya bir yapı zincirindeki sonraki yapıya yönelik geçerli bir işaretçi olmalıdır. -
markersmarkerCountXrSpatialMarkerDataEXT yapılarının dizisine yönelik bir işaretçi olmalıdır. -
markerCountparametresi değerinden büyük olmalıdır.0
Yapılandırma
Bazı özellikler için XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT, XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde numaralandırılıyorsa bir uygulama, bu bileşeni destekleyen özelliğin XrSpatialCapabilityConfigurationBaseHeaderEXT türetilmiş yapısının XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine numaralandırılmış değeri ekleyerek bu özelliği etkinleştirebilir.
Bu bileşenin XrSpatialCapabilityConfigurationBaseHeaderEXT :: next zincirine dahil edilmesi için özel bir yapılandırma gerekmez.
Sınırlanmış 2D Bileşen
Sınırlı 2D bileşen, üzerinde bulunduğu öğe tarafından temsil edilen işaretçinin merkezini ve kapsamlarını sağlar. Sınırlı 2D bileşeni hakkında daha fazla bilgi için Sınırlı 2D başlıklı makaleyi inceleyin.
XrSpatialBounded2DDataEXT :: center işaretçinin merkezini göstermelidir. İşaretleyicinin ön yüzüne bakıldığında X ekseni sağa, Y ekseni ise işaretleyicinin üstüne doğru bakmalıdır. Çalışma zamanı, sağ el koordinat sistemi kuralına uymalıdır. Bu nedenle Z ekseni, işaretleyicinin ön yüzünden çıkar. Bu, {0, 0, 0} konumuna, {0, 0, 0, 1} döndürmesine (döndürme yok) ve {1, 1} boyutuna sahip bir işaretçinin, bileşenin alanında ön yüzü normal vektörü +Z yönüne doğru bakan, {0, 0, 0} merkezli 1 metre x 1 metre boyutunda bir işaretçiyi ifade ettiği anlamına gelir.
İşaretçinin yönünün temsili aşağıda gösterilmektedir.
Şekil 25. Eksenli QR kodu işaretçisi
Test Kodları
Aşağıdaki kodların X-Y düzlemi belgenin içinde, Z ekseni ise izleyiciye dönük olmalıdır. Eksen başlangıcı, 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.
Şekil 26. "OpenXR" metnini içeren QR kodu
Şekil 27. Kimliği 42 olan AprilTag XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT
Şekil 28. Kimliği 43 olan ArUco işaretçisi XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT
Örnek Kod
QR kodu izleme özelliğini yapılandırma
Aşağıdaki örnek kodda, mekansal 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));
Uzamsal öğeleri keşfetme ve bileşen verilerini sorgulama
Aşağıdaki örnek kod, XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT ile yapılandırılmış bir bağlam için uzamsal öğelerin nasıl keşfedileceğini ve bileşen verilerinin nasıl sorgulanacağını gösterir.
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
- XrSpatialCapabilityConfigurationAprilTagEXT
- XrSpatialCapabilityConfigurationArucoMarkerEXT
- XrSpatialCapabilityConfigurationMicroQrCodeEXT
- XrSpatialCapabilityConfigurationQrCodeEXT
- XrSpatialMarkerDataEXT
XrSpatialCapabilityConfigurationArucoMarkerEXT , XrSpatialCapabilityConfigurationAprilTagEXT , XrSpatialCapabilityConfigurationQrCodeEXT , XrSpatialCapabilityConfigurationMicroQrCodeEXT genişletiliyor :
XrSpatialComponentDataQueryResultEXT'yi genişletme :
Yeni Sıralamalar
Yeni Enum Sabitleri
XR_EXT_SPATIAL_MARKER_TRACKING_EXTENSION_NAMEXR_EXT_spatial_marker_tracking_SPEC_VERSIONXrSpatialCapabilityEXT uzatılıyor :
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXTXR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXTXR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXTXR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT
XrSpatialCapabilityFeatureEXT uzatma :
XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXTXR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT
XrSpatialComponentTypeEXT'yi genişletme :
XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT
XrStructureType uzatma :
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_APRIL_TAG_EXTXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ARUCO_MARKER_EXTXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_MICRO_QR_CODE_EXTXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_QR_CODE_EXTXR_TYPE_SPATIAL_COMPONENT_MARKER_LIST_EXTXR_TYPE_SPATIAL_MARKER_SIZE_EXTXR_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ı