XR_EXT_spatial_marker_tracking
String Nama
XR_EXT_spatial_marker_tracking
Jenis Ekstensi
Ekstensi instance
Nomor Ekstensi Terdaftar
744
Revisi
1
Status Ratifikasi
Diratifikasi
Dependensi Ekstensi dan Versi
XR_EXT_spatial_entity
Kontributor
Ron Bessems, Meta
Nihav Jain, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Yin Li, Microsoft
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
Jun Yan, ByteDance
Ringkasan
Ekstensi ini dibuat berdasarkan XR_EXT_spatial_entity dan memungkinkan aplikasi mendeteksi serta melacak penanda di lingkungannya. Penanda adalah kode 2D yang dapat mencakup Kode QR, Kode QR Mikro, penanda ArUco, atau AprilTag.
Penanda yang dilacak direpresentasikan sebagai entitas spasial dengan (atau "yang memiliki") komponen berikut:
XR_SPATIAL_COMPONENT_TYPE_MARKER_EXTXR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
Dukungan runtime
Runtime harus mengiklankan dukungannya untuk berbagai kemampuan pelacakan penanda menggunakan xrEnumerateSpatialCapabilitiesEXT dengan mencantumkan salah satu kemampuan berikut:
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
Konfigurasi
Untuk mengaktifkan deteksi jenis penanda, aplikasi harus meneruskan struktur konfigurasi yang sesuai ke xrCreateSpatialContextAsyncEXT .
Konfigurasi Jenis Penanda
kode QR
Struktur XrSpatialCapabilityConfigurationQrCodeEXT ditentukan sebagai:
typedef struct XrSpatialCapabilityConfigurationQrCodeEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationQrCodeEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.capabilityharus berupaXR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT.enabledComponentCountadalahuint32_tdengan jumlah elemen dalamenabledComponents.enabledComponentsadalah pointer ke array komponen yang akan diaktifkan untuk kemampuan ini.
Jika kode QR didukung, runtime harus mengaktifkan pelacakan Kode QR saat struktur XrSpatialCapabilityConfigurationQrCodeEXT diteruskan di XrSpatialContextCreateInfoEXT :: capabilityConfigs saat memanggil xrCreateSpatialContextAsyncEXT .
Runtime harus menampilkan XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT jika XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT tidak di-enum oleh xrEnumerateSpatialCapabilitiesEXT .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_marker_trackingharus diaktifkan sebelum menggunakan XrSpatialCapabilityConfigurationQrCodeEXT -
typeharus berupaXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_QR_CODE_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur . Lihat juga: XrSpatialMarkerSizeEXT , XrSpatialMarkerStaticOptimizationEXT -
capabilityharus berupa nilai XrSpatialCapabilityEXT yang valid -
enabledComponentsmust berupa pointer ke array nilaienabledComponentCountXrSpatialComponentTypeEXT yang valid - Parameter
enabledComponentCountharus lebih besar dari0
Kode QR mikro
Struktur XrSpatialCapabilityConfigurationMicroQrCodeEXT ditentukan sebagai:
typedef struct XrSpatialCapabilityConfigurationMicroQrCodeEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationMicroQrCodeEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.capabilityharus berupaXR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT.enabledComponentCountadalahuint32_tdengan jumlah elemen dalamenabledComponents.enabledComponentsadalah pointer ke array komponen yang akan diaktifkan untuk kemampuan ini.
Jika kode QR Mikro didukung, runtime harus mengaktifkan pelacakan Kode QR Mikro saat struktur XrSpatialCapabilityConfigurationMicroQrCodeEXT diteruskan dalam XrSpatialContextCreateInfoEXT :: capabilityConfigs saat memanggil xrCreateSpatialContextAsyncEXT .
Runtime harus menampilkan XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT jika XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT tidak di-enum oleh xrEnumerateSpatialCapabilitiesEXT .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_marker_trackingharus diaktifkan sebelum menggunakan XrSpatialCapabilityConfigurationMicroQrCodeEXT -
typeharus berupaXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_MICRO_QR_CODE_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur . Lihat juga: XrSpatialMarkerSizeEXT , XrSpatialMarkerStaticOptimizationEXT -
capabilityharus berupa nilai XrSpatialCapabilityEXT yang valid -
enabledComponentsmust berupa pointer ke array nilaienabledComponentCountXrSpatialComponentTypeEXT yang valid - Parameter
enabledComponentCountharus lebih besar dari0
Penanda ArUco
Struktur XrSpatialCapabilityConfigurationArucoMarkerEXT ditentukan sebagai:
typedef struct XrSpatialCapabilityConfigurationArucoMarkerEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
XrSpatialMarkerArucoDictEXT arUcoDict;
} XrSpatialCapabilityConfigurationArucoMarkerEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.capabilityharus berupaXR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT.enabledComponentCountadalahuint32_tdengan jumlah elemen dalamenabledComponents.enabledComponentsadalah pointer ke array komponen yang akan diaktifkan untuk kemampuan ini.arUcoDictadalah kamus penanda yang akan dideteksi.
Jika penanda ArUco didukung, runtime harus mengaktifkan pelacakan penanda ArUco saat struktur XrSpatialCapabilityConfigurationArucoMarkerEXT diteruskan dalam XrSpatialContextCreateInfoEXT :: capabilityConfigs saat memanggil xrCreateSpatialContextAsyncEXT .
Runtime harus menampilkan XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT dari xrCreateSpatialContextAsyncEXT jika struktur XrSpatialCapabilityConfigurationArucoMarkerEXT ada di XrSpatialContextCreateInfoEXT :: capabilityConfigs, tetapi XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT tidak di-enum oleh xrEnumerateSpatialCapabilitiesEXT .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_marker_trackingharus diaktifkan sebelum menggunakan XrSpatialCapabilityConfigurationArucoMarkerEXT -
typeharus berupaXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ARUCO_MARKER_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur . Lihat juga: XrSpatialMarkerSizeEXT , XrSpatialMarkerStaticOptimizationEXT -
capabilityharus berupa nilai XrSpatialCapabilityEXT yang valid -
enabledComponentsmust berupa pointer ke array nilaienabledComponentCountXrSpatialComponentTypeEXT yang valid -
arUcoDictharus berupa nilai XrSpatialMarkerArucoDictEXT yang valid - Parameter
enabledComponentCountharus lebih besar dari0
Enumerasi XrSpatialMarkerArucoDictEXT ditentukan sebagai:
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;
Kamus ArUco standar yang didukung:
Deskripsi Enumeran
XR_SPATIAL_MARKER_ARUCO_DICT_4X4_50_EXT— Kamus penanda Aruco 4x4 piksel dengan 50 ID.XR_SPATIAL_MARKER_ARUCO_DICT_4X4_100_EXT— Kamus penanda Aruco 4x4 piksel dengan 100 ID.XR_SPATIAL_MARKER_ARUCO_DICT_4X4_250_EXT— Kamus penanda Aruco 4x4 piksel dengan 250 ID.XR_SPATIAL_MARKER_ARUCO_DICT_4X4_1000_EXT— Kamus penanda Aruco 4x4 piksel dengan 1.000 ID.XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT— Kamus penanda Aruco 5x5 piksel dengan 50 ID.XR_SPATIAL_MARKER_ARUCO_DICT_5X5_100_EXT— Kamus penanda Aruco 5 x 5 piksel dengan 100 ID.XR_SPATIAL_MARKER_ARUCO_DICT_5X5_250_EXT— Kamus penanda Aruco 5x5 piksel dengan 250 ID.XR_SPATIAL_MARKER_ARUCO_DICT_5X5_1000_EXT— Kamus penanda Aruco 5x5 piksel dengan 1.000 ID.XR_SPATIAL_MARKER_ARUCO_DICT_6X6_50_EXT— Kamus penanda Aruco 6x6 piksel dengan 50 ID.XR_SPATIAL_MARKER_ARUCO_DICT_6X6_100_EXT— Kamus penanda Aruco 6x6 piksel dengan 100 ID.XR_SPATIAL_MARKER_ARUCO_DICT_6X6_250_EXT— Kamus penanda Aruco 6x6 piksel dengan 250 ID.XR_SPATIAL_MARKER_ARUCO_DICT_6X6_1000_EXT— Kamus penanda Aruco 6x6 piksel dengan 1.000 ID.XR_SPATIAL_MARKER_ARUCO_DICT_7X7_50_EXT— Kamus penanda Aruco 7x7 piksel dengan 50 ID.XR_SPATIAL_MARKER_ARUCO_DICT_7X7_100_EXT— Kamus penanda Aruco 7x7 piksel dengan 100 ID.XR_SPATIAL_MARKER_ARUCO_DICT_7X7_250_EXT— Kamus penanda Aruco 7x7 piksel dengan 250 ID.XR_SPATIAL_MARKER_ARUCO_DICT_7X7_1000_EXT— Kamus penanda Aruco 7x7 piksel dengan 1.000 ID.
AprilTags
Struktur XrSpatialCapabilityConfigurationAprilTagEXT ditentukan sebagai:
typedef struct XrSpatialCapabilityConfigurationAprilTagEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
XrSpatialMarkerAprilTagDictEXT aprilDict;
} XrSpatialCapabilityConfigurationAprilTagEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.capabilityharus berupaXR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT.enabledComponentCountadalahuint32_tdengan jumlah elemen dalamenabledComponents.enabledComponentsadalah pointer ke array komponen yang akan diaktifkan untuk kemampuan ini.aprilDictadalah kamus penanda yang akan dideteksi.
Jika AprilTag didukung, runtime harus mengaktifkan pelacakan AprilTag saat struktur XrSpatialCapabilityConfigurationAprilTagEXT diteruskan dalam XrSpatialContextCreateInfoEXT :: capabilityConfigs saat memanggil xrCreateSpatialContextAsyncEXT .
Runtime harus menampilkan XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT dari xrCreateSpatialContextAsyncEXT jika struktur XrSpatialCapabilityConfigurationAprilTagEXT ada di XrSpatialContextCreateInfoEXT :: capabilityConfigs, tetapi XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT tidak di-enum oleh xrEnumerateSpatialCapabilitiesEXT .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_marker_trackingharus diaktifkan sebelum menggunakan XrSpatialCapabilityConfigurationAprilTagEXT -
typeharus berupaXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_APRIL_TAG_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur . Lihat juga: XrSpatialMarkerSizeEXT , XrSpatialMarkerStaticOptimizationEXT -
capabilityharus berupa nilai XrSpatialCapabilityEXT yang valid -
enabledComponentsmust berupa pointer ke array nilaienabledComponentCountXrSpatialComponentTypeEXT yang valid -
aprilDictharus berupa nilai XrSpatialMarkerAprilTagDictEXT yang valid - Parameter
enabledComponentCountharus lebih besar dari0
Enumerasi XrSpatialMarkerAprilTagDictEXT ditentukan sebagai:
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;
Kamus AprilTag bawaan yang didukung:
Deskripsi Enumeran
XR_SPATIAL_MARKER_APRIL_TAG_DICT_16H5_EXT— 4 x 4 bit, jarak Hamming minimum antara dua kode = 5, 30 kode.XR_SPATIAL_MARKER_APRIL_TAG_DICT_25H9_EXT— 5 x 5 bit, jarak Hamming minimum antara dua kode = 9, 35 kode.XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H10_EXT— 6 kali 6 bit, jarak Hamming minimum antara dua kode = 10, 2320 kode.XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT— 6 x 6 bit, jarak Hamming minimum antara dua kode = 11, 587 kode.
Konfigurasi Penanda Opsional
Aplikasi harus memanggil xrEnumerateSpatialCapabilityFeaturesEXT untuk mendapatkan daftar fitur opsional yang didukung.
Lihat XrSpatialCapabilityFeatureEXT untuk mengetahui daftar lengkap semua fitur kemampuan spasial yang didukung oleh ekstensi apa pun.
Ukuran Penanda
Struktur XrSpatialMarkerSizeEXT ditentukan sebagai:
typedef struct XrSpatialMarkerSizeEXT {
XrStructureType type;
const void* next;
float markerSideLength;
} XrSpatialMarkerSizeEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.markerSideLengthadalah ukuran semua penanda dalam meter.
Jika XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT di-enum oleh xrEnumerateSpatialCapabilityFeaturesEXT untuk kemampuan tertentu, dan jika aplikasi merangkai XrSpatialMarkerSizeEXT ke struktur konfigurasi yang sesuai dari kemampuan tersebut, runtime harus mengasumsikan bahwa semua penanda yang terdeteksi memiliki lebar dan tinggi markerSideLength . Dengan memberikan informasi ini ke runtime, runtime dapat menampilkan postur dan ukuran yang lebih akurat. Struktur ini harus ditautkan ke rantai next XrSpatialCapabilityConfigurationQrCodeEXT , XrSpatialCapabilityConfigurationMicroQrCodeEXT , XrSpatialCapabilityConfigurationArucoMarkerEXT , atau XrSpatialCapabilityConfigurationAprilTagEXT .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_marker_trackingharus diaktifkan sebelum menggunakan XrSpatialMarkerSizeEXT -
typeharus berupaXR_TYPE_SPATIAL_MARKER_SIZE_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur
Pengoptimalan Penanda Statis
Struktur XrSpatialMarkerStaticOptimizationEXT ditentukan sebagai:
typedef struct XrSpatialMarkerStaticOptimizationEXT {
XrStructureType type;
const void* next;
XrBool32 optimizeForStaticMarker;
} XrSpatialMarkerStaticOptimizationEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.optimizeForStaticMarkermenunjukkan apakah semua penanda di ruang diperkirakan tidak bergerak.
Jika XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT di-enum oleh xrEnumerateSpatialCapabilityFeaturesEXT untuk kemampuan tertentu, dan jika aplikasi merangkai XrSpatialMarkerStaticOptimizationEXT ke struktur konfigurasi yang sesuai dari kemampuan tersebut, runtime harus mengasumsikan bahwa semua penanda yang terdeteksi bersifat statis jika optimizeForStaticMarker disetel ke XR_TRUE . Hal ini memungkinkan runtime menghasilkan pose dan ukuran yang lebih akurat. Struktur ini harus ditautkan ke rantai next XrSpatialCapabilityConfigurationQrCodeEXT , XrSpatialCapabilityConfigurationMicroQrCodeEXT , XrSpatialCapabilityConfigurationArucoMarkerEXT , atau XrSpatialCapabilityConfigurationAprilTagEXT .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_marker_trackingharus diaktifkan sebelum menggunakan XrSpatialMarkerStaticOptimizationEXT -
typeharus berupaXR_TYPE_SPATIAL_MARKER_STATIC_OPTIMIZATION_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur
Komponen yang Dijamin
Runtime yang mendukung 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 , atau XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT harus menyediakan komponen spasial berikut sebagai komponen terjamin dari semua entity yang ditemukan oleh kemampuan tersebut, dan harus mencantumkannya di xrEnumerateSpatialCapabilityComponentTypesEXT :
XR_SPATIAL_COMPONENT_TYPE_MARKER_EXTXR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
Komponen Penanda
Data komponen
Struktur XrSpatialMarkerDataEXT ditentukan sebagai:
typedef struct XrSpatialMarkerDataEXT {
XrSpatialCapabilityEXT capability;
uint32_t markerId;
XrSpatialBufferEXT data;
} XrSpatialMarkerDataEXT;
Deskripsi Anggota
capabilityadalah XrSpatialCapabilityEXT yang mendeteksi penanda.markerIdadalah ID yang dienkode dari penanda. Untuk penanda ArUco dan AprilTag, kolom ini harus valid dan diisi dengan ID yang dienkode. Untuk kode QR, kolom ini harus nol.dataadalah ID buffer dan jenis informasi tambahan yang terdapat dalam penanda.
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT dan XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT mendukung data tambahan. Jika capability adalah salah satu dari berikut ini -
- Jika runtime telah berhasil mendekode data untuk penanda, runtime harus menyetel jenis buffer
datakeXR_SPATIAL_BUFFER_TYPE_UINT8_EXTatauXR_SPATIAL_BUFFER_TYPE_STRING_EXT, bergantung pada data dalam penanda. Runtime juga harus menetapkan ID buffer yang valid didatayang dapat digunakan aplikasi dengan fungsixrGetSpatialBuffer*yang sesuai untuk mendapatkan data. - Jika runtime belum mendekode data penanda, runtime harus menyetel ID buffer
datake XR_NULL_SPATIAL_BUFFER_ID_EXT dan jenis buffer keXR_SPATIAL_BUFFER_TYPE_UNKNOWN_EXT.
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT dan XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT tidak mendukung data tambahan dan runtime harus menyetel ID buffer data ke XR_NULL_SPATIAL_BUFFER_ID_EXT .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_marker_trackingharus diaktifkan sebelum menggunakan XrSpatialMarkerDataEXT -
capabilityharus berupa nilai XrSpatialCapabilityEXT yang valid -
dataharus berupa struktur XrSpatialBufferEXT yang valid
Struktur daftar komponen untuk membuat kueri data
Struktur XrSpatialComponentMarkerListEXT ditentukan sebagai:
typedef struct XrSpatialComponentMarkerListEXT {
XrStructureType type;
void* next;
uint32_t markerCount;
XrSpatialMarkerDataEXT* markers;
} XrSpatialComponentMarkerListEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.markerCountadalah jumlah elemen dalam anggotamarkers.markersadalah array XrSpatialMarkerDataEXT .
Aplikasi dapat mengkueri komponen penanda entitas spasial dalam XrSpatialSnapshotEXT dengan menambahkan XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT di XrSpatialComponentDataQueryConditionEXT :: componentTypes dan menambahkan XrSpatialComponentMarkerListEXT ke rantai penunjuk berikutnya dari XrSpatialComponentDataQueryResultEXT .
Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE dari xrQuerySpatialComponentDataEXT jika XrSpatialComponentMarkerListEXT berada di rantai XrSpatialComponentDataQueryResultEXT berikutnya :: next, tetapi XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT tidak disertakan dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Runtime harus menampilkan XR_ERROR_SIZE_INSUFFICIENT dari xrQuerySpatialComponentDataEXT jika markerCount kurang dari XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_marker_trackingharus diaktifkan sebelum menggunakan XrSpatialComponentMarkerListEXT -
typeharus berupaXR_TYPE_SPATIAL_COMPONENT_MARKER_LIST_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
markersharus berupa pointer ke array strukturmarkerCountXrSpatialMarkerDataEXT - Parameter
markerCountharus lebih besar dari0
Konfigurasi
Jika XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT tercantum dalam XrSpatialCapabilityComponentTypesEXT :: componentTypes untuk beberapa kemampuan, aplikasi dapat mengaktifkannya dengan menyertakan enumerasi dalam daftar XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents dari kemampuan yang mendukung komponen ini.
Komponen ini tidak memerlukan konfigurasi khusus untuk disertakan dalam rantai XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.
Komponen 2D Terikat
Komponen 2D yang dibatasi menyediakan pusat dan rentang penanda yang diwakili oleh entitas yang ada di dalamnya. Lihat 2D Terikat untuk mengetahui detail selengkapnya tentang komponen 2D terikat.
XrSpatialBounded2DDataEXT :: center harus mengarah ke tengah penanda. Saat melihat bagian depan penanda, sumbu X harus mengarah ke kanan, dan sumbu Y harus mengarah ke bagian atas penanda. Runtime harus mengikuti konvensi sistem koordinat tangan kanan sehingga sumbu Z keluar dari sisi depan penanda. Artinya, penanda dengan posisi {0, 0, 0}, rotasi {0, 0, 0, 1} (tanpa rotasi), dan luas {1, 1} merujuk ke penanda 1 meter x 1 meter yang berpusat di {0, 0, 0} dengan vektor normal muka depannya mengarah ke arah +Z dalam ruang komponen.
Representasi orientasi penanda ditampilkan di bawah.
Gambar 25. Penanda kode QR dengan sumbu
Kode Pengujian
Kode berikut harus memiliki bidang X-Y di dalam dokumen dan sumbu Z mengarah ke penampil. Asal sumbu harus muncul di tengah setiap penanda. Sumbu X harus mengarah ke kanan, sumbu Y harus mengarah ke bagian atas dokumen.
Gambar 26. Kode QR dengan teks 'OpenXR'
Gambar 27. AprilTag XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT dengan ID 42
Gambar 28. Penanda ArUco XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT dengan ID 43
Kode Contoh
Mengonfigurasi Kemampuan Pelacakan Kode QR
Contoh kode berikut menunjukkan cara mengonfigurasi kemampuan pelacakan kode QR saat membuat konteks spasial.
// 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));
Menemukan Entitas Spasial & Data Komponen Kueri
Contoh kode berikut menunjukkan cara menemukan entitas spasial untuk konteks yang dikonfigurasi dengan XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_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_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
// ...
}
Struktur Baru
- XrSpatialCapabilityConfigurationAprilTagEXT
- XrSpatialCapabilityConfigurationArucoMarkerEXT
- XrSpatialCapabilityConfigurationMicroQrCodeEXT
- XrSpatialCapabilityConfigurationQrCodeEXT
- XrSpatialMarkerDataEXT
Memperluas XrSpatialCapabilityConfigurationArucoMarkerEXT , XrSpatialCapabilityConfigurationAprilTagEXT , XrSpatialCapabilityConfigurationQrCodeEXT , XrSpatialCapabilityConfigurationMicroQrCodeEXT :
Memperluas XrSpatialComponentDataQueryResultEXT :
Enum Baru
Konstanta Enum Baru
XR_EXT_SPATIAL_MARKER_TRACKING_EXTENSION_NAMEXR_EXT_spatial_marker_tracking_SPEC_VERSIONMemperluas XrSpatialCapabilityEXT :
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
Memperluas XrSpatialCapabilityFeatureEXT :
XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXTXR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT
Memperluas XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT
Memperluas XrStructureType :
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
Riwayat Versi
Revisi 1, 29-07-2024 (Ron Bessems, Meta)
- Deskripsi ekstensi awal