ردیابی نشانگر فضایی XR_EXT
رشته نام
XR_EXT_spatial_marker_tracking
نوع افزونه
افزونه نمونه
شماره داخلی ثبت شده
۷۴۴ عدد
بازنگری
۱
وضعیت تصویب
تصویب شده
وابستگیهای افزونه و نسخه
XR_EXT_spatial_entity
مشارکتکنندگان
ران بسمس، متا
نیهاو جین، گوگل
ناتالی فلوری، متا
یویچی تاگوچی، متا
یین لی، مایکروسافت
جیمی آلمپارامبیل، بایتدنس
ژیپنگ لیو، ByteDance
جون یان، بایتدنس
نمای کلی
این افزونه بر اساس XR_EXT_spatial_entity ساخته شده و به برنامهها اجازه میدهد تا نشانگرها را در محیط خود شناسایی و ردیابی کنند. نشانگرها کدهای دوبعدی هستند که ممکن است شامل کدهای QR، کدهای Micro QR، نشانگرهای ArUco یا AprilTags باشند.
یک نشانگر ردیابی شده به عنوان یک موجودیت مکانی با (یا "که دارای") اجزای زیر نمایش داده میشود:
-
XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT -
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
پشتیبانی از زمان اجرا
یک زمان اجرا باید با فهرست کردن هر یک از قابلیتهای زیر، پشتیبانی خود را از قابلیتهای مختلف ردیابی نشانگر با استفاده از xrEnumerateSpatialCapabilitiesEXT اعلام کند:
-
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
پیکربندی
برای فعال کردن تشخیص نوع نشانگر، برنامه باید ساختار پیکربندی مربوطه را به xrCreateSpatialContextAsyncEXT ارسال کند.
پیکربندی نوع نشانگر
کدهای QR
ساختار XrSpatialCapabilityConfigurationQrCodeEXT به صورت زیر تعریف میشود:
typedef struct XrSpatialCapabilityConfigurationQrCodeEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationQrCodeEXT;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
capabilityبایدXR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXTباشد. -
enabledComponentCountیکuint32_tبا تعداد عناصر موجود درenabledComponentsاست. -
enabledComponentsیک اشارهگر به آرایهای از کامپوننتها برای فعالسازی این قابلیت است.
اگر کدهای QR پشتیبانی میشوند، زمان اجرا باید ردیابی کد QR را فعال کند، زمانی که ساختار XrSpatialCapabilityConfigurationQrCodeEXT در XrSpatialContextCreateInfoEXT :: capabilityConfigs هنگام فراخوانی xrCreateSpatialContextAsyncEXT ارسال میشود.
اگر XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT توسط xrEnumerateSpatialCapabilitiesEXT شمارش نشده باشد، زمان اجرا باید XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT را برگرداند.
کاربرد معتبر (ضمنی)
- افزونهی
XR_EXT_spatial_marker_trackingباید قبل از استفاده از XrSpatialCapabilityConfigurationQrCodeEXT فعال شود. -
typeبایدXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_QR_CODE_EXTباشد. -
nextبایدNULLیا یک اشارهگر معتبر به ساختار بعدی در یک زنجیره ساختار باشد. همچنین ببینید: XrSpatialMarkerSizeEXT ، XrSpatialMarkerStaticOptimizationEXT -
capabilityباید یک مقدار معتبر XrSpatialCapabilityEXT باشد. -
enabledComponentsباید اشارهگری به آرایهای ازenabledComponentCountبا مقادیر معتبر XrSpatialComponentTypeEXT باشد. - پارامتر
enabledComponentCountباید بزرگتر از0باشد.
کدهای QR میکرو
ساختار XrSpatialCapabilityConfigurationMicroQrCodeEXT به صورت زیر تعریف میشود:
typedef struct XrSpatialCapabilityConfigurationMicroQrCodeEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationMicroQrCodeEXT;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
capabilityبایدXR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXTباشد. -
enabledComponentCountیکuint32_tبا تعداد عناصر موجود درenabledComponentsاست. -
enabledComponentsیک اشارهگر به آرایهای از کامپوننتها برای فعالسازی این قابلیت است.
اگر کدهای Micro QR پشتیبانی میشوند، زمان اجرا باید ردیابی Micro QR Code را فعال کند، زمانی که ساختار XrSpatialCapabilityConfigurationMicroQrCodeEXT در XrSpatialContextCreateInfoEXT :: capabilityConfigs هنگام فراخوانی xrCreateSpatialContextAsyncEXT ارسال میشود.
اگر XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT توسط xrEnumerateSpatialCapabilitiesEXT شمارش نشده باشد، زمان اجرا باید XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT را برگرداند.
کاربرد معتبر (ضمنی)
- افزونهی
XR_EXT_spatial_marker_trackingباید قبل از استفاده از XrSpatialCapabilityConfigurationMicroQrCodeEXT فعال شود. -
typeبایدXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_MICRO_QR_CODE_EXTباشد. -
nextبایدNULLیا یک اشارهگر معتبر به ساختار بعدی در یک زنجیره ساختار باشد. همچنین ببینید: XrSpatialMarkerSizeEXT ، XrSpatialMarkerStaticOptimizationEXT -
capabilityباید یک مقدار معتبر XrSpatialCapabilityEXT باشد. -
enabledComponentsباید اشارهگری به آرایهای ازenabledComponentCountبا مقادیر معتبر XrSpatialComponentTypeEXT باشد. - پارامتر
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 این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
capabilityبایدXR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXTباشد. -
enabledComponentCountیکuint32_tبا تعداد عناصر موجود درenabledComponentsاست. -
enabledComponentsیک اشارهگر به آرایهای از کامپوننتها برای فعالسازی این قابلیت است. -
arUcoDictدیکشنری نشانگر برای تشخیص است.
اگر نشانگرهای ArUco پشتیبانی شوند، زمان اجرا باید ردیابی نشانگر ArUco را فعال کند، زمانی که یک ساختار XrSpatialCapabilityConfigurationArucoMarkerEXT در XrSpatialContextCreateInfoEXT :: capabilityConfigs هنگام فراخوانی xrCreateSpatialContextAsyncEXT ارسال میشود.
اگر ساختار XrSpatialCapabilityConfigurationArucoMarkerEXT در XrSpatialContextCreateInfoEXT :: capabilityConfigs باشد اما XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT توسط xrEnumerateSpatialCapabilitiesEXT شمارش نشده باشد، زمان اجرا باید XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT از xrCreateSpatialContextAsyncEXT برگرداند.
کاربرد معتبر (ضمنی)
- افزونهی
XR_EXT_spatial_marker_trackingباید قبل از استفاده از XrSpatialCapabilityConfigurationArucoMarkerEXT فعال شود. -
typeبایدXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ARUCO_MARKER_EXTباشد. -
nextبایدNULLیا یک اشارهگر معتبر به ساختار بعدی در یک زنجیره ساختار باشد. همچنین ببینید: XrSpatialMarkerSizeEXT ، XrSpatialMarkerStaticOptimizationEXT -
capabilityباید یک مقدار معتبر XrSpatialCapabilityEXT باشد. -
enabledComponentsباید اشارهگری به آرایهای ازenabledComponentCountبا مقادیر معتبر XrSpatialComponentTypeEXT باشد. -
arUcoDictباید یک مقدار معتبر XrSpatialMarkerArucoDictEXT باشد. - پارامتر
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— دیکشنری نشانگر آروکو با ابعاد ۴ در ۴ پیکسل و ۵۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_4X4_100_EXT— دیکشنری نشانگر آروکو با ابعاد ۴ در ۴ پیکسل و ۱۰۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_4X4_250_EXT— دیکشنری نشانگر آروکو با ابعاد ۴ در ۴ پیکسل و ۲۵۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_4X4_1000_EXT— دیکشنری نشانگر آروکو با ابعاد ۴ در ۴ پیکسل و ۱۰۰۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT— دیکشنری نشانگر آروکو با ابعاد ۵ در ۵ پیکسل و ۵۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_5X5_100_EXT— دیکشنری نشانگر آروکو با ابعاد ۵ در ۵ پیکسل و ۱۰۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_5X5_250_EXT— دیکشنری نشانگر آروکو با ابعاد ۵ در ۵ پیکسل و ۲۵۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_5X5_1000_EXT— دیکشنری نشانگر آروکو با ابعاد ۵ در ۵ پیکسل و ۱۰۰۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_6X6_50_EXT— دیکشنری نشانگر آروکو با ابعاد ۶ در ۶ پیکسل و ۵۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_6X6_100_EXT— دیکشنری نشانگر آروکو با ابعاد ۶ در ۶ پیکسل و ۱۰۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_6X6_250_EXT— دیکشنری نشانگر آروکو با ابعاد ۶ در ۶ پیکسل و ۲۵۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_6X6_1000_EXT— دیکشنری نشانگر آروکو با ابعاد ۶ در ۶ پیکسل و ۱۰۰۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_7X7_50_EXT— دیکشنری نشانگر آروکو با ابعاد ۷ در ۷ پیکسل و ۵۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_7X7_100_EXT— دیکشنری نشانگر آروکو با ابعاد ۷ در ۷ پیکسل و ۱۰۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_7X7_250_EXT— دیکشنری نشانگر آروکو با ابعاد ۷ در ۷ پیکسل و ۲۵۰ شناسه. -
XR_SPATIAL_MARKER_ARUCO_DICT_7X7_1000_EXT— دیکشنری نشانگر آروکو با ابعاد ۷ در ۷ پیکسل و ۱۰۰۰ شناسه.
برچسبهای آوریل
ساختار XrSpatialCapabilityConfigurationAprilTagEXT به صورت زیر تعریف میشود:
typedef struct XrSpatialCapabilityConfigurationAprilTagEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
XrSpatialMarkerAprilTagDictEXT aprilDict;
} XrSpatialCapabilityConfigurationAprilTagEXT;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
capabilityبایدXR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXTباشد. -
enabledComponentCountیکuint32_tبا تعداد عناصر موجود درenabledComponentsاست. -
enabledComponentsیک اشارهگر به آرایهای از کامپوننتها برای فعالسازی این قابلیت است. -
aprilDictدیکشنری نشانگر برای تشخیص است.
اگر AprilTags پشتیبانی شوند، زمان اجرا باید ردیابی AprilTag را فعال کند، زمانی که یک ساختار XrSpatialCapabilityConfigurationAprilTagEXT در XrSpatialContextCreateInfoEXT :: capabilityConfigs هنگام فراخوانی xrCreateSpatialContextAsyncEXT ارسال میشود.
اگر ساختار XrSpatialCapabilityConfigurationAprilTagEXT در XrSpatialContextCreateInfoEXT :: capabilityConfigs باشد اما XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT توسط xrEnumerateSpatialCapabilitiesEXT شمارش نشده باشد، زمان اجرا باید XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT از xrCreateSpatialContextAsyncEXT برگرداند.
کاربرد معتبر (ضمنی)
- افزونهی
XR_EXT_spatial_marker_trackingباید قبل از استفاده از XrSpatialCapabilityConfigurationAprilTagEXT فعال شود. -
typeبایدXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_APRIL_TAG_EXTباشد. -
nextبایدNULLیا یک اشارهگر معتبر به ساختار بعدی در یک زنجیره ساختار باشد. همچنین ببینید: XrSpatialMarkerSizeEXT ، XrSpatialMarkerStaticOptimizationEXT -
capabilityباید یک مقدار معتبر XrSpatialCapabilityEXT باشد. -
enabledComponentsباید اشارهگری به آرایهای ازenabledComponentCountبا مقادیر معتبر XrSpatialComponentTypeEXT باشد. -
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— ۴ در ۴ بیت، حداقل فاصله همینگ بین هر دو کد = ۵، ۳۰ کد. -
XR_SPATIAL_MARKER_APRIL_TAG_DICT_25H9_EXT— ۵ در ۵ بیت، حداقل فاصله همینگ بین هر دو کد = ۹، ۳۵ کد. -
XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H10_EXT— ۶ در ۶ بیت، حداقل فاصله همینگ بین هر دو کد = ۱۰، ۲۳۲۰ کد. -
XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT— ۶ در ۶ بیت، حداقل فاصله همینگ بین هر دو کد = ۱۱۵۸۷ کد.
پیکربندیهای اختیاری نشانگر
برنامهها باید xrEnumerateSpatialCapabilityFeaturesEXT را برای دریافت لیست ویژگیهای اختیاری پشتیبانیشده فراخوانی کنند.
برای مشاهده لیست کاملی از تمام ویژگیهای قابلیت مکانی پشتیبانی شده توسط هر افزونه، به XrSpatialCapabilityFeatureEXT مراجعه کنید.
اندازه نشانگر
ساختار XrSpatialMarkerSizeEXT به صورت زیر تعریف میشود:
typedef struct XrSpatialMarkerSizeEXT {
XrStructureType type;
const void* next;
float markerSideLength;
} XrSpatialMarkerSizeEXT;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
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 فعال شود. -
typeبایدXR_TYPE_SPATIAL_MARKER_SIZE_EXTباشد. -
nextبایدNULLیا یک اشارهگر معتبر به ساختار بعدی در یک زنجیره ساختار باشد.
بهینهسازی نشانگر ایستا
ساختار XrSpatialMarkerStaticOptimizationEXT به صورت زیر تعریف میشود:
typedef struct XrSpatialMarkerStaticOptimizationEXT {
XrStructureType type;
const void* next;
XrBool32 optimizeForStaticMarker;
} XrSpatialMarkerStaticOptimizationEXT;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
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 فعال شود. -
typeبایدXR_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_EXT -
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
مولفه نشانگر
دادههای کامپوننت
ساختار XrSpatialMarkerDataEXT به صورت زیر تعریف میشود:
typedef struct XrSpatialMarkerDataEXT {
XrSpatialCapabilityEXT capability;
uint32_t markerId;
XrSpatialBufferEXT data;
} XrSpatialMarkerDataEXT;
توضیحات اعضا
-
capability، XrSpatialCapabilityEXT است که نشانگر را شناسایی کرده است. -
markerIdشناسه رمزگذاری شده از نشانگر است. برای نشانگرهای ArUco و AprilTag این فیلد باید معتبر باشد و با شناسه رمزگذاری شده پر شود. برای کدهای QR این فیلد باید صفر باشد. -
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 باشد. -
dataباید یک ساختار XrSpatialBufferEXT معتبر باشند
ساختار لیست کامپوننت برای پرس و جو از دادهها
ساختار XrSpatialComponentMarkerListEXT به صورت زیر تعریف میشود:
typedef struct XrSpatialComponentMarkerListEXT {
XrStructureType type;
void* next;
uint32_t markerCount;
XrSpatialMarkerDataEXT* markers;
} XrSpatialComponentMarkerListEXT;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
nextباNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. چنین ساختارهایی در هسته OpenXR یا این افزونه تعریف نشدهاند. -
markerCountتعداد عناصر موجود در عضوmarkersاست. -
markersآرایهای از XrSpatialMarkerDataEXT هستند.
برنامه میتواند با اضافه کردن XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT در XrSpatialComponentDataQueryConditionEXT :: componentTypes و اضافه کردن XrSpatialComponentMarkerListEXT به زنجیره اشارهگر بعدی XrSpatialComponentDataQueryResultEXT ، کامپوننت نشانگر موجودیتهای مکانی را در XrSpatialSnapshotEXT جستجو کند.
اگر XrSpatialComponentMarkerListEXT در زنجیره بعدی XrSpatialComponentDataQueryResultEXT :: next باشد اما XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT در XrSpatialComponentDataQueryConditionEXT :: componentTypes گنجانده نشده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE از xrQuerySpatialComponentDataEXT بازگرداند.
اگر markerCount کمتر از XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput باشد، زمان اجرا باید XR_ERROR_SIZE_INSUFFICIENT از xrQuerySpatialComponentDataEXT برگرداند.
کاربرد معتبر (ضمنی)
- افزونهی
XR_EXT_spatial_marker_trackingباید قبل از استفاده از XrSpatialComponentMarkerListEXT فعال شود. -
typeبایدXR_TYPE_SPATIAL_COMPONENT_MARKER_LIST_EXTباشد. -
nextبایدNULLیا یک اشارهگر معتبر به ساختار بعدی در یک زنجیره ساختار باشد. -
markersباید اشارهگری به آرایهای از ساختارهایmarkerCountXrSpatialMarkerDataEXT باشند. - پارامتر
markerCountباید بزرگتر از0باشد.
پیکربندی
اگر XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT برای برخی قابلیتها در XrSpatialCapabilityComponentTypesEXT :: componentTypes شمارش شده باشد، یک برنامه میتواند با قرار دادن شمارشگر در لیست XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents از ساختار مشتق شده XrSpatialCapabilityConfigurationBaseHeaderEXT از قابلیتی که از این مولفه پشتیبانی میکند، آن را فعال کند.
این کامپوننت برای قرار گرفتن در زنجیره next XrSpatialCapabilityConfigurationBaseHeaderEXT :: نیازی به پیکربندی خاصی ندارد.
کامپوننت دوبعدی محدود
مؤلفه دوبعدی محدود، مرکز و محدوده نشانگری را که توسط موجودیتی که روی آن قرار دارد نمایش داده میشود، فراهم میکند. برای جزئیات بیشتر در مورد مؤلفه دوبعدی محدود، به بخش «دوبعدی محدود» مراجعه کنید.
center XrSpatialBounded2DDataEXT :: باید به مرکز نشانگر اشاره کند. هنگام نگاه کردن به سطح جلویی نشانگر، محور X باید به سمت راست و محور Y باید به بالای نشانگر اشاره کند. زمان اجرا باید از قرارداد سیستم مختصات راستگرد پیروی کند، بنابراین محور Z از سطح جلویی نشانگر خارج میشود. این بدان معناست که یک نشانگر با موقعیت {0، 0، 0}، چرخش {0، 0، 0، 1} (بدون چرخش) و وسعت {1، 1} به یک نشانگر 1 متر در 1 متر اشاره دارد که در مرکز {0، 0، 0} قرار دارد و بردار نرمال سطح جلویی آن به سمت جهت +Z در فضای مؤلفه است.
نمایی از جهت گیری نشانگر در زیر نشان داده شده است.
شکل ۲۵. نشانگر کد QR با محور
کدهای تست
کدهای زیر باید صفحه XY خود را درون سند و محور Z را به سمت بیننده داشته باشند. مبدا محور باید در مرکز هر نشانگر ظاهر شود. محور X باید به سمت راست و محور Y باید به بالای سند اشاره کند.
شکل ۲۶. کد QR با متن «OpenXR»
شکل ۲۷. AprilTag XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT با شناسه ۴۲
شکل ۲۸. نشانگر ArUco XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT با شناسه ۴۳
کد مثال
پیکربندی قابلیت ردیابی کد QR
کد نمونه زیر نحوه پیکربندی قابلیت ردیابی کد QR را هنگام ایجاد یک زمینه مکانی نشان میدهد.
// 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));
کشف موجودیتهای مکانی و جستجوی دادههای کامپوننت
کد نمونه زیر نحوه کشف موجودیتهای مکانی برای یک context پیکربندی شده با 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
- پیکربندی XrSpatialCapabilityMicroQrCodeEXT
- پیکربندی XrSpatialCapabilityQrCodeEXT
- XrSpatialMarkerDataEXT
بسط XrSpatialCapabilityConfigurationArucoMarkerEXT ، XrSpatialCapabilityConfigurationAprilTagEXT ، XrSpatialCapabilityConfigurationQrCodeEXT ، XrSpatialCapabilityConfigurationMicroQrCodeEXT :
Enum های جدید
ثابتهای شمارشی جدید
-
XR_EXT_SPATIAL_MARKER_TRACKING_EXTENSION_NAME -
XR_EXT_spatial_marker_tracking_SPEC_VERSION گسترش XrSpatialCapabilityEXT :
-
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT -
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT -
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT -
XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT
-
بسط XrSpatialCapabilityFeatureEXT :
-
XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT -
XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT
-
بسط XrSpatialComponentTypeEXT :
-
XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT
-
گسترش XrStructureType :
-
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_APRIL_TAG_EXT -
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ARUCO_MARKER_EXT -
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_MICRO_QR_CODE_EXT -
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_QR_CODE_EXT -
XR_TYPE_SPATIAL_COMPONENT_MARKER_LIST_EXT -
XR_TYPE_SPATIAL_MARKER_SIZE_EXT -
XR_TYPE_SPATIAL_MARKER_STATIC_OPTIMIZATION_EXT
-
تاریخچه نسخه
بازبینی 1، 29/07/2024 (ران بسمز، متا)
- توضیحات اولیه افزونه