XR_EXT_spatial_marker_tracking
سلسلة الاسم
XR_EXT_spatial_marker_tracking
نوع الإضافة
إضافة مثيل
رقم الإضافة المسجَّل
744
المراجعة
1
حالة التصديق
تم التصديق عليه
الاعتماديات على الإضافات والإصدارات
XR_EXT_spatial_entity
المساهمون
رون بيسيمز، Meta
نيهاف جاين، Google
ناتالي فلوري، Meta
يويتشي تاغوتشي، Meta
يين لي، Microsoft
جيمي ألامبارامبيل، ByteDance
تشيبينغ ليو، ByteDance
جون يان، ByteDance
نظرة عامة
تستند هذه الإضافة إلى XR_EXT_spatial_entity وتسمح للتطبيقات برصد العلامات وتتبُّعها في بيئتها. العلامات هي رموز ثنائية الأبعاد قد تتضمّن رموز استجابة سريعة أو رموز استجابة سريعة صغيرة أو علامات ArUco أو علامات AprilTag.
يتم تمثيل العلامة التي يتم تتبّعها ككيان مكاني يتضمّن المكوّنات التالية (أو "التي تتضمّن"):
XR_SPATIAL_COMPONENT_TYPE_MARKER_EXTXR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
دعم وقت التشغيل
يجب أن تعلن بيئة التشغيل عن توافقها مع إمكانات تتبُّع العلامات المختلفة باستخدام xrEnumerateSpatialCapabilitiesEXT من خلال إدراج أيّ من الإمكانات التالية:
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
الإعداد
لتفعيل رصد نوع علامة، يجب أن يمرِّر التطبيق بنية الإعدادات المقابلة إلى xrCreateSpatialContextAsyncEXT .
إعدادات أنواع العلامات
رموز الاستجابة السريعة
يتم تعريف بنية XrSpatialCapabilityConfigurationQrCodeEXT على النحو التالي:
typedef struct XrSpatialCapabilityConfigurationQrCodeEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationQrCodeEXT;
أوصاف الأعضاء
typeهو XrStructureType لهذه البنية.nextهيNULLأو مؤشر إلى البنية التالية في سلسلة البنية.- يجب أن يكون
capabilityXR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT. -
enabledComponentCountهيuint32_tتتضمّن عدد العناصر فيenabledComponents. enabledComponentsهو مؤشر إلى مصفوفة من المكوّنات التي يجب تفعيلها لهذه الإمكانية.
في حال توفّر رموز الاستجابة السريعة، يجب أن يفعّل وقت التشغيل ميزة تتبُّع رموز الاستجابة السريعة عند تمرير بنية XrSpatialCapabilityConfigurationQrCodeEXT في XrSpatialContextCreateInfoEXT :: capabilityConfigs عند استدعاء xrCreateSpatialContextAsyncEXT.
يجب أن يعرض وقت التشغيل XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT إذا لم يتم تعداد XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT بواسطة xrEnumerateSpatialCapabilitiesEXT .
الاستخدام الصحيح (الضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_marker_trackingقبل استخدام XrSpatialCapabilityConfigurationQrCodeEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_QR_CODE_EXT - يجب أن تكون قيمة
nextهيNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البِنى. راجِع أيضًا: XrSpatialMarkerSizeEXT وXrSpatialMarkerStaticOptimizationEXT - يجب أن تكون قيمة
capabilityصالحة XrSpatialCapabilityEXT - يجب أن يكون
enabledComponentsمؤشرًا إلى مصفوفة من قيم XrSpatialComponentTypeEXT صالحةenabledComponentCount - يجب أن تكون قيمة المَعلمة
enabledComponentCountأكبر من0
رموز الاستجابة السريعة الصغيرة
يتم تعريف بنية XrSpatialCapabilityConfigurationMicroQrCodeEXT على النحو التالي:
typedef struct XrSpatialCapabilityConfigurationMicroQrCodeEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationMicroQrCodeEXT;
أوصاف الأعضاء
typeهو XrStructureType لهذه البنية.nextهيNULLأو مؤشر إلى البنية التالية في سلسلة البنية.- يجب أن يكون
capabilityXR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT. -
enabledComponentCountهيuint32_tتتضمّن عدد العناصر فيenabledComponents. enabledComponentsهو مؤشر إلى مصفوفة من المكوّنات التي يجب تفعيلها لهذه الإمكانية.
في حال توفّر رموز الاستجابة السريعة الصغيرة، يجب أن يفعّل وقت التشغيل تتبُّع رموز الاستجابة السريعة الصغيرة عند تمرير بنية XrSpatialCapabilityConfigurationMicroQrCodeEXT في XrSpatialContextCreateInfoEXT :: capabilityConfigs عند استدعاء xrCreateSpatialContextAsyncEXT .
يجب أن يعرض وقت التشغيل القيمة must XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT إذا لم يتم تعداد XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT بواسطة xrEnumerateSpatialCapabilitiesEXT .
الاستخدام الصحيح (الضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_marker_trackingقبل استخدام XrSpatialCapabilityConfigurationMicroQrCodeEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_MICRO_QR_CODE_EXT - يجب أن تكون قيمة
nextهيNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البِنى. راجِع أيضًا: XrSpatialMarkerSizeEXT وXrSpatialMarkerStaticOptimizationEXT - يجب أن تكون قيمة
capabilityصالحة XrSpatialCapabilityEXT - يجب أن يكون
enabledComponentsمؤشرًا إلى مصفوفة من قيم XrSpatialComponentTypeEXT صالحةenabledComponentCount - يجب أن تكون قيمة المَعلمة
enabledComponentCountأكبر من0
علامات ArUco
يتم تعريف بنية XrSpatialCapabilityConfigurationArucoMarkerEXT على النحو التالي:
typedef struct XrSpatialCapabilityConfigurationArucoMarkerEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
XrSpatialMarkerArucoDictEXT arUcoDict;
} XrSpatialCapabilityConfigurationArucoMarkerEXT;
أوصاف الأعضاء
typeهو XrStructureType لهذه البنية.nextهيNULLأو مؤشر إلى البنية التالية في سلسلة البنية.- يجب أن يكون
capabilityXR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT. -
enabledComponentCountهيuint32_tتتضمّن عدد العناصر فيenabledComponents. enabledComponentsهو مؤشر إلى مصفوفة من المكوّنات التي يجب تفعيلها لهذه الإمكانية.-
arUcoDictهو قاموس العلامات المطلوب رصده.
في حال توفّر علامات ArUco، يجب أن يفعّل وقت التشغيل ميزة تتبُّع علامات ArUco عند تمرير بنية XrSpatialCapabilityConfigurationArucoMarkerEXT في XrSpatialContextCreateInfoEXT :: capabilityConfigs عند استدعاء xrCreateSpatialContextAsyncEXT.
يجب أن تعرض بيئة التشغيل XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT من xrCreateSpatialContextAsyncEXT إذا كان هناك بنية XrSpatialCapabilityConfigurationArucoMarkerEXT في XrSpatialContextCreateInfoEXT :: capabilityConfigs ولكن لم يتم تعداد XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT بواسطة xrEnumerateSpatialCapabilitiesEXT .
الاستخدام الصحيح (الضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_marker_trackingقبل استخدام XrSpatialCapabilityConfigurationArucoMarkerEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ARUCO_MARKER_EXT - يجب أن تكون قيمة
nextهيNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البِنى. راجِع أيضًا: XrSpatialMarkerSizeEXT وXrSpatialMarkerStaticOptimizationEXT - يجب أن تكون قيمة
capabilityصالحة XrSpatialCapabilityEXT - يجب أن يكون
enabledComponentsمؤشرًا إلى مصفوفة من قيم XrSpatialComponentTypeEXT صالحةenabledComponentCount - يجب أن تكون قيمة
arUcoDictXrSpatialMarkerArucoDictEXT صالحة - يجب أن تكون قيمة المَعلمة
enabledComponentCountأكبر من0
يتم تعريف التعداد XrSpatialMarkerArucoDictEXT على النحو التالي:
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;
قاموس ArUco المحدّد مسبقًا والمتوافق:
أوصاف القيم المُعدَّدة
-
XR_SPATIAL_MARKER_ARUCO_DICT_4X4_50_EXT: قاموس علامات Aruco بحجم 4 × 4 بكسل مع 50 معرّفًا -
XR_SPATIAL_MARKER_ARUCO_DICT_4X4_100_EXT— قاموس علامات Aruco بحجم 4 × 4 بكسل يتضمّن 100 معرّف. -
XR_SPATIAL_MARKER_ARUCO_DICT_4X4_250_EXT: قاموس علامات Aruco بحجم 4 × 4 بكسل يتضمّن 250 معرّفًا. -
XR_SPATIAL_MARKER_ARUCO_DICT_4X4_1000_EXT— قاموس علامات Aruco بحجم 4 × 4 بكسل يتضمّن 1,000 معرّف. -
XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT: قاموس علامات Aruco المكوّنة من 5 × 5 بكسل مع 50 معرّفًا. -
XR_SPATIAL_MARKER_ARUCO_DICT_5X5_100_EXT: قاموس علامات Aruco بحجم 5 × 5 بكسل يتضمّن 100 معرّف. -
XR_SPATIAL_MARKER_ARUCO_DICT_5X5_250_EXT: قاموس علامات Aruco المكوّنة من 5 × 5 بكسل مع 250 معرّفًا. -
XR_SPATIAL_MARKER_ARUCO_DICT_5X5_1000_EXT— قاموس علامات Aruco بحجم 5 × 5 بكسل يتضمّن 1,000 معرّف. -
XR_SPATIAL_MARKER_ARUCO_DICT_6X6_50_EXT: قاموس علامات Aruco بحجم 6 × 6 بكسل يتضمّن 50 معرّفًا. -
XR_SPATIAL_MARKER_ARUCO_DICT_6X6_100_EXT: قاموس علامات Aruco بحجم 6 × 6 بكسل يتضمّن 100 معرّف. -
XR_SPATIAL_MARKER_ARUCO_DICT_6X6_250_EXT: قاموس علامات Aruco بحجم 6 × 6 بكسل مع 250 معرّفًا. -
XR_SPATIAL_MARKER_ARUCO_DICT_6X6_1000_EXT: قاموس علامات Aruco بحجم 6 × 6 بكسل مع 1,000 معرّف -
XR_SPATIAL_MARKER_ARUCO_DICT_7X7_50_EXT: قاموس علامات Aruco بحجم 7 × 7 بكسل مع 50 معرّفًا -
XR_SPATIAL_MARKER_ARUCO_DICT_7X7_100_EXT— قاموس علامات Aruco بحجم 7 × 7 بكسل يتضمّن 100 معرّف. -
XR_SPATIAL_MARKER_ARUCO_DICT_7X7_250_EXT: قاموس علامات Aruco بحجم 7 × 7 بكسل يتضمّن 250 معرّفًا. -
XR_SPATIAL_MARKER_ARUCO_DICT_7X7_1000_EXT— قاموس علامات Aruco بحجم 7 × 7 بكسل مع 1,000 معرّف.
AprilTags
يتم تعريف بنية XrSpatialCapabilityConfigurationAprilTagEXT على النحو التالي:
typedef struct XrSpatialCapabilityConfigurationAprilTagEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
XrSpatialMarkerAprilTagDictEXT aprilDict;
} XrSpatialCapabilityConfigurationAprilTagEXT;
أوصاف الأعضاء
typeهو XrStructureType لهذه البنية.nextهيNULLأو مؤشر إلى البنية التالية في سلسلة البنية.- يجب أن يكون
capabilityXR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT. -
enabledComponentCountهيuint32_tتتضمّن عدد العناصر فيenabledComponents. enabledComponentsهو مؤشر إلى مصفوفة من المكوّنات التي يجب تفعيلها لهذه الإمكانية.-
aprilDictهو قاموس العلامات المطلوب رصده.
في حال توفُّر دعم AprilTag، يجب أن يفعّل وقت التشغيل تتبُّع AprilTag عند تمرير بنية XrSpatialCapabilityConfigurationAprilTagEXT في XrSpatialContextCreateInfoEXT :: capabilityConfigs عند استدعاء xrCreateSpatialContextAsyncEXT.
يجب أن تعرض بيئة التشغيل XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT من xrCreateSpatialContextAsyncEXT إذا كان هناك بنية XrSpatialCapabilityConfigurationAprilTagEXT في XrSpatialContextCreateInfoEXT :: capabilityConfigs ولكن لم يتم تعداد XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT بواسطة xrEnumerateSpatialCapabilitiesEXT .
الاستخدام الصحيح (الضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_marker_trackingقبل استخدام XrSpatialCapabilityConfigurationAprilTagEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_APRIL_TAG_EXT - يجب أن تكون قيمة
nextهيNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البِنى. راجِع أيضًا: XrSpatialMarkerSizeEXT وXrSpatialMarkerStaticOptimizationEXT - يجب أن تكون قيمة
capabilityصالحة XrSpatialCapabilityEXT - يجب أن يكون
enabledComponentsمؤشرًا إلى مصفوفة من قيم XrSpatialComponentTypeEXT صالحةenabledComponentCount - يجب أن تكون قيمة
aprilDictصالحة XrSpatialMarkerAprilTagDictEXT - يجب أن تكون قيمة المَعلمة
enabledComponentCountأكبر من0
يتم تعريف التعداد XrSpatialMarkerAprilTagDictEXT على النحو التالي:
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;
قائمة قواميس AprilTag المحدّدة مسبقًا والمتوافقة:
أوصاف القيم المُعدَّدة
-
XR_SPATIAL_MARKER_APRIL_TAG_DICT_16H5_EXT— 4 × 4 بت، الحد الأدنى لمسافة هامينغ بين أي رمزين = 5، 30 رمزًا XR_SPATIAL_MARKER_APRIL_TAG_DICT_25H9_EXT— 5 × 5 بت، الحدّ الأدنى لمسافة هامينغ بين أي رمزين = 9، 35 رمزًاXR_SPATIAL_MARKER_APRIL_TAG_DICT_36H10_EXT— 6 × 6 بت، الحدّ الأدنى لمسافة هامينغ بين أي رمزين يساوي 10، وعدد الرموز 2320.XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT— 6 × 6 بت، الحدّ الأدنى لمسافة هامينغ بين أي رمزين يساوي 11، وعدد الرموز 587.
إعدادات العلامات الاختيارية
راجِع XrSpatialCapabilityFeatureEXT للحصول على قائمة كاملة بجميع ميزات إمكانات تحديد الموقع المكاني التي تتيحها أي إضافة.
حجم العلامة
يتم تعريف بنية XrSpatialMarkerSizeEXT على النحو التالي:
typedef struct XrSpatialMarkerSizeEXT {
XrStructureType type;
const void* next;
float markerSideLength;
} XrSpatialMarkerSizeEXT;
أوصاف الأعضاء
typeهو XrStructureType لهذه البنية.nextهيNULLأو مؤشر إلى البنية التالية في سلسلة البنية.markerSideLengthهو حجم جميع العلامات بالمتر.
إذا تم تعداد XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT بواسطة xrEnumerateSpatialCapabilityFeaturesEXT لإحدى الإمكانات، وإذا ربط التطبيق XrSpatialMarkerSizeEXT ببنية الإعدادات المقابلة لهذه الإمكانية، يجب أن يفترض وقت التشغيل أنّ جميع العلامات التي تم رصدها لها عرض وارتفاع يبلغ markerSideLength . يسمح توفير هذه المعلومات لوقت التشغيل بعرض وضع وحجم أكثر دقة. يجب ربط هذه البنية بسلسلة next من XrSpatialCapabilityConfigurationQrCodeEXT أو XrSpatialCapabilityConfigurationMicroQrCodeEXT أو XrSpatialCapabilityConfigurationArucoMarkerEXT أو XrSpatialCapabilityConfigurationAprilTagEXT.
الاستخدام الصحيح (الضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_marker_trackingقبل استخدام XrSpatialMarkerSizeEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_MARKER_SIZE_EXT - يجب أن تكون قيمة
nextهيNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البِنى
تحسين العلامات الثابتة
يتم تعريف بنية XrSpatialMarkerStaticOptimizationEXT على النحو التالي:
typedef struct XrSpatialMarkerStaticOptimizationEXT {
XrStructureType type;
const void* next;
XrBool32 optimizeForStaticMarker;
} XrSpatialMarkerStaticOptimizationEXT;
أوصاف الأعضاء
typeهو XrStructureType لهذه البنية.nextهيNULLأو مؤشر إلى البنية التالية في سلسلة البنية.- تشير
optimizeForStaticMarkerإلى ما إذا كان من المتوقّع ألا تتحرّك جميع العلامات في المساحة.
إذا تم تعداد XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT بواسطة xrEnumerateSpatialCapabilityFeaturesEXT لإحدى الإمكانات، وإذا ربط التطبيق XrSpatialMarkerStaticOptimizationEXT ببنية الإعدادات المقابلة لهذه الإمكانية، يجب أن يفترض وقت التشغيل أنّ جميع العلامات التي تم رصدها ثابتة إذا تم ضبط optimizeForStaticMarker على XR_TRUE . ويسمح ذلك لوقت التشغيل بإنشاء وضع وحجم أكثر دقةً. يجب ربط هذه البنية بسلسلة next من XrSpatialCapabilityConfigurationQrCodeEXT أو XrSpatialCapabilityConfigurationMicroQrCodeEXT أو XrSpatialCapabilityConfigurationArucoMarkerEXT أو XrSpatialCapabilityConfigurationAprilTagEXT.
الاستخدام الصحيح (الضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_marker_trackingقبل استخدام XrSpatialMarkerStaticOptimizationEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_MARKER_STATIC_OPTIMIZATION_EXT - يجب أن تكون قيمة
nextهيNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البِنى
المكوّنات المضمونة
يجب أن يوفّر وقت التشغيل الذي يتوافق مع 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 ما يلي من المكوّنات المكانية كمكوّنات مضمونة لجميع الكيانات التي يتم رصدها من خلال هذه الإمكانات، ويجب إدراجها في xrEnumerateSpatialCapabilityComponentTypesEXT :
XR_SPATIAL_COMPONENT_TYPE_MARKER_EXTXR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
مكوّن العلامة
بيانات المكوّن
يتم تعريف بنية XrSpatialMarkerDataEXT على النحو التالي:
typedef struct XrSpatialMarkerDataEXT {
XrSpatialCapabilityEXT capability;
uint32_t markerId;
XrSpatialBufferEXT data;
} XrSpatialMarkerDataEXT;
أوصاف الأعضاء
-
capabilityهو XrSpatialCapabilityEXT الذي رصد العلامة. -
markerIdهو المعرّف المرمّز من العلامة. بالنسبة إلى علامات ArUco وAprilTag، يجب أن يكون هذا الحقل صالحًا وأن يتم ملؤه برقم التعريف المشفّر. بالنسبة إلى رموز الاستجابة السريعة، يجب أن تكون قيمة هذا الحقل صفرًا. -
dataهو معرّف المخزن المؤقت ونوع المعلومات الإضافية الواردة في العلامة.
تتيح السمتان XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT وXR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT بيانات إضافية. إذا كان capability أحد هذه الرموز:
- إذا تمكّن وقت التشغيل من فك ترميز البيانات الخاصة بالعلامة بنجاح، يجب ضبط نوع المخزن المؤقت
dataعلىXR_SPATIAL_BUFFER_TYPE_UINT8_EXTأوXR_SPATIAL_BUFFER_TYPE_STRING_EXT، وذلك استنادًا إلى البيانات الواردة في العلامة. يجب أن يضبط وقت التشغيل أيضًا رقم تعريف صالحًا للمخزن المؤقت فيdataيمكن للتطبيق استخدامه مع الدالة المناسبةxrGetSpatialBuffer*للحصول على البيانات. - إذا لم يسبق لوقت التشغيل فك ترميز بيانات العلامة، يجب ضبط معرّف المخزن المؤقت
dataعلى XR_NULL_SPATIAL_BUFFER_ID_EXT ونوع المخزن المؤقت علىXR_SPATIAL_BUFFER_TYPE_UNKNOWN_EXT.
لا تتوافق XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT وXR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT مع البيانات الإضافية، ويجب أن يضبط وقت التشغيل معرّف المخزن المؤقت data على XR_NULL_SPATIAL_BUFFER_ID_EXT.
الاستخدام الصحيح (الضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_marker_trackingقبل استخدام XrSpatialMarkerDataEXT - يجب أن تكون قيمة
capabilityصالحة XrSpatialCapabilityEXT - يجب أن يكون
datamust بنية XrSpatialBufferEXT صالحة
بنية قائمة المكوّنات لطلب البيانات
يتم تعريف بنية XrSpatialComponentMarkerListEXT على النحو التالي:
typedef struct XrSpatialComponentMarkerListEXT {
XrStructureType type;
void* next;
uint32_t markerCount;
XrSpatialMarkerDataEXT* markers;
} XrSpatialComponentMarkerListEXT;
أوصاف الأعضاء
typeهو XrStructureType لهذه البنية.nextهيNULLأو مؤشر إلى البنية التالية في سلسلة البنية. لم يتم تحديد أي بنى من هذا النوع في OpenXR الأساسية أو هذه الإضافة.markerCountهو عدد العناصر في العضوmarkers.-
markersهي مصفوفة من XrSpatialMarkerDataEXT .
يمكن للتطبيق الاستعلام عن مكوّن العلامة الخاص بالكيانات المكانية في XrSpatialSnapshotEXT من خلال إضافة XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT في XrSpatialComponentDataQueryConditionEXT :: componentTypes وإضافة XrSpatialComponentMarkerListEXT إلى سلسلة المؤشر التالية في XrSpatialComponentDataQueryResultEXT .
يجب أن تعرض بيئة التشغيل القيمة XR_ERROR_VALIDATION_FAILURE من xrQuerySpatialComponentDataEXT إذا كانت XrSpatialComponentMarkerListEXT في السلسلة التالية من XrSpatialComponentDataQueryResultEXT :: next ولكن لم يتم تضمين XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT في XrSpatialComponentDataQueryConditionEXT :: componentTypes .
يجب أن تعرض بيئة التشغيل القيمة XR_ERROR_SIZE_INSUFFICIENT من xrQuerySpatialComponentDataEXT إذا كانت قيمة markerCount أقل من XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
الاستخدام الصحيح (الضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_marker_trackingقبل استخدام XrSpatialComponentMarkerListEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_COMPONENT_MARKER_LIST_EXT - يجب أن تكون قيمة
nextهيNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البِنى - يجب أن يكون
markersمؤشرًا إلى مصفوفة من بنىmarkerCountXrSpatialMarkerDataEXT - يجب أن تكون قيمة المَعلمة
markerCountأكبر من0
الإعداد
إذا تم تعداد XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT في XrSpatialCapabilityComponentTypesEXT :: componentTypes لبعض الإمكانات، يمكن لأحد التطبيقات تفعيلها من خلال تضمين القيمة المُعدَّدة في قائمة XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents الخاصة ببنية XrSpatialCapabilityConfigurationBaseHeaderEXT المشتقة من الإمكانية التي تتوافق مع هذا المكوّن.
لا يتطلّب هذا المكوّن أي إعدادات خاصة ليتم تضمينه في سلسلة XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.
مكوّن ثنائي الأبعاد محدود
يوفّر المكوّن الثنائي الأبعاد المحدود مركز العلامة ونطاقها الممثَّلة بالعنصر الذي تظهر عليه. اطّلِع على Bounded 2D لمزيد من التفاصيل حول مكوّن Bounded 2D.
يجب أن يشير XrSpatialBounded2DDataEXT :: center إلى مركز العلامة. عند النظر إلى الوجه الأمامي للعلامة، يجب أن يشير المحور X إلى اليمين، ويجب أن يشير المحور Y إلى أعلى العلامة. يجب أن يتبع وقت التشغيل الأسلوب المتّبع في نظام الإحداثيات اليمنى، وبالتالي يخرج المحور Z من الوجه الأمامي للعلامة. يعني هذا أنّ العلامة التي تتضمّن موضعًا {0, 0, 0} ودورانًا {0, 0, 0, 1} (بدون دوران) ومدى {1, 1} تشير إلى علامة تبلغ أبعادها مترًا واحدًا × مترًا واحدًا، وتتمركز في {0, 0, 0} مع توجيه متجهها العمودي للوجه الأمامي نحو الاتجاه +Z في مساحة المكوّن.
يظهر أدناه تمثيل لاتجاه العلامة.
الشكل 25. علامة رمز الاستجابة السريعة مع محور
رموز الاختبار
يجب أن يكون مستوى X-Y للرموز التالية داخل المستند وأن يشير المحور Z إلى المشاهد. يجب أن يظهر موضع بدء المحور في وسط كل علامة. يجب أن يشير المحور السيني إلى اليمين، ويجب أن يشير المحور الصادي إلى أعلى المستند.
الشكل 26 رمز استجابة سريعة يتضمّن النص OpenXR
الشكل 27 AprilTag XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT برقم التعريف 42
الشكل 28. علامة ArUco XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT التي تحمل المعرّف 43
مثال على الشفرة
ضبط إعدادات إمكانية تتبُّع رمز الاستجابة السريعة
يوضّح نموذج الرمز البرمجي التالي كيفية ضبط إمكانية تتبُّع رمز الاستجابة السريعة عند إنشاء سياق مكاني.
// 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));
استكشاف الكيانات المكانية وبيانات عناصر طلب البحث
يوضّح نموذج الرمز التالي كيفية العثور على عناصر مكانية لسياق تم إعداده باستخدام XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT وطلب بيانات المكوّنات الخاصة به.
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
// ...
}
بنى جديدة
- XrSpatialCapabilityConfigurationAprilTagEXT
- XrSpatialCapabilityConfigurationArucoMarkerEXT
- XrSpatialCapabilityConfigurationMicroQrCodeEXT
- XrSpatialCapabilityConfigurationQrCodeEXT
- XrSpatialMarkerDataEXT
توسيع XrSpatialCapabilityConfigurationArucoMarkerEXT وXrSpatialCapabilityConfigurationAprilTagEXT وXrSpatialCapabilityConfigurationQrCodeEXT وXrSpatialCapabilityConfigurationMicroQrCodeEXT :
عمليات التعداد الجديدة
ثوابت التعداد الجديدة
XR_EXT_SPATIAL_MARKER_TRACKING_EXTENSION_NAMEXR_EXT_spatial_marker_tracking_SPEC_VERSIONتمديد 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
تمديد XrSpatialCapabilityFeatureEXT :
XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXTXR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT
تمديد XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT
تمديد 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
سجلّ الإصدارات
المراجعة 1، 29-07-2024 (رون بيسيمز، Meta)
- الوصف الأوّلي للإضافة