XR_EXT_spatial_image_tracking
Name String
XR_EXT_spatial_image_tracking
نوع الإضافة
إضافة مثيل
رقم الإضافة المسجَّل
783
المراجعة
1
حالة التصديق
لم تتم المصادقة عليها
الاعتماد على الإضافات والإصدارات
XR_EXT_spatial_entity
المساهمون
"دانيال غوتنبرغ"، شركة Qualcomm
"نيهاف جاين"، شركة Google
"جاريد فايندر"، شركة Google
"تشيبينغ ليو"، شركة ByteDance
نظرة عامة
توفّر هذه الإضافة إمكانية تتبُّع الصور لإضافة XR_EXT_spatial_entity. وهي تتيح للتطبيقات رصد صور مستوية معيّنة وتتبُّعها على النحو المحدّد في مجموعات الصور المرجعية المُدخلة.
يتم تمثيل الصورة التي يتم تتبُّعها ككيان مكاني يتضمّن المكوّنات التالية:
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXTXR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
تستخدم التطبيقات عادةً إضافة تتبُّع الصور المكانية بالنمط التالي:
- ينشئ التطبيق أولاً معالِجًا واحدًا أو أكثر من معالِجات XrSpatialImageTrackingDatabaseEXT استنادًا إلى مجموعات من بيانات الصور المرجعية المحمَّلة مسبقًا.
- بعد ذلك، ينشئ التطبيق مؤشر XrSpatialContextEXT استنادًا إلى مؤشرات XrSpatialImageTrackingDatabaseEXT التي تم إنشاؤها سابقًا.
- بعد ذلك، يحرّر التطبيق بيانات الصورة المرجعية لتقليل استهلاك الذاكرة.
- يكتشف التطبيق الصور ويستعلم عنها وفقًا لأنماط الوصول إلى الكيانات المكانية.
- يمكن للتطبيق تحميل مجموعات إضافية من الصور المرجعية وإنشاء XrSpatialImageTrackingDatabaseEXT إضافية، وبالتالي XrSpatialContextEXT منها لتوسيع مجموعة الصور التي يمكن رصدها وتتبُّعها ديناميكيًا في وقت التشغيل.
- يمكن للتطبيق إتلاف مؤشرات XrSpatialImageTrackingDatabaseEXT لتقليل مجموعة الصور التي يمكن رصدها وتتبُّعها بشكل ديناميكي أثناء التشغيل.
- يمكن للتطبيق إتلاف مؤشرات XrSpatialContextEXT لتقليل مجموعة الصور التي يمكن رصدها وتتبُّعها ديناميكيًا أثناء التشغيل.
دعم بيئة التشغيل
يجب أن يعلن وقت التشغيل عن توافقه مع إمكانية تتبُّع الصور باستخدام xrEnumerateSpatialCapabilitiesEXT من خلال إدراج الإمكانية التالية:
XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT
الإعداد
لتفعيل رصد الصور المستوية وتتبُّعها، يمكن للتطبيق تمرير بُنى XrSpatialCapabilityConfigurationImageTrackingEXT في XrSpatialContextCreateInfoEXT :: capabilityConfigs عند استدعاء الدالة xrCreateSpatialContextAsyncEXT، وتمرير مصفوفات من بُنى< XrSpatialImageTrackingDatabaseEXT في كل XrSpatialCapabilityConfigurationImageTrackingEXT :: imageTrackingDatabases .
إنشاء مجموعة صور مدخَلة
لتحديد الصور المرجعية التي سيتم رصدها وتتبُّعها، يجب أن ينشئ التطبيق مجموعة واحدة على الأقل من الصور المرجعية المُدخلة. يتم تمثيل مجموعة من الصور المرجعية للإدخال بواسطة مؤشر XrSpatialImageTrackingDatabaseEXT وتحتوي على صورة واحدة على الأقل.
XR_DEFINE_HANDLE(XrSpatialImageTrackingDatabaseEXT)
يمثّل المقبض XrSpatialImageTrackingDatabaseEXT الموارد اللازمة لاكتشاف وتعديل عدد من الصور المكانية في بيئة المستخدم. يمكن للتطبيقات استخدام هذا المعرِّف للعثور على الصور المكانية وتعديلها باستخدام وظائف أخرى في هذه الإضافة.
إنشاء قاعدة بيانات تتبُّع الصور المكانية
يتم تعريف الدالة xrCreateSpatialImageTrackingDatabaseAsyncEXT على النحو التالي:
XrResult xrCreateSpatialImageTrackingDatabaseAsyncEXT(
XrSession session,
const XrSpatialImageTrackingDatabaseCreateInfoEXT* createInfo,
XrFutureEXT* future);
أوصاف المَعلمات
-
sessionهي XrSession ستكون فيها قاعدة بيانات تتبُّع الصور المكانية نشطة. -
createInfoهو XrSpatialImageTrackingDatabaseCreateInfoEXT المستخدَم لتحديد مَعلمات قاعدة بيانات تتبُّع الصور المكانية. -
futureهو مؤشر إلىXrFutureEXT.
يمكن للتطبيق إنشاء معالِج XrSpatialImageTrackingDatabaseEXT باستخدام دالة xrCreateSpatialImageTrackingDatabaseAsyncEXT وضبط مجموعات الصور المرجعية المُدخلة لقاعدة بيانات تتبُّع الصور باستخدام createInfo .
يجب أن يعرض وقت التشغيل XR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXT إذا لم يتم تعداد XrSpatialReferenceImageEXT :: format لأي من الصور المرجعية للإدخال بواسطة xrEnumerateSpatialReferenceImageFormatsEXT .
يجب أن يعرض وقت التشغيل XR_ERROR_SPATIAL_IMAGE_INVALID_EXT إذا تعذّر تقييم مصفوفة planes في XrSpatialReferenceImageEXT لأي من الصور المرجعية المُدخلة وفقًا للبيانات الوصفية للصورة المرجعية في XrSpatialReferenceImageEXT .
يجب أن يعرض وقت التشغيل XR_ERROR_SPATIAL_IMAGE_INVALID_EXT إذا كانت مصفوفة planes في XrSpatialReferenceImageEXT لأي من الصور المرجعية المُدخلة لا توفّر عددًا من المستويات يساوي تمامًا عدد قنوات الألوان في format في XrSpatialReferenceImageEXT.
إذا كان وقت التشغيل يفرض نظام أذونات للتحكّم في وصول التطبيق إلى ميزة تتبُّع الصور، يجب أن يعرض وقت التشغيل القيمة XR_ERROR_PERMISSION_INSUFFICIENT إذا لم يتم منح هذه الأذونات لهذا التطبيق.
تبدأ هذه الدالة عملية غير متزامنة وتنشئ XrFutureEXT مقابلة، يمكن استخدامها مع xrPollFutureEXT والدوال ذات الصلة. تشير القيمة المعروضة لهذه الدالة فقط إلى ما إذا كانت المَعلمات مقبولة لجدولة العملية غير المتزامنة. دالة الإكمال المقابلة هي xrCreateSpatialImageTrackingDatabaseCompleteEXT، ويمكن استخدامها عندما تكون دالة مستقبلية من هذه الدالة في الحالة READY، مع تعبئة المخرجات بواسطة هذه الدالة في بنية الإكمال XrCreateSpatialImageTrackingDatabaseCompletionEXT .
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_image_trackingقبل استدعاء xrCreateSpatialImageTrackingDatabaseAsyncEXT - يجب أن يكون
sessionاسم معرِّف XrSession صالحًا -
createInfoيجب أن يكون مؤشرًا إلى بنية XrSpatialImageTrackingDatabaseCreateInfoEXT صالحة - يجب أن يكون
futureمؤشرًا إلى قيمةXrFutureEXT
رموز الإرجاع
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_PERMISSION_INSUFFICIENTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXTXR_ERROR_SPATIAL_IMAGE_INVALID_EXTXR_ERROR_SPATIAL_IMAGE_SIZE_MISSING_EXTXR_ERROR_VALIDATION_FAILURE
يتم تحديد بنية XrSpatialImageTrackingDatabaseCreateInfoEXT على النحو التالي:
typedef struct XrSpatialImageTrackingDatabaseCreateInfoEXT {
XrStructureType type;
const void* next;
uint32_t spatialReferenceImageCount;
const XrSpatialReferenceImageEXT* spatialReferenceImages;
} XrSpatialImageTrackingDatabaseCreateInfoEXT;
أوصاف الأعضاء
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
spatialReferenceImageCountهو عدد العناصر في مصفوفةspatialReferenceImages. spatialReferenceImagesهو مصفوفة من XrSpatialReferenceImageEXT .
تصف بنية XrSpatialImageTrackingDatabaseCreateInfoEXT المعلومات اللازمة لإنشاء مؤشر XrSpatialImageTrackingDatabaseEXT.
يجب إنشاء كل XrSpatialImageTrackingDatabaseEXT باستخدام XrSpatialReferenceImageEXT واحد على الأقل في مصفوفة XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages.
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_image_trackingقبل استخدام XrSpatialImageTrackingDatabaseCreateInfoEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_CREATE_INFO_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية . يُرجى الاطّلاع أيضًا على: XrSpatialImageSizeEXT وXrSpatialImageStaticOptimizationEXT - يجب أن تكون السمة
spatialReferenceImagesمؤشرًا إلى مصفوفة من هياكلspatialReferenceImageCountصالحة من النوع XrSpatialReferenceImageEXT - يجب أن تكون المَعلمة
spatialReferenceImageCountأكبر من0
يتم تعريف الدالة xrCreateSpatialImageTrackingDatabaseCompleteEXT على النحو التالي:
XrResult xrCreateSpatialImageTrackingDatabaseCompleteEXT(
XrSession session,
XrFutureEXT future,
XrCreateSpatialImageTrackingDatabaseCompletionEXT* completion);
أوصاف المَعلمات
-
sessionهي XrSession التي تم تمريرها سابقًا إلى xrCreateSpatialContextAsyncEXT ::session. -
futureهوXrFutureEXTالذي تم تلقّيه من xrCreateSpatialContextAsyncEXT . -
completionهو مؤشر إلى XrCreateSpatialImageTrackingDatabaseCompletionEXT .
تُكمِل الدالة xrCreateSpatialImageTrackingDatabaseCompleteEXT العملية غير المتزامنة التي بدأتها الدالة xrCreateSpatialImageTrackingDatabaseAsyncEXT .
يجب ألّا يصل وقت التشغيل إلى أيّ مؤشرات XrSpatialReferenceImagePlaneEXT :: buffer التي تم توفيرها من خلال مصفوفة الإدخال XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages لطلب xrCreateSpatialImageTrackingDatabaseAsyncEXT هذا بعد اكتماله. يمكن للتطبيق إخلاء أي بيانات XrSpatialReferenceImagePlaneEXT :: buffer بعد اكتمال xrCreateSpatialImageTrackingDatabaseAsyncEXT لتقليل استهلاك الذاكرة.
يجب أن يعرض وقت التشغيل XR_ERROR_FUTURE_PENDING_EXT إذا لم يكن future في حالة الاستعداد. يجب أن يعرض وقت التشغيل القيمة XR_ERROR_FUTURE_INVALID_EXT إذا سبق أن تم إكمال future أو إلغاؤه.
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_image_trackingقبل استدعاء xrCreateSpatialImageTrackingDatabaseCompleteEXT - يجب أن يكون
sessionاسم معرِّف XrSession صالحًا - يجب أن يكون
completionمؤشرًا إلى بنية XrCreateSpatialImageTrackingDatabaseCompletionEXT
رموز الإرجاع
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_FUTURE_INVALID_EXTXR_ERROR_FUTURE_PENDING_EXTXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
يتم تحديد بنية XrCreateSpatialImageTrackingDatabaseCompletionEXT على النحو التالي:
typedef struct XrCreateSpatialImageTrackingDatabaseCompletionEXT {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialImageTrackingDatabaseEXT database;
} XrCreateSpatialImageTrackingDatabaseCompletionEXT;
أوصاف الأعضاء
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
futureResultهي XrResult لعملية إنشاء قاعدة بيانات تتبُّع الصور المكانية. -
databaseهو XrSpatialImageTrackingDatabaseEXT تم إنشاؤه باستخدام البيانات والإعدادات في xrCreateSpatialImageTrackingDatabaseAsyncEXT ::createInfo.
رموز الإرجاع المستقبلية
قيم futureResult:
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXTXR_ERROR_SPATIAL_IMAGE_INVALID_EXT
إذا كان futureResult رمز نجاح، database يجب أن يكون معرّفًا صالحًا. إذا كانت السمة database صالحة، فستظل كذلك فقط خلال مراحل نشاط xrCreateSpatialImageTrackingDatabaseAsyncEXT :: session أو إلى أن يتلف التطبيق السمة database باستخدام xrDestroySpatialImageTrackingDatabaseEXT، أيهما يحدث أولاً.
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_image_trackingقبل استخدام XrCreateSpatialImageTrackingDatabaseCompletionEXT - يجب أن يكون
typeXR_TYPE_CREATE_SPATIAL_IMAGE_TRACKING_DATABASE_COMPLETION_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية - يجب أن تكون قيمة
futureResultصالحة لـ XrResult - يجب أن يكون
databaseاسم معرِّف صالحًا لـ XrSpatialImageTrackingDatabaseEXT
تدمير قاعدة بيانات تتبُّع الصور المكانية
يتم تعريف الدالة xrDestroySpatialImageTrackingDatabaseEXT على النحو التالي:
XrResult xrDestroySpatialImageTrackingDatabaseEXT(
XrSpatialImageTrackingDatabaseEXT database);
أوصاف المَعلمات
-
databaseهو XrSpatialImageTrackingDatabaseEXT تم إنشاؤه سابقًا بواسطة xrCreateSpatialImageTrackingDatabaseAsyncEXT .
يمكن للتطبيق استدعاء الدالة xrDestroySpatialImageTrackingDatabaseEXT لإلغاء المقبض database والموارد الأساسية عند الانتهاء من مهام اكتشاف الصور المكانية وتعديلها.
يمكن للتطبيق استدعاء الدالة xrDestroySpatialImageTrackingDatabaseEXT قبل استدعاء xrDestroySpatialContextEXT . يجب ألا يعرض وقت التشغيل الصور التي تديرها قاعدة البيانات XrSpatialImageTrackingDatabaseEXT التي تم تدميرها. يجب أن تواصل بيئة التشغيل إعداد تقارير عن الصور التي تديرها قواعد بيانات أخرى.
يجب أن يضمن وقت التشغيل أنّ لقطات الاستكشاف التي تعرضها الدالة xrCreateSpatialDiscoverySnapshotCompleteEXT لا تحتوي على صور تتعلّق بمؤشرات XrSpatialImageTrackingDatabaseEXT التي تم تدميرها أو غير الصالحة، حتى إذا تم تدمير المؤشر بعد أن استدعى التطبيق الدالة xrCreateSpatialDiscoverySnapshotAsyncEXT . بما أنّ البيانات في اللقطة المكانية غير قابلة للتغيير، يجب أن يتلف التطبيق أيّ مؤشرات XrSpatialSnapshotEXT تم إنشاؤها قبل أن يتلف database ، وإلا قد يتلقّى التطبيق مؤشرات XrSpatialImageTrackingDatabaseEXT غير صالحة عند استخدام xrQuerySpatialComponentDataEXT .
يمكن للتطبيق استدعاء الدالة xrDestroySpatialContextEXT لإلغاء المقبض XrSpatialContextEXT قبل إتلاف أي من مقابض XrSpatialImageTrackingDatabaseEXT التي تم إنشاء XrSpatialContextEXT باستخدامها. يجب ألّا يتلف وقت التشغيل بشكل ضمني مؤشرات XrSpatialImageTrackingDatabaseEXT هذه عند تلف XrSpatialContextEXT.
تتيح إدارة عمر XrSpatialContextEXT وXrSpatialImageTrackingDatabaseEXT بشكل مستقل للتطبيقات إعادة استخدام مؤشرات XrSpatialImageTrackingDatabaseEXT التي تم إنشاؤها سابقًا بدون الحاجة إلى إعادة تنفيذ إجراء الإنشاء المكلف.
على سبيل المثال، يؤدي تدمير XrSpatialContextEXT ثم إعادة إنشاء XrSpatialContextEXT آخر باستخدام XrSpatialImageTrackingDatabaseEXT نفسه إلى إيقاف تتبُّع الصور مؤقتًا واستئنافه بدون الحاجة إلى تنفيذ إجراء إعداد آخر.
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_image_trackingقبل استدعاء xrDestroySpatialImageTrackingDatabaseEXT - يجب أن يكون
databaseاسم معرِّف صالحًا لـ XrSpatialImageTrackingDatabaseEXT
أمان Thread
- يجب مزامنة الوصول إلى
databaseوأي معرّفات فرعية خارجيًا
رموز الإرجاع
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
تنسيقات الصور المتوافقة
يجب أن تستدعي التطبيقات xrEnumerateSpatialReferenceImageFormatsEXT للحصول على قائمة بتنسيقات الصور المرجعية المتوافقة للإدخال.
يتم تعريف الدالة xrEnumerateSpatialReferenceImageFormatsEXT على النحو التالي:
XrResult xrEnumerateSpatialReferenceImageFormatsEXT(
XrInstance instance,
XrSystemId systemId,
XrSpatialCapabilityEXT capability,
uint32_t formatCapacityInput,
uint32_t* formatCountOutput,
XrSpatialReferenceImageFormatEXT* formats);
أوصاف المَعلمات
-
instanceهو اسم حساب لـ XrInstance . -
systemIdهوXrSystemIdالذي سيتم تعداد تنسيقات الصور المرجعية المُدخلة له. -
capabilityهي XrSpatialCapabilityEXT التي سيتم تعداد تنسيقات الصور المرجعية المُدخلة لها. -
formatCapacityInputهي سعة مصفوفةformats، أو 0 للإشارة إلى طلب استرداد السعة المطلوبة. -
formatCountOutputهو عدد التنسيقات أو السعة المطلوبة في حال عدم كفايةformatCapacityInput. -
formatsهي مصفوفة من XrSpatialReferenceImageFormatEXT . يمكن أن تكون القيمةNULLإذا كانت قيمةformatCapacityInputهي 0. - يُرجى الاطّلاع على قسم مَعلمات حجم ذاكرة التخزين المؤقت للحصول على وصف تفصيلي لاسترداد حجم
formatsالمطلوب.
يمكن للتطبيق تعداد قائمة تنسيقات الصور المرجعية للإدخال التي يتيحها XrSystemId معيّن لـ XrSpatialCapabilityEXT معيّن باستخدام xrEnumerateSpatialReferenceImageFormatsEXT .
يجب ألا يعدد وقت التشغيل تنسيقات الإضافات غير المفعّلة لـ "instance".
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_image_trackingقبل استدعاء xrEnumerateSpatialReferenceImageFormatsEXT - يجب أن يكون
instanceمقبض XrInstance صالحًا -
capabilityيجب أن تكون قيمة XrSpatialCapabilityEXT صالحة - يجب أن يكون
formatCountOutputمؤشرًا إلى قيمةuint32_t - إذا لم تكن قيمة
formatCapacityInputهي0، يجب أن تكون قيمةformatsمؤشرًا لمصفوفة من قيمformatCapacityInputXrSpatialReferenceImageFormatEXT
رموز الإرجاع
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
يمكنك الاطّلاع على XrSpatialReferenceImageFormatEXT للحصول على قائمة كاملة بجميع تنسيقات الصور المرجعية المتوافقة مع أي إضافة.
typedef enum XrSpatialReferenceImageFormatEXT {
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT = 1,
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGB_888_EXT = 2,
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_YUV_420_888_EXT = 3,
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialReferenceImageFormatEXT;
يحدّد تعداد XrSpatialReferenceImageFormatEXT تنسيقات الصور المرجعية التي قد يتيحها وقت التشغيل.
يجب أن تكون قيمة XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT وقيمة XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGB_888_EXT على الأقل متوافقتَين.
في ما يلي معنى القيم المحدّدة:
أوصاف التعداد
-
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT: مخزن مؤقت لنموذج RGBA لا يقدّم التنسيق أي ضمانات بشأن تخطيط بيانات وحدات البكسل في الذاكرة. يجب الوصول إلى وحدات البكسل باستخدام البيانات الوصفية التي توفّرها هياكل XrSpatialReferenceImagePlaneEXT المقابلة. يبلغ حجم كل قناة لون بكسل 8 بت، ما يجعل حجم كل بكسل 32 بت. -
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGB_888_EXT: مخزن مؤقت للنموذج اللوني أحمر أخضر أزرق لا يقدّم التنسيق أي ضمانات بشأن تخطيط بيانات وحدات البكسل في الذاكرة. يجب الوصول إلى وحدات البكسل باستخدام البيانات الوصفية التي توفّرها هياكل XrSpatialReferenceImagePlaneEXT المقابلة. يبلغ حجم كل قناة لون بكسل 8 بت، مما يجعل حجم كل بكسل 24 بت. -
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_YUV_420_888_EXT: مخزن مؤقت لنموذج YUV يتضمّن اختزالاً لونيًا بنمط 4:2:0 لا يقدّم التنسيق أي ضمانات بشأن تخطيط بيانات وحدات البكسل في الذاكرة. يجب الوصول إلى وحدات البكسل باستخدام البيانات الوصفية التي توفّرها هياكل XrSpatialReferenceImagePlaneEXT المقابلة. يبلغ حجم كل قناة لون بكسل RGB تم فك ترميزها 8 بت، ما يجعل حجم كل بكسل 24 بت.
إعدادات تتبُّع الصور المكانية
توفّر هذه الإضافة هياكل اختيارية يمكن للتطبيق استخدامها لضبط ميزة تتبُّع الصور.
تحسين الصور الثابتة
يتم تعريف بنية XrSpatialImageStaticOptimizationEXT على النحو التالي:
typedef struct XrSpatialImageStaticOptimizationEXT {
XrStructureType type;
const void* next;
XrBool32 optimizeForStaticImage;
} XrSpatialImageStaticOptimizationEXT;
أوصاف الأعضاء
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
optimizeForStaticImageهي سمةXrBool32تشير إلى ما إذا كانت الصور تتحرك أم لا. تشير القيمةXR_TRUEإلى أنّ الصور لا تتحرك.
إذا تم تعداد XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT بواسطة xrEnumerateSpatialCapabilityFeaturesEXT لإمكانية XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT، يمكن للتطبيق ربط XrSpatialImageStaticOptimizationEXT بسلسلة XrSpatialImageTrackingDatabaseCreateInfoEXT :: next أو XrSpatialReferenceImageEXT :: next .
إذا ربط التطبيق XrSpatialImageStaticOptimizationEXT ببنية XrSpatialImageTrackingDatabaseCreateInfoEXT، يجب أن يفترض وقت التشغيل أنّ جميع صور XrSpatialImageTrackingDatabaseEXT ثابتة إذا تم ضبط optimizeForStaticImage على XR_TRUE . وبالمثل، يجب أن يفترض وقت التشغيل أنّ جميع صور XrSpatialImageTrackingDatabaseEXT ليست ثابتة إذا تم ضبط optimizeForStaticImage على XR_FALSE .
إذا ربط التطبيق XrSpatialImageStaticOptimizationEXT ببنية XrSpatialReferenceImageEXT، يجب أن يفترض وقت التشغيل أنّ هذه الصورة المرجعية ثابتة إذا تم ضبط optimizeForStaticImage على XR_TRUE . وبالمثل، يجب أن يفترض وقت التشغيل أنّ هذه الصورة المرجعية ليست ثابتة إذا تم ضبط السمة optimizeForStaticImage على XR_FALSE . إنّ ربط بنية XrSpatialImageStaticOptimizationEXT ببنية XrSpatialReferenceImageEXT له الأولوية على ربطها ببنية XrSpatialImageTrackingDatabaseCreateInfoEXT.
إذا لم يتم تعداد XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT بواسطة xrEnumerateSpatialCapabilityFeaturesEXT لإمكانية XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT، وكان التطبيق يربط بنية XrSpatialImageStaticOptimizationEXT بأي من السلاسل التالية السارية، يجب أن يعرض وقت التشغيل XR_ERROR_VALIDATION_FAILURE من xrCreateSpatialImageTrackingDatabaseAsyncEXT .
قد يسمح ذلك لوقت التشغيل بإنشاء وضعية وحجم أكثر دقة.
قد يسمح ذلك لوقت التشغيل بتقليل استهلاك الطاقة.
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_image_trackingقبل استخدام XrSpatialImageStaticOptimizationEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_IMAGE_STATIC_OPTIMIZATION_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية
عرض الصورة المرجعية
يتم تحديد بنية XrSpatialImageSizeEXT على النحو التالي:
typedef struct XrSpatialImageSizeEXT {
XrStructureType type;
const void* next;
float physicalWidth;
} XrSpatialImageSizeEXT;
أوصاف الأعضاء
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
physicalWidthهي قيمة من النوعfloatتمثّل العرض الفعلي المطلوب ضبطه بالمتر.
إذا تم تعداد XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT بواسطة xrEnumerateSpatialCapabilityFeaturesEXT لإمكانية XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT، يمكن للتطبيق ربط XrSpatialImageSizeEXT بـ XrSpatialImageTrackingDatabaseCreateInfoEXT :: next أو XrSpatialReferenceImageEXT :: next .
إذا ربط التطبيق XrSpatialImageSizeEXT ببنية XrSpatialImageTrackingDatabaseCreateInfoEXT، يجب أن يفترض وقت التشغيل أنّ جميع صور XrSpatialImageTrackingDatabaseEXT لها عرض يبلغ physicalWidth متر وارتفاع وفقًا لنسبة العرض إلى الارتفاع كما هو موضّح ضمنيًا من خلال XrSpatialReferenceImageEXT :: width وXrSpatialReferenceImageEXT :: height .
إذا ربط التطبيق XrSpatialImageSizeEXT ببنية XrSpatialReferenceImageEXT، يجب أن يفترض وقت التشغيل أنّ هذه الصورة المرجعية يبلغ عرضها physicalWidth متر وارتفاعها وفقًا لنسبة العرض إلى الارتفاع كما هو موضّح ضمنيًا من خلال XrSpatialReferenceImageEXT :: width وXrSpatialReferenceImageEXT :: height . إنّ ربط بنية XrSpatialImageSizeEXT ببنية XrSpatialReferenceImageEXT له الأولوية على ربطها ببنية XrSpatialImageTrackingDatabaseCreateInfoEXT.
قد يسمح ذلك لوقت التشغيل بعرض وضعية وحجم أكثر دقة.
يجب أن يحدّد وقت التشغيل إما XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT أو XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT أو كليهما.
إذا تم تعداد XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT بواسطة xrEnumerateSpatialCapabilityFeaturesEXT، يجب أن يوفّر وقت التشغيل أحجام الصور تلقائيًا للصور التي لم يوفّر التطبيق لها أيّ هياكل XrSpatialImageSizeEXT كجزء من أيّ من السلاسل التالية السارية.
لكي يتمكّن وقت التشغيل من إنشاء أحجام الصور تلقائيًا وبدقة، قد تكون هناك حاجة إلى بعض إمكانات الجهاز والمتطلبات الأساسية، مثل الكاميرات المجسّمة والمعايير الخارجية والداخلية للكاميرا التي تمت معايرتها بدقة.
إذا لم يتم تعداد XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT بواسطة xrEnumerateSpatialCapabilityFeaturesEXT، يجب أن يربط التطبيق هياكل XrSpatialImageSizeEXT بالسلاسل التالية المناسبة بحيث يكون لجميع الصور حجم صريح، وإلا يجب أن يعرض وقت التشغيل XR_ERROR_SPATIAL_IMAGE_SIZE_MISSING_EXT من xrCreateSpatialImageTrackingDatabaseAsyncEXT .
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_image_trackingقبل استخدام XrSpatialImageSizeEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_IMAGE_SIZE_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية
يتم تعريف بنية XrSpatialCapabilityConfigurationImageTrackingEXT على النحو التالي:
typedef struct XrSpatialCapabilityConfigurationImageTrackingEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
uint32_t imageTrackingDatabaseCount;
const XrSpatialImageTrackingDatabaseEXT* imageTrackingDatabases;
} XrSpatialCapabilityConfigurationImageTrackingEXT;
أوصاف الأعضاء
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. capabilityهو XrSpatialCapabilityEXT ويجب أن يكونXR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT.-
enabledComponentCountهيuint32_tتحدّد عدد العناصر فيenabledComponents. -
enabledComponentsهي مصفوفة من XrSpatialComponentTypeEXT تحدّد المكوّنات التي يجب تفعيلها لهذه الميزة. -
imageTrackingDatabaseCountهيunint32_tتحدّد عدد العناصر فيimageTrackingDatabases. -
imageTrackingDatabasesهي مصفوفة من مؤشرات XrSpatialImageTrackingDatabaseEXT التي تحدّد قواعد بيانات تتبُّع الصور التي يجب تفعيلها للسياق المكاني.
إذا كانت ميزة تتبُّع الصور متاحة، يجب أن يفعّلها وقت التشغيل إذا تم تمرير بنية XrSpatialCapabilityConfigurationImageTrackingEXT في XrSpatialContextCreateInfoEXT :: capabilityConfigs عند استدعاء xrCreateSpatialContextAsyncEXT .
تتيح بنية XrSpatialCapabilityConfigurationImageTrackingEXT للتطبيق العثور على الصور المرجعية التي تمثّلها مؤشرات XrSpatialImageTrackingDatabaseEXT في imageTrackingDatabases .
يجب أن يعرض وقت التشغيل XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT إذا لم يتم تعداد XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT من خلال xrEnumerateSpatialCapabilitiesEXT .
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_image_trackingقبل استخدام XrSpatialCapabilityConfigurationImageTrackingEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_IMAGE_TRACKING_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية -
capabilityيجب أن تكون قيمة XrSpatialCapabilityEXT صالحة -
enabledComponentsيجب أن يكون مؤشرًا إلى مصفوفة من قيمenabledComponentCountصالحة من النوع XrSpatialComponentTypeEXT - يجب أن يكون
imageTrackingDatabasesمؤشرًا إلى مصفوفة من مؤشراتimageTrackingDatabaseCountصالحة لـ XrSpatialImageTrackingDatabaseEXT - يجب أن تكون المَعلمة
enabledComponentCountأكبر من0 - يجب أن تكون المَعلمة
imageTrackingDatabaseCountأكبر من0
صورة مرجعية مكانية
يتم تعريف بنية XrSpatialReferenceImagePlaneEXT على النحو التالي:
typedef struct XrSpatialReferenceImagePlaneEXT {
uint32_t bufferSize;
uint8_t* buffer;
uint32_t rowStride;
uint32_t pixelStride;
} XrSpatialReferenceImagePlaneEXT;
أوصاف المَعلمات
-
bufferSizeهو حجم الصفيفةbuffer. -
bufferهي مصفوفة من بياناتuint8_tتمثّل بيانات المستوى. -
rowStrideهي المسافة بالبايت بين موضعَي بداية صفَّين متتاليَين من بيانات وحدات البكسل. -
pixelStrideهي المسافة بالبايت بين بكسلَين متتاليَين.
يجب أن يصل وقت التشغيل إلى buffer وفقًا للأنماط التي توفّرها المَعلمتان rowStride وpixelStride.
يجب أن يضبط التطبيق rowStride وpixelStride بحيث لا يستخرج وقت التشغيل سوى وحدات البكسل المفيدة من XrSpatialReferenceImagePlaneEXT.
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_EXT_spatial_image_trackingقبل استخدام XrSpatialReferenceImagePlaneEXT -
bufferيجب أن يكون مؤشرًا إلى مصفوفة من قيمbufferSizeuint8_t - يجب أن تكون المَعلمة
bufferSizeأكبر من0
يتم تحديد بنية XrSpatialReferenceImageEXT على النحو التالي:
typedef struct XrSpatialReferenceImageEXT {
XrStructureType type;
const void* next;
uint32_t width;
uint32_t height;
XrSpatialReferenceImageFormatEXT format;
uint32_t planeCount;
const XrSpatialReferenceImagePlaneEXT* planes;
} XrSpatialReferenceImageEXT;
أوصاف المَعلمات
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
widthهو عرض الصورة المرجعية بالبكسل. -
heightهو ارتفاع الصورة المرجعية بالبكسل. -
formatهو XrSpatialReferenceImageFormatEXT يمثّل تنسيق الصورة. -
planeCountهو عدد العناصر في مصفوفةplanes. -
planesهي مصفوفة من بُنى XrSpatialReferenceImagePlaneEXT التي تمثّل مستويات بيانات الصورة.
يمكن للتطبيق إنشاء بنية واحدة أو أكثر من XrSpatialReferenceImageEXT، بحيث تمثّل كل منها صورة مرجعية واحدة يتم تمريرها إلى دالة xrCreateSpatialImageTrackingDatabaseAsyncEXT من خلال XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages عند إنشاء مؤشر XrSpatialImageTrackingDatabaseEXT.
يجب أن يوفّر التطبيق بيانات XrSpatialReferenceImagePlaneEXT :: buffer بترتيب بكسل من اليسار إلى اليمين ومن الأعلى إلى الأسفل.
يجب أن يوفّر التطبيق بنية XrSpatialReferenceImagePlaneEXT في مصفوفة XrSpatialReferenceImageEXT :: planes لكل قناة لون في XrSpatialReferenceImageEXT :: format .
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_image_trackingقبل استخدام XrSpatialReferenceImageEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية . يُرجى الاطّلاع أيضًا على: XrSpatialAnnotationQuadReferenceANDROID وXrSpatialImageSizeEXT وXrSpatialImageStaticOptimizationEXT - يجب أن تكون قيمة
formatصالحة لـ XrSpatialReferenceImageFormatEXT - يجب أن يكون
planesمؤشرًا إلى مصفوفة من هياكلplaneCountصالحة من نوع XrSpatialReferenceImagePlaneEXT - يجب أن تكون المَعلمة
planeCountأكبر من0
المكوّنات المضمونة
يجب أن توفّر بيئة التشغيل التي تتيح استخدام XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT المكوّنات المكانية التالية كمكوّنات مضمونة لجميع الكيانات التي تكتشفها هذه الإمكانات، ويجب تعدادها في xrEnumerateSpatialCapabilityComponentTypesEXT :
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXTXR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
مكوّن صورة ثنائي الأبعاد
بنية قائمة المكوّنات لطلب البيانات
يتم تحديد بنية XrSpatialComponentImage2DListEXT على النحو التالي:
typedef struct XrSpatialComponentImage2DListEXT {
XrStructureType type;
const void* next;
uint32_t imageCount;
XrSpatialImage2DDataEXT* images;
} XrSpatialComponentImage2DListEXT;
أوصاف المَعلمات
-
typeهو XrStructureType لهذه البنية. -
nextهوNULLأو مؤشر إلى البنية التالية في سلسلة البنى. -
imageCountهو عدد العناصر في مصفوفةimages. imagesهو مصفوفة من XrSpatialImage2DDataEXT .
يجب أن يعرض وقت التشغيل XR_ERROR_VALIDATION_FAILURE من xrQuerySpatialComponentDataEXT إذا كان XrSpatialComponentImage2DListEXT في السلسلة next من XrSpatialComponentDataQueryResultEXT، ولكن لم يتم تضمين XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT في componentTypes من XrSpatialComponentDataQueryConditionEXT.
يجب أن يعرض وقت التشغيل XR_ERROR_SIZE_INSUFFICIENT من xrQuerySpatialComponentDataEXT إذا كان imageCount أقل من XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_image_trackingقبل استخدام XrSpatialComponentImage2DListEXT - يجب أن يكون
typeXR_TYPE_SPATIAL_COMPONENT_IMAGE_2D_LIST_EXT -
nextيجب أن تكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية -
imagesيجب أن يكون مؤشرًا إلى مصفوفة من هياكلimageCountXrSpatialImage2DDataEXT - يجب أن تكون المَعلمة
imageCountأكبر من0
بيانات المكوّن
يتم تحديد بنية XrSpatialImage2DDataEXT على النحو التالي:
typedef struct XrSpatialImage2DDataEXT {
XrSpatialImageTrackingDatabaseEXT imageTrackingDatabase;
uint32_t referenceImageIndex;
} XrSpatialImage2DDataEXT;
أوصاف المَعلمات
-
imageTrackingDatabaseهي XrSpatialImageTrackingDatabaseEXT التي رصدت الصورة أو تتبّعتها. -
referenceImageIndexهو الفهرس الذي يربط مصفوفةspatialReferenceImagesمن الصور المرجعية للإدخال التي تم إنشاءimageTrackingDatabaseباستخدامها بـ XrSpatialImageTrackingDatabaseCreateInfoEXT.
يمكن للتطبيق استخدام imageTrackingDatabase لتحديد أيّ من XrSpatialImageTrackingDatabaseEXT التي تم إنشاؤها سابقًا تحتوي على الصورة المرجعية لبنية XrSpatialImage2DDataEXT هذه. بالنسبة إلى XrSpatialImageTrackingDatabaseEXT، يمكن للتطبيق استخدام referenceImageIndex لتحديد XrSpatialReferenceImageEXT لبنية XrSpatialImage2DDataEXT هذه من خلال مطابقتها مع ترتيب الإدخال لمصفوفة XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages.
يجب ألا تتضمّن مجموعة الصور المرجعية المحدّدة من خلال مجموعة جميع قواعد البيانات النشطة صورًا مكرّرة. قد يؤدي تضمين صور مكرّرة إلى حدوث سلوك غير مرغوب فيه في ما يتعلق بالاكتشاف أو التتبّع، أي عرض فهارس متعددة أو غير متسقة.
الاستخدام الصالح (ضمني)
- يجب تفعيل الإضافة
XR_EXT_spatial_image_trackingقبل استخدام XrSpatialImage2DDataEXT - يجب أن يكون
imageTrackingDatabaseاسم معرِّف صالحًا لـ XrSpatialImageTrackingDatabaseEXT
الإعداد
إذا تم تعداد XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT في XrSpatialCapabilityComponentTypesEXT :: componentTypes لبعض الإمكانات، يمكن للتطبيق تفعيلها من خلال تضمين قيمة التعداد في قائمة XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents. لا يتطلّب هذا المكوّن أي إعدادات خاصة ليتم تضمينه في السلسلة التالية من XrSpatialCapabilityConfigurationBaseHeaderEXT .
مكوّن ثنائي الأبعاد مقيّد
يوفّر المكوّن الثنائي الأبعاد المحدود مركز الصورة المكانية التي يمثّلها الكيان الذي يتضمّنه ونطاقاتها. يُرجى الاطّلاع على Bounded 2D لمزيد من التفاصيل حول مكوّن Bounded 2D.
مثال على الشفرة
استكشاف الصور المكانية وبيانات مكوّنات طلبات البحث
يوضّح الرمز البرمجي في المثال التالي كيفية اكتشاف الكيانات المكانية لميزة تتبُّع الصور والاستعلام عن بيانات المكوّنات الخاصة بها.
XrInstance instance; // Previously initialized
XrSystemId systemId; // Previously initialized
XrSession session; // Previously initialized
uint32_t capabilityCountOutput = 0;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0, &capabilityCountOutput, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCountOutput);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilities.size(), &capabilityCountOutput, capabilities.data()));
if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT) == capabilities.end()) {
// Image tracking not supported
}
XrSpatialCapabilityComponentTypesEXT imageTrackingComponents{XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, &imageTrackingComponents));
std::vector<XrSpatialComponentTypeEXT> imageTrackingCapabilityComponents(imageTrackingComponents.componentTypeCountOutput);
imageTrackingComponents.componentTypes = imageTrackingCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, &imageTrackingComponents));
if (std::find(imageTrackingCapabilityComponents.begin(), imageTrackingCapabilityComponents.end(), XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT) == imageTrackingCapabilityComponents.end()) {
// The image2d component is not supported
}
uint32_t capabilityFeatureCountOutput = 0;
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, 0, &capabilityFeatureCountOutput, nullptr));
std::vector<XrSpatialCapabilityFeatureEXT> capabilityFeatures(capabilityFeatureCountOutput);
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, capabilityFeatures.size(), &capabilityFeatureCountOutput, capabilityFeatures.data()));
// Helper function to query optional feature support
const auto supportsFeature = [&capabilityFeatures](XrSpatialCapabilityFeatureEXT feature) {
return std::find(capabilityFeatures.begin(), capabilityFeatures.end(), feature) != capabilityFeatures.end();
};
// supported state for optional features
const bool supportsAutomaticScaleEstimation = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT);
const bool supportsStaticImages = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT);
const bool supportsFixedSizeImages = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT);
uint32_t formatCountOutput = 0;
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, 0, &formatCountOutput, nullptr));
std::vector<XrSpatialReferenceImageFormatEXT> formats(formatCountOutput);
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, formats.size(), &formatCountOutput, formats.data()));
if (std::find(formats.begin(), formats.end(), XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT) == formats.end()) {
// The desired format is not supported
}
// Helper function to wait for XrFutureEXT completion
auto waitUntilReady = [&](XrFutureEXT future) {
XrFuturePollInfoEXT pollInfo{XR_TYPE_FUTURE_POLL_INFO_EXT};
XrFuturePollResultEXT pollResult{XR_TYPE_FUTURE_POLL_RESULT_EXT};
pollInfo.future = future;
do {
// sleep(1);
CHK_XR(xrPollFutureEXT(instance, &pollInfo, &pollResult));
} while (pollResult.state != XR_FUTURE_STATE_READY_EXT);
};
// Data/metadata about reference images (identifiers, 3D models, trigger functions, etc.)
std::vector<std::string> referenceImageIdentifiers;
XrSpatialImageTrackingDatabaseEXT imageTrackingDatabase{};
{
uint32_t imgSize; // preloaded interleaved RGBA buffer size
uint8_t* img; // preloaded interleaved RGBA buffer data
// interleaved RGBA buffer memory layout and buffer positions
// first row of pixels
// img[0] | img[1] | img[2] | img[3] | img[0]+pStride | img[1]+pStride | ...
// R0 | G0 | B0 | A0 | R1 | G1 | ...
// second row of pixels
// img[0]+rStride | img[1]+rStride | img[2]+rStride | img[3]+rStride | img[0]+rStride+pStride | ...
// R640 | G640 | B640 | A640 | R641 | ...
XrSpatialReferenceImagePlaneEXT spatialReferenceImagePlanes[4];
for (int i = 0; i < 4; ++i) { // for each plane (0=R, 1=G, 2=B, 3=A)
spatialReferenceImagePlanes[i].buffer = img + i; // set each plane buffer pointer to the first pixel of the plane
spatialReferenceImagePlanes[i].bufferSize = imgSize - i; // adjust remeinaing buffer size according to offset applied
spatialReferenceImagePlanes[i].rowStride = 640 * 4; // set byte offset to start of next row for this plane
spatialReferenceImagePlanes[i].pixelStride = 4; // set byte offset to next pixel for this plane
}
XrSpatialReferenceImageEXT spatialReferenceImage{XR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT};
spatialReferenceImage.width = 640;
spatialReferenceImage.height = 480;
spatialReferenceImage.format = XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT;
spatialReferenceImage.planeCount = 4;
spatialReferenceImage.planes = spatialReferenceImagePlanes;
referenceImageIdentifiers.emplace_back("MyReferenceImage");
// Helper function to append to the next chain
XrBaseOutStructure* appendTo = reinterpret_cast<XrBaseOutStructure*>(&spatialReferenceImage);
const auto appendToNextChain = [&appendTo](XrBaseOutStructure* toAppend) {
appendTo->next = toAppend;
appendTo = toAppend;
};
XrSpatialImageSizeEXT imageSize{XR_TYPE_SPATIAL_IMAGE_SIZE_EXT};
imageSize.physicalWidth = 0.1f;
if (!supportsAutomaticScaleEstimation) {
if (supportsFixedSizeImages) {
appendToNextChain(reinterpret_cast<XrBaseOutStructure*>(&imageSize));
}
}
XrSpatialImageStaticOptimizationEXT imageStaticOptimization{XR_TYPE_SPATIAL_IMAGE_STATIC_OPTIMIZATION_EXT};
imageStaticOptimization.optimizeForStaticImage = XR_TRUE;
if (supportsStaticImages) {
appendToNextChain(reinterpret_cast<XrBaseOutStructure*>(&imageStaticOptimization));
}
XrSpatialImageTrackingDatabaseCreateInfoEXT spatialImageTrackingDatabaseCreateInfo{XR_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_CREATE_INFO_EXT};
spatialImageTrackingDatabaseCreateInfo.spatialReferenceImages = &spatialReferenceImage;
spatialImageTrackingDatabaseCreateInfo.spatialReferenceImageCount = 1;
XrFutureEXT createImageTrackingDatabaseFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialImageTrackingDatabaseAsyncEXT(session, &spatialImageTrackingDatabaseCreateInfo, &createImageTrackingDatabaseFuture));
waitUntilReady(createImageTrackingDatabaseFuture);
XrCreateSpatialImageTrackingDatabaseCompletionEXT imageTrackingCompletion{XR_TYPE_CREATE_SPATIAL_IMAGE_TRACKING_DATABASE_COMPLETION_EXT};
CHK_XR(xrCreateSpatialImageTrackingDatabaseCompleteEXT(session, createImageTrackingDatabaseFuture, &imageTrackingCompletion));
if (imageTrackingCompletion.futureResult != XR_SUCCESS) {
// Error, image tracking database creation failed
}
imageTrackingDatabase = imageTrackingCompletion.database;
}
XrSpatialContextEXT spatialContext{};
{
const std::array<XrSpatialComponentTypeEXT, 2> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT
};
// Configure the image tracking capability for the spatial context
XrSpatialCapabilityConfigurationImageTrackingEXT imageTrackingCapabilityConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_IMAGE_TRACKING_EXT};
imageTrackingCapabilityConfig.capability = XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT;
imageTrackingCapabilityConfig.enabledComponentCount = enabledComponents.size();
imageTrackingCapabilityConfig.enabledComponents = enabledComponents.data();
imageTrackingCapabilityConfig.imageTrackingDatabaseCount = 1;
imageTrackingCapabilityConfig.imageTrackingDatabases = &imageTrackingDatabase;
std::vector<XrSpatialCapabilityConfigurationBaseHeaderEXT*> capabilityConfigs;
capabilityConfigs.push_back(reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&imageTrackingCapabilityConfig));
XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
XrFutureEXT createContextFuture = XR_NULL_FUTURE_EXT;
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) {
// Error, spatial context creation failed
}
spatialContext = completion.spatialContext;
}
auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
// We want to look for entities that have the following components
std::array<XrSpatialComponentTypeEXT, 2> snapshotComponents {XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT, XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT};
XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
snapshotCreateInfo.componentTypes = snapshotComponents.data();
XrFutureEXT discoveryFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &discoveryFuture));
waitUntilReady(discoveryFuture);
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
completionInfo.baseSpace = localSpace;
completionInfo.time = time;
completionInfo.future = discoveryFuture;
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 component data
XrSpatialComponentTypeEXT componentsToQuery[] = {XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT, XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT};
XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypes = componentsToQuery;
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.entityStateCountOutput);
queryResult.entityIdCapacityInput = entityIds.size();
queryResult.entityIds = entityIds.data();
queryResult.entityStateCapacityInput = entityStates.size();
queryResult.entityStates = entityStates.data();
std::vector<XrSpatialBounded2DDataEXT> bounded2d(queryResult.entityIdCountOutput);
XrSpatialComponentBounded2DListEXT boundsList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT};
boundsList.boundCount = bounded2d.size();
boundsList.bounds = bounded2d.data();
queryResult.next = &boundsList;
std::vector<XrSpatialImage2DDataEXT> image2d(queryResult.entityIdCountOutput);
XrSpatialComponentImage2DListEXT imagesList{XR_TYPE_SPATIAL_COMPONENT_IMAGE_2D_LIST_EXT};
imagesList.imageCount = image2d.size();
imagesList.images = image2d.data();
queryResult.next = &imagesList;
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) {
const XrSpatialImage2DDataEXT& currentImage2d = image2d[i];
const std::string& currentReferenceImageIdentifier = referenceImageIdentifiers[currentImage2d.referenceImageIndex];
std::cout << currentReferenceImageIdentifier << std::endl; // Outputs the "MyReferenceImage" string the app defined previously; could be any other assocatied data or action.
// Access bounded2d[i] for image bounds
}
}
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
}
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
// Unload spatial image tracking resources internally
CHK_XR(xrDestroySpatialImageTrackingDatabaseEXT(imageTrackingDatabase));
أنواع العناصر الجديدة
الأوامر الجديدة
- xrCreateSpatialImageTrackingDatabaseAsyncEXT
- xrCreateSpatialImageTrackingDatabaseCompleteEXT
- xrDestroySpatialImageTrackingDatabaseEXT
- xrEnumerateSpatialReferenceImageFormatsEXT
منشآت جديدة
- XrCreateSpatialImageTrackingDatabaseCompletionEXT
- XrSpatialCapabilityConfigurationImageTrackingEXT
- XrSpatialImage2DDataEXT
- XrSpatialImageTrackingDatabaseCreateInfoEXT
- XrSpatialReferenceImageEXT
- XrSpatialReferenceImagePlaneEXT
توسيع XrSpatialReferenceImageEXT وXrSpatialImageTrackingDatabaseCreateInfoEXT :
عمليات تعداد جديدة
ثوابت تعداد جديدة
XR_EXT_SPATIAL_IMAGE_TRACKING_EXTENSION_NAMEXR_EXT_spatial_image_tracking_SPEC_VERSIONتوسيع XrObjectType :
XR_OBJECT_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_EXT
توسيع XrResult :
XR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXTXR_ERROR_SPATIAL_IMAGE_INVALID_EXTXR_ERROR_SPATIAL_IMAGE_SIZE_MISSING_EXT
توسيع XrSpatialCapabilityEXT :
XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT
توسيع XrSpatialCapabilityFeatureEXT :
XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXTXR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXTXR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT
توسيع XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT
توسيع XrStructureType :
XR_TYPE_CREATE_SPATIAL_IMAGE_TRACKING_DATABASE_COMPLETION_EXTXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_IMAGE_TRACKING_EXTXR_TYPE_SPATIAL_COMPONENT_IMAGE_2D_LIST_EXTXR_TYPE_SPATIAL_IMAGE_SIZE_EXTXR_TYPE_SPATIAL_IMAGE_STATIC_OPTIMIZATION_EXTXR_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_CREATE_INFO_EXTXR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT
المشاكل
سجلّ الإصدارات
الإصدار 1، 22-04-2025 (دانيال غوتنبرغ، Qualcomm)
- الوصف الأولي للإضافة