XR_ANDROID_spatial_annotation_tracking
رشته نام
XR_ANDROID_spatial_annotation_tracking
نوع افزونه
افزونه نمونه
شماره داخلی ثبتشده
795
بازبینی
1
وضعیت تصویب
تصویبنشده
وابستگیهای افزونه و نسخه
XR_EXT_spatial_entity
و
XR_EXT_spatial_image_tracking
تاریخ آخرین تغییر
2026-01-12
وضعیت IP
هیچ ادعای مالکیت فکری شناختهشدهای وجود ندارد.
همیاران
Levana Chen، Google
Christopher Feil، Google
Martin Sundermeyer، Google
David Joseph Tan، Google
Jared Finder، Google
Nihav Jain، Google
نمای کلی
این افزونه قابلیت ردیابی حاشیهنویسی را برای افزونه XR_EXT_spatial_entity فراهم میکند تا حاشیهنویسیهای مختلف را در صحنه ردیابی کند. این مجوز به برنامهها امکان میدهد تا روی اشیاء فیزیکی یا مجازی که با ارجاعهای زمان اجرا تعریف شدهاند، همپوشانی قرار دهند.
این افزونه نوع حاشیهنویسی پایه «Quad» را ارائه میدهد که چندضلعیای با دقیقاً ۴ ضلع است، یعنی چهارضلعی محدب، که نشاندهنده چارگوش احاطهکننده دوبعدی تعمیمیافته در مرجع زمان اجرا است. حاشیهنویسی چهارگوش ردیابیشده بهعنوان یک موجودیت فضایی با (یا «دارای») مؤلفههای زیر نشان داده میشود:
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
برنامهها معمولاً میتوانند از افزونه ردیابی حاشیهنویسی فضایی در الگوهای زیر استفاده کنند:
- برنامه ابتدا یک دسته XrSpatialReferenceCacheANDROID ایجاد میکند که شروع به ضبط مراجع زمان اجرا از منبع دادهشده میکند.
- سپس برنامه مرجع زمان اجرای XrSpatialReferenceImageEXT را ضبط میکند و حاشیهنویسی موردنظر را درطول بازه زمانی حافظه نهان مرجع در مرجع تعریف میکند.
- سپس برنامه یک دسته XrSpatialContextEXT براساس XrSpatialReferenceImageEXT ارائهشده توسط XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ایجاد میکند.
- برنامه میتواند دسته XrSpatialReferenceCacheANDROID را ازبین ببرد تا ضبط ارجاعهای زمان اجرا را متوقف کند و مصرف حافظه را کاهش دهد، یا منتظر رویداد
XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDبماند تا نتیجه مقداردهی اولیه را تأیید کند. - سپس برنامه رویداد
XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDرا برای تأیید نتیجه مقداردهی اولیه حاشیهنویسی میکشد. - اگر مقداردهی اولیه موفقیتآمیز باشد، برنامه میتواند سپس برای رویداد
XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXTبکشد تا حاشیهنویسی را ردیابی کند. - اگر مقداردهی اولیه ناموفق باشد، برنامه میتواند از کد خطای برگرداندهشده در رویداد برای تعیین دلیل خرابی استفاده کند و دسته XrSpatialContextEXT موجود را ازبین ببرد تا حاشیهنویسی جدیدی را شروع کند.
- صرفنظر از نتیجه مقداردهی اولیه، برنامه میتواند پساز دریافت رویداد، میانگیر تصویر را برای کاهش استفاده از حافظه آزاد کند.
- برنامه حاشیهنویسیها را طبق الگوهای دسترسی به موجودیت فضایی پیدا و پُرسمان میکند.
- برنامه میتواند دسته XrSpatialContextEXT اضافی ایجاد کند تا حاشیهنویسیها را در مرجع جدیدی درطول بازه زمانی XrSpatialReferenceCacheANDROID معتبر ردیابی کند.
- برنامه میتواند دستههای XrSpatialContextEXT را ازبین ببرد تا مجموعه حاشیهنویسیهای قابلشناسایی و قابلردیابی را بهطور پویا در زمان اجرا کاهش دهد.
پشتیبانی زمان اجرا
زمان اجرا باید پشتیبانی خود را از قابلیت ردیابی حاشیهنویسی بااستفاده از xrEnumerateSpatialCapabilitiesEXT با فهرست کردن قابلیت زیر تبلیغ کند:
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
وقتی زمان اجرا از قابلیت ردیابی حاشیهنویسی پشتیبانی میکند:
- این برنامه باید حداقل از یک مؤلفه حاشیهنویسی پشتیبانی کند و مؤلفههای حاشیهنویسی پشتیبانیشده را ازطریق xrEnumerateSpatialCapabilityComponentTypesEXT فهرست کند.
- باید حداقل یکی از XrSpatialReferenceImageFormatEXT را با فهرست کردن قالبهای مرجع پشتیبانیشده ازطریق xrEnumerateSpatialReferenceImageFormatsEXT با تنظیم
capabilityرویXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROIDپشتیبانی کند. - باید حداقل از یکی از XrSpatialAnnotationReferenceSourceANDROID پشتیبانی کند، با فهرست کردن منابع مرجع پشتیبانیشده ازطریق xrEnumerateSpatialAnnotationReferenceSourcesANDROID با تنظیم
capabilityرویXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID.
تابع xrEnumerateSpatialAnnotationReferenceSourcesANDROID بهصورت زیر تعریف میشود:
XrResult xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
XrInstance instance,
XrSystemId systemId,
XrSpatialCapabilityEXT capability,
uint32_t sourceCapacityInput,
uint32_t* sourceCountOutput,
XrSpatialAnnotationReferenceSourceANDROID* sources);
شرح پارامترها
-
instanceدستهای برای XrInstance است. systemIdXrSystemIdاست که منابع ارجاع آن شمارش خواهد شد.-
capabilityهمان XrSpatialCapabilityEXT است که منابع مرجع برای آن فهرست خواهد شد. sourceCapacityInputظرفیت آرایهsourcesاست، یا ۰ برای نشان دادن درخواست بازیابی ظرفیت موردنیاز.-
sourceCountOutputتعداد منابع است، یا ظرفیت موردنیاز درصورتیکهsourceCapacityInputکافی نباشد. -
sourcesآرایهای از XrSpatialAnnotationReferenceSourceANDROID است. اگرsourceCapacityInputبرابر با ۰ باشد، میتواندNULLباشد. - برای شرح مفصل بازیابی اندازه
sourcesموردنیاز، بخش پارامترهای اندازه میانگیر را ببینید.
برنامه میتواند فهرست منابع مرجع پشتیبانیشده توسط XrSystemId مشخصی را بااستفاده از xrEnumerateSpatialAnnotationReferenceSourcesANDROID شمارش کند.
زمان اجرا نباید منابع مرجعی را که افزونه آنها برای instance فعال نشده است شمارش کند.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_annotation_trackingباید پیشاز فراخوانی xrEnumerateSpatialAnnotationReferenceSourcesANDROID فعال شود -
instanceباید شناسه XrInstance معتبری باشد -
capabilityباید مقدار XrSpatialCapabilityEXT معتبری باشد -
sourceCountOutputباید اشارهگری به مقدارuint32_tباشد - اگر
sourceCapacityInput0نباشد،sourcesباید اشارهگری به آرایهای از مقادیرsourceCapacityInputXrSpatialAnnotationReferenceSourceANDROID باشد
کدهای برگشتی
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
typedef enum XrSpatialAnnotationReferenceSourceANDROID {
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID = 0,
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MEDIA_PROJECTION_ANDROID = 1,
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSpatialAnnotationReferenceSourceANDROID;
شمارش XrSpatialAnnotationReferenceSourceANDROID منبع مرجعی را که فراداده حاشیهنویسی را ارائه میدهد توصیف میکند.
مقادیر شمارشی معانی زیر را دارند:
شرح شمارشی
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID
تصویر مرجع تصویر برشنخوردهای است که از میانای برنامهسازی کاربردی دوربین Android برونداد شده است، مثلاً Image از ImageReader مرتبط با CameraDevice در Camera2 یا ImageProxy از ImageAnalysis مرتبط با CameraX. این دوربین معمولاً یکی از دوربینهای RGB است که رو به جلو قرار دارد.
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MEDIA_PROJECTION_ANDROID
تصویر مرجع یک تصویر برشنخورده است که از Android MediaProjection API برونداد شده است، مثلاً تصویری از ImageReader که با نمایشگر مجازی MediaProjection مرتبط است. این محیط میتواند شامل محتوای مجازی و واقعی باشد.
ساختار XrSystemSpatialAnnotationPropertiesANDROID بهصورت زیر تعریف میشود:
typedef struct XrSystemSpatialAnnotationPropertiesANDROID {
XrStructureType type;
void* next;
uint32_t referenceCacheTimespan;
uint32_t maxReferencePixelWidth;
uint32_t maxReferencePixelHeight;
uint32_t maxReferenceCount;
uint32_t maxAnnotationCount;
} XrSystemSpatialAnnotationPropertiesANDROID;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. referenceCacheTimespanنشاندهنده بازه زمانی برحسب ثانیه برای دسته XrSpatialReferenceCacheANDROID معتبر است.maxReferencePixelWidthنشاندهنده حداکثر پهنای لبه تصاویر مرجع به پیکسل است.maxReferencePixelHeightنشاندهنده حداکثر ارتفاع لبه تصاویر مرجع برحسب پیکسل است.maxReferenceCountنشاندهنده حداکثر تعداد تصاویر مرجع است که باید بهطور همزمان اختصاص داده شود.maxAnnotationCountنشاندهنده حداکثر تعداد حاشیهنویسیهایی است که بهطور همزمان ردیابی میشوند.
وقتی زمان اجرا از قابلیت ردیابی حاشیهنویسی پشتیبانی میکند، برنامه میتواند با زنجیر کردن ساختار XrSystemSpatialAnnotationPropertiesANDROID به XrSystemProperties هنگام فراخوانی xrGetSystemProperties، ویژگیهای سیستم مربوطه را بررسی کند.
اگر XrSpatialReferenceImageEXT :: width از XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference از maxReferencePixelWidth فراتر رود، زمان اجرا باید هنگام فراخوانی xrCreateSpatialContextAsyncEXT مقدار XR_ERROR_VALIDATION_FAILURE را برگرداند.
اگر XrSpatialReferenceImageEXT :: height از XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference از maxReferencePixelHeight فراتر رود، زمان اجرا باید هنگام فراخوانی xrCreateSpatialContextAsyncEXT مقدار XR_ERROR_VALIDATION_FAILURE را برگرداند.
اگر XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: time خارج از بازه زمانی XrSpatialReferenceCacheANDROID :: cache باشد، زمان اجرا باید هنگام فراخوانی xrCreateSpatialContextAsyncEXT مقدار XR_ERROR_TIME_INVALID را برگرداند. برنامه میتواند دسته XrSpatialContextEXT را با مرجع جدیدی درطول بازه زمانی XrSpatialReferenceCacheANDROID بازآفرینی کند.
اگر تعداد تصاویر مرجع اختصاصدادهشده از maxReferenceCount بیشتر شود، زمان اجرا باید XR_ERROR_LIMIT_REACHED را برگرداند و ازطریق XrEventDataSpatialAnnotationTrackingANDROID :: initializationResult نشان دهد که مقداردهی اولیه ناموفق بوده است. برنامه میتواند دسته XrSpatialContextEXT را ازبین ببرد و پساز تکمیل مقداردهی اولیه معلق دوباره امتحان کند.
اگر تعداد حاشیهنویسیهای فعال از maxAnnotationCount بیشتر شود، زمان اجرا باید هنگام فراخوانی xrCreateSpatialContextAsyncEXT مقدار XR_ERROR_VALIDATION_FAILURE را برگرداند.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_annotation_trackingباید قبلاز استفاده از XrSystemSpatialAnnotationPropertiesANDROID فعال شود -
typeبایدXR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROIDباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد
حافظه نهان مرجع زمان اجرا
XR_DEFINE_HANDLE(XrSpatialReferenceCacheANDROID)
دستگیره XrSpatialReferenceCacheANDROID نشاندهنده حافظه نهان ارجاعهای زمان اجرا است که از منبعی مشخص ضبط شده است.
تابع xrCreateSpatialReferenceCacheAsyncANDROID بهصورت زیر تعریف میشود:
XrResult xrCreateSpatialReferenceCacheAsyncANDROID(
XrSession session,
const XrSpatialReferenceCacheCreateInfoANDROID* createInfo,
XrFutureEXT* future);
شرح پارامترها
-
sessionیک XrSession است که در آن حافظه نهان مرجع فعال خواهد بود. -
createInfoاشارهگری به XrSpatialReferenceCacheCreateInfoANDROID است که برای مشخص کردن پارامترهای حافظه نهان مرجع استفاده میشود. -
futureاشارهگری به دسته خروجیXrFutureEXTاست.
برنامه میتواند با فراخوانی xrCreateSpatialReferenceCacheAsyncANDROID، یک دسته XrSpatialReferenceCacheANDROID ایجاد کند. ممکن است زمان اجرا مدتی طول بکشد تا سرویسهای ردیابی را مقداردهی اولیه کند. سپس برنامه میتواند xrCreateSpatialReferenceCacheCompleteANDROID را بهطور مکرر فراخوانی کند تا تکمیل این عملیات ناهمگام را بررسی کند.
اگر XrSpatialReferenceCacheCreateInfoANDROID :: capability در فهرست xrEnumerateSpatialCapabilitiesEXT نباشد، زمان اجرا باید XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT را برگرداند.
اگر XrSpatialReferenceCacheCreateInfoANDROID :: source توسط xrEnumerateSpatialAnnotationReferenceSourcesANDROID برای قابلیت دادهشده فهرست نشده باشد، زمان اجرا باید XR_ERROR_FEATURE_UNSUPPORTED را برگرداند.
برنامه میتواند فقط یک دسته برای هر منبع برای یک قابلیت خاص ایجاد کند. درغیراینصورت، زمان اجرا باید XR_ERROR_LIMIT_REACHED را برگرداند.
سپس برنامه میتواند مراجع زمان اجرا را درطول بازه زمانی دسته XrSpatialReferenceCacheANDROID ضبط کند تا دسته XrSpatialContextEXT جدیدی را پیکربندی کند.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_annotation_trackingباید قبلاز فراخوانی xrCreateSpatialReferenceCacheAsyncANDROID فعال شود -
sessionباید یک دسته XrSession معتبر باشد -
createInfoباید اشارهگری به ساختار XrSpatialReferenceCacheCreateInfoANDROID معتبر باشد -
futureباید اشارهگری به مقدارXrFutureEXTباشد
کدهای برگشتی
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXTXR_ERROR_VALIDATION_FAILURE
ساختار XrSpatialReferenceCacheCreateInfoANDROID بهصورت زیر تعریف میشود:
typedef struct XrSpatialReferenceCacheCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
XrSpatialAnnotationReferenceSourceANDROID source;
} XrSpatialReferenceCacheCreateInfoANDROID;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. چنین ساختارهایی در OpenXR اصلی یا این افزونه تعریف نشده است. -
capabilityیک XrSpatialCapabilityEXT است که توضیح میدهد حافظه پنهان مرجع برای کدام قابلیت ایجاد شده است. -
sourceیک XrSpatialAnnotationReferenceSourceANDROID است که منبع حافظه نهان مرجع را توصیف میکند.
ساختار XrSpatialReferenceCacheCreateInfoANDROID اطلاعات لازم برای ایجاد دسته XrSpatialReferenceCacheANDROID را شرح میدهد.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_annotation_trackingباید قبلاز استفاده از XrSpatialReferenceCacheCreateInfoANDROID فعال شود -
typeبایدXR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROIDباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
capabilityباید مقدار XrSpatialCapabilityEXT معتبری باشد -
sourceباید مقدار XrSpatialAnnotationReferenceSourceANDROID معتبری باشد
تابع xrCreateSpatialReferenceCacheCompleteANDROID بهصورت زیر تعریف میشود:
XrResult xrCreateSpatialReferenceCacheCompleteANDROID(
XrSession session,
XrFutureEXT future,
XrCreateSpatialReferenceCacheCompletionANDROID* completion);
شرح پارامترها
-
sessionهمان XrSession است که قبلاً به xrCreateSpatialReferenceCacheAsyncANDROID ::sessionارسال شده است. -
futureهمانXrFutureEXTاست که از xrCreateSpatialReferenceCacheAsyncANDROID ::futureدریافت شده است. -
completionاشارهگری به XrCreateSpatialReferenceCacheCompletionANDROID است.
برنامه میتواند xrCreateSpatialReferenceCacheCompleteANDROID را فراخوانی کند تا منتظر تکمیل عملیات ناهمگام شروعشده توسط xrCreateSpatialReferenceCacheAsyncANDROID بماند.
اگر future در وضعیت آماده نباشد، زمان اجرا باید XR_ERROR_FUTURE_PENDING_EXT را برگرداند. اگر future قبلاً تکمیل یا لغو شده باشد، زمان اجرا باید XR_ERROR_FUTURE_INVALID_EXT را برگرداند.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_annotation_trackingباید قبلاز فراخوانی xrCreateSpatialReferenceCacheCompleteANDROID فعال شود -
sessionباید یک دسته XrSession معتبر باشد -
completionباید اشارهگری به ساختار XrCreateSpatialReferenceCacheCompletionANDROID باشد
کدهای برگشتی
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_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
ساختار XrCreateSpatialReferenceCacheCompletionANDROID بهصورت زیر تعریف میشود:
typedef struct XrCreateSpatialReferenceCacheCompletionANDROID {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialReferenceCacheANDROID referenceCache;
} XrCreateSpatialReferenceCacheCompletionANDROID;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. چنین ساختارهایی در OpenXR اصلی یا این افزونه تعریف نشده است. -
futureResultXrResult عملیات ایجاد حافظه نهان مرجع است. referenceCacheدرصورت موفقیتآمیز بودن عملیات، دسته XrSpatialReferenceCacheANDROID است.
کدهای برگشتی آتی
مقادیر futureResult:
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHED
اگر futureResult کد موفقیت باشد، زمان اجرا باید یک دسته referenceCache معتبر برگرداند. اگر referenceCache معتبر باشد، فقط در طول عمر xrCreateSpatialReferenceCacheAsyncANDROID :: session یا تا زمانی که برنامه دسته را با xrDestroySpatialReferenceCacheANDROID ازبین ببرد (هرکدام زودتر اتفاق بیفتد) معتبر باقی میماند.
وقتی referenceCache معتبر باشد، حافظههای پنهان را در XrSystemSpatialAnnotationPropertiesANDROID :: referenceCacheTimespan ضبط میکند.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_annotation_trackingباید قبلاز استفاده از XrCreateSpatialReferenceCacheCompletionANDROID فعال شود -
typeبایدXR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROIDباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
futureResultباید مقدار XrResult معتبری باشد -
referenceCacheباید یک دسته XrSpatialReferenceCacheANDROID معتبر باشد
تابع xrDestroySpatialReferenceCacheANDROID بهصورت زیر تعریف میشود:
XrResult xrDestroySpatialReferenceCacheANDROID(
XrSpatialReferenceCacheANDROID cacheHandle);
شرح پارامترها
-
cacheHandleیک XrSpatialReferenceCacheANDROID است که قبلاً توسط xrCreateSpatialReferenceCacheAsyncANDROID ایجاد شده است.
برنامه میتواند تابع xrDestroySpatialReferenceCacheANDROID را فراخوانی کند تا پساز اتمام ایجاد بافت فضایی، دسته cacheHandle و منابع زیربنایی را آزاد کند.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_annotation_trackingباید پیشاز فراخوانی xrDestroySpatialReferenceCacheANDROID فعال شود -
cacheHandleباید یک دسته XrSpatialReferenceCacheANDROID معتبر باشد
ایمنی رشتهای
- دسترسی به
cacheHandleو هرگونه دسته فرزند باید بهصورت خارجی همگامسازی شود
کدهای برگشتی
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
پیکربندی
ساختار XrSpatialCapabilityConfigurationAnnotationTrackingANDROID بهصورت زیر تعریف میشود:
typedef struct XrSpatialCapabilityConfigurationAnnotationTrackingANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
XrSpatialReferenceCacheANDROID cache;
XrTime time;
XrSpatialReferenceImageEXT reference;
} XrSpatialCapabilityConfigurationAnnotationTrackingANDROID;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. -
capabilityیک XrSpatialCapabilityEXT است و بایدXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROIDباشد. enabledComponentCountیکuint32_tاست که تعداد عناصر را در آرایهenabledComponentsتوصیف میکند.-
enabledComponentsاشارهگری به آرایهای از XrSpatialComponentTypeEXT است. -
cacheیک XrSpatialReferenceCacheANDROID است که قبلاً برای ثبت ارجاعهای زمان اجرا برای پیکربندیreferenceایجاد شده است. timeXrTimeاست کهreferenceدر آن ضبط شده است.-
referenceیک XrSpatialReferenceImageEXT است که حاشیهنویسیها به اشارهگر بعدی آن زنجیر شدهاند.
برنامهها میتوانند با افزودن اشارهگر به ساختار XrSpatialCapabilityConfigurationAnnotationTrackingANDROID در XrSpatialContextCreateInfoEXT :: capabilityConfigs ، قابلیت فضایی XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID را فعال کنند.
اگر capability XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID نباشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را برگرداند.
اگر reference حاوی حاشیهنویسی نباشد، زمان اجرا باید XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT را برگرداند.
اگر مؤلفه حاشیهنویسی در enabledComponents فهرست شده باشد اما هیچ حاشیهنویسی متناظری با reference مرتبط نباشد، زمان اجرا باید XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT را برگرداند.
اگر cache متعلق به همان XrSession که به xrCreateSpatialContextAsyncEXT ارسال میشود نباشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را برگرداند.
اگر time خارج از بازه زمانی cache باشد، زمان اجرا باید XR_ERROR_TIME_INVALID را برگرداند.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_annotation_trackingباید قبلاز استفاده از XrSpatialCapabilityConfigurationAnnotationTrackingANDROID فعال شود -
typeبایدXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROIDباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
capabilityباید مقدار XrSpatialCapabilityEXT معتبری باشد -
enabledComponentsباید اشارهگری به آرایهای از مقادیر معتبرenabledComponentCountXrSpatialComponentTypeEXT باشد -
cacheباید یک دسته XrSpatialReferenceCacheANDROID معتبر باشد -
referenceباید ساختار XrSpatialReferenceImageEXT معتبری باشد - پارامتر
enabledComponentCountباید بزرگتر از0باشد
رویدادهای ردیابی حاشیهنویسی
ساختار XrEventDataSpatialAnnotationTrackingANDROID بهصورت زیر تعریف میشود:
typedef struct XrEventDataSpatialAnnotationTrackingANDROID {
XrStructureType type;
const void* next;
XrSpatialContextEXT spatialContext;
uint32_t annotationIndex;
XrResult initializationResult;
} XrEventDataSpatialAnnotationTrackingANDROID;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. -
spatialContextXrSpatialContextEXT است که ردگیری حاشیهنویسی را فعال کرده است. annotationIndexبه نمایه از آرایه حاشیهنویسی مرتبط با XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ::referenceنگاشت میشود.-
initializationResultنشاندهنده نتیجه مقداردهی اولیه حاشیهنویسی است. اگرXR_SUCCESSنباشد، برنامه میتواند دسته XrSpatialContextEXT را ازبین ببرد و دوباره ایجاد کند تا حاشیهنویسی را مجدداً مقداردهی اولیه کند، یا به استفاده ازspatialContextبرای ردیابی حاشیهنویسیهای دیگر ادامه دهد.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_annotation_trackingباید پیشاز استفاده از XrEventDataSpatialAnnotationTrackingANDROID فعال شود -
typeبایدXR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد
زمان اجرا باید XrEventDataSpatialAnnotationTrackingANDROID را برای هر حاشیهنویسی پر کند تا تکمیل مقداردهی اولیه آن را نشان دهد. صرفنظر از نتیجه مقداردهی اولیه، برنامه میتواند پساز دریافت رویداد، میانگیر تصویر را برای کاهش استفاده از حافظه آزاد کند.
اگر حاشیهنویسی با موفقیت مقداردهی اولیه شود، زمان اجرا باید initializationResult را با XR_SUCCESS پر کند. سپس برنامه میتواند رویداد XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT را برای ردیابی حاشیهنویسی بکشد.
درغیراینصورت، زمان اجرا باید initializationResult را با کد خطای مناسبی پر کند تا دلیل ناموفق بودن را نشان دهد. برنامه میتواند دسته XrSpatialContextEXT را ازبین ببرد تا حاشیهنویسی جدیدی را شروع کند یا به استفاده از spatialContext برای ردیابی حاشیهنویسیهای دیگر ادامه دهد.
حاشیهنویسی چهارگوش
زمان اجرا باید پشتیبانی خود از حاشیهنویسیهای چهارگوش را بااستفاده از xrEnumerateSpatialCapabilityComponentTypesEXT با فهرست کردن نوع مؤلفه زیر تبلیغ کند:
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
مرجع چهارگوش
ساختار XrSpatialAnnotationQuadReferenceANDROID بهصورت زیر تعریف میشود:
typedef struct XrSpatialAnnotationQuadReferenceANDROID {
XrStructureType type;
const void* next;
uint32_t quadCount;
const XrSpatialAnnotationQuadANDROID* quads;
} XrSpatialAnnotationQuadReferenceANDROID;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. quadCountیکuint32_tاست که تعداد عناصر را در آرایهquadsتوصیف میکند.-
quadsاشارهگر به آرایهای از XrSpatialAnnotationQuadANDROID است.
وقتی زمان اجرا از حاشیهنویسیهای چهارگوش پشتیبانی میکند، برنامه میتواند حاشیهنویسیها را با زنجیر کردن ساختار XrSpatialAnnotationQuadReferenceANDROID به XrSpatialReferenceImageEXT :: next پیکربندی کند و هنگام ایجاد دسته XrSpatialContextEXT، مرجع را در XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference تنظیم کند.
اگر quadCount برابر با ۰ باشد، زمان اجرا باید XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT را از xrCreateSpatialContextAsyncEXT برگرداند.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_annotation_trackingباید قبلاز استفاده از XrSpatialAnnotationQuadReferenceANDROID فعال شود -
typeبایدXR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROIDباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
quadsباید اشارهگری به آرایهای از ساختارهای معتبرquadCountXrSpatialAnnotationQuadANDROID باشد - پارامتر
quadCountباید بزرگتر از0باشد
ساختار XrSpatialAnnotationQuadANDROID بهصورت زیر تعریف میشود:
typedef struct XrSpatialAnnotationQuadANDROID {
XrSpatialAnnotationQuadAlignmentANDROID alignment;
XrVector2f upperLeft;
XrVector2f upperRight;
XrVector2f lowerRight;
XrVector2f lowerLeft;
} XrSpatialAnnotationQuadANDROID;
توضیحات عضو
-
alignmentXrSpatialAnnotationQuadAlignmentANDROID چهارضلعی است. -
upperLeftیک XrVector2f است که مختصات گوشه بالا سمت چپ چهارضلعی مربوط به مبدأ را توصیف میکند. upperRightیک XrVector2f است که مختصات گوشه بالا سمت راست چهارضلعی مربوط به مبدأ را توصیف میکند.-
lowerRightیک XrVector2f است که مختصات گوشه پایین سمت راست چهارضلعی مربوط به مبدأ را توصیف میکند. -
lowerLeftیک XrVector2f است که مختصات گوشه پایین سمت چپ چهارضلعی مربوط به مبدأ را توصیف میکند.
چهارضلعی در فضای دوبعدی، چهارضلعی محدبی با ترتیب ساعتگرد است. مقدار ۴ گوشه مربوط به مبدأ (۰، ۰) است که چهارضلعی با آن مرتبط است.
- وقتی با XrSpatialReferenceImageEXT مرتبط باشد، مبدأ گوشه بالا سمت چپ تصویر است که در آن X به پیکسل در عرض و Y به پیکسل در ارتفاع نگاشت میشود.
- وقتی با XrSpatialAnnotationQuadDataANDROID مرتبط باشد، مبدأ با XrSpaceLocationData ::
poseاز XrSpatialAnnotationQuadDataANDROID ::originنشان داده میشود.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_annotation_trackingباید قبلاز استفاده از XrSpatialAnnotationQuadANDROID فعال شود -
alignmentباید مقدار XrSpatialAnnotationQuadAlignmentANDROID معتبری باشد
typedef enum XrSpatialAnnotationQuadAlignmentANDROID {
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SCREEN_ANDROID = 0,
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID = 1,
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SURFACE_ANDROID = 2,
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSpatialAnnotationQuadAlignmentANDROID;
شمارش XrSpatialAnnotationQuadAlignmentANDROID تراز حاشیهنویسی چهارگوش را توصیف میکند.
مقادیر شمارشی معانی زیر را دارند:
شرح شمارشی
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SCREEN_ANDROID
چهارضلعی حاشیهنویسی موازی با صفحه نمایش است، درحالیکه چرخش درونصفحهای آن همچنان به گرانش جهانی قفل است. برونداد بهصورت یک کادر محدودکننده معمولی و عمودی ظاهر میشود.
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID
چهارضلعی حاشیهنویسی مستقیماً به شیء متصل میشود و با تراز تعریفشده در تصویر مرجع مطابقت دارد. برونداد یک چهارضلعی محدب است که شکل آن برای مطابقت با نمای شیء تنظیم میشود.
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SURFACE_ANDROID
با فرض اینکه هدف ردیابیشده شیء یا سطح مسطحی باشد، چهارضلعی حاشیهنویسی با سطح شیء زیرین همصفحه است. خروجی بهطور یکپارچه با هندسه فیزیکی شیء همراستا میشود و چشمانداز آن را بهگونهای تنظیم میکند که بهطور صاف روی آن سطح خاص قرار گیرد.
اجزای Quad
ساختار XrSpatialAnnotationQuadDataANDROID بهصورت زیر تعریف میشود:
typedef struct XrSpatialAnnotationQuadDataANDROID {
uint32_t annotationIndex;
XrSpaceLocationData origin;
XrSpatialAnnotationQuadANDROID quad;
} XrSpatialAnnotationQuadDataANDROID;
توضیحات عضو
-
annotationIndexنگاشت نمایه به آرایه XrSpatialAnnotationQuadReferenceANDROID ::quadsاست که با مرجع ارسالشده توسط XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ::referenceمرتبط است. -
originیک XrSpaceLocationData است که مبدأ صفحه دوبعدی را که چهارضلعی در آن ریشه دارد توصیف میکند. زمان اجرا باید XrSpaceLocationData ::locationFlagsرا تنظیم کند تا بیتهای معتبر حالت مبدأ را نشان دهد. -
quadیک XrSpatialAnnotationQuadANDROID است که نشاندهنده چهارضلعی در فضای محلی است. ازoriginبرای تبدیل چهارضلعی به فضای ژست استفاده کنید.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_annotation_trackingباید قبلاز استفاده از XrSpatialAnnotationQuadDataANDROID فعال شود -
originباید ساختار XrSpaceLocationData معتبری باشد -
quadباید ساختار XrSpatialAnnotationQuadANDROID معتبری باشد
ساختار XrSpatialComponentAnnotationQuadListANDROID بهصورت زیر تعریف میشود:
typedef struct XrSpatialComponentAnnotationQuadListANDROID {
XrStructureType type;
void* next;
uint32_t quadCount;
XrSpatialAnnotationQuadDataANDROID* quads;
} XrSpatialComponentAnnotationQuadListANDROID;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. quadCountیکuint32_tاست که تعداد عناصر را در آرایهquadsتوصیف میکند.-
quadsآرایهای از XrSpatialAnnotationQuadDataANDROID است.
برنامه میتواند با افزودن XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID در XrSpatialComponentDataQueryConditionEXT :: componentTypes و افزودن XrSpatialComponentAnnotationQuadListANDROID به زنجیره اشارهگر بعدی XrSpatialComponentDataQueryResultEXT، مؤلفه حاشیهنویسی چهارگوش نهادهای فضایی را در XrSpatialSnapshotEXT جستجو کند.
اگر XrSpatialComponentAnnotationQuadListANDROID در زنجیره بعدی XrSpatialComponentDataQueryResultEXT :: next باشد اما XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID در XrSpatialComponentDataQueryConditionEXT :: componentTypes گنجانده نشده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را از xrQuerySpatialComponentDataEXT برگرداند.
اگر quadCount کمتر از XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput باشد، زمان اجرا باید XR_ERROR_SIZE_INSUFFICIENT را از xrQuerySpatialComponentDataEXT برگرداند.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_annotation_trackingباید قبلاز استفاده از XrSpatialComponentAnnotationQuadListANDROID فعال شود -
typeبایدXR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROIDباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
quadsباید اشارهگری به آرایهای از ساختارهایquadCountXrSpatialAnnotationQuadDataANDROID باشد - پارامتر
quadCountباید بزرگتر از0باشد
کد نمونه
بررسی پشتیبانی زمان اجرا
کد نمونه زیر نشان میدهد که چگونه بررسی کنید آیا زمان اجرا از قابلیت ردیابی حاشیهنویسی پشتیبانی میکند یا نه.
XrInstance instance; // previously initialized
XrSystemId systemId; // previously initialized
XrSession session; // previously initialized
XrSpace localSpace; // previously initialized, e.g. from
// XR_REFERENCE_SPACE_TYPE_LOCAL
PFN_xrEnumerateSpatialCapabilitiesEXT xrEnumerateSpatialCapabilitiesEXT;
PFN_xrEnumerateSpatialAnnotationReferenceSourcesANDROID xrEnumerateSpatialAnnotationReferenceSourcesANDROID;
PFN_xrEnumerateSpatialReferenceImageFormatsEXT xrEnumerateSpatialReferenceImageFormatsEXT;
PFN_xrEnumerateSpatialCapabilityComponentTypesEXT xrEnumerateSpatialCapabilityComponentTypesEXT;
// Check spatial annotation tracking capability
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_ANNOTATION_TRACKING_ANDROID) ==
capabilities.end()) {
// System does not support spatial annotation tracking.
return;
}
// Inspect system properties for annotation tracking variables
XrSystemSpatialAnnotationPropertiesANDROID annotationSystemProperties{
XR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROID};
XrSystemProperties systemProperties{.type = XR_TYPE_SYSTEM_PROPERTIES,
.next = &annotationSystemProperties,
.systemId = systemId};
CHK_XR(xrGetSystemProperties(instance, systemId, &systemProperties));
if (annotationSystemProperties.maxAnnotationCount == 0) {
// System does not support any active annotations.
return;
}
// Enumerate supported reference sources
uint32_t sourceCountOutput = 0;
XrSpatialAnnotationReferenceSourceANDROID desiredSource =
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID;
CHK_XR(xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
0, &sourceCountOutput, nullptr));
std::vector<XrSpatialAnnotationReferenceSourceANDROID> sources(sourceCountOutput);
CHK_XR(xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
sourceCountOutput, &sourceCountOutput, sources.data()));
if (std::find(sources.begin(), sources.end(), desiredSource) == sources.end()) {
// The desired source is not supported.
return;
}
// Enumerate supported reference image formats, provided by XR_EXT_spatial_image_tracking.
uint32_t formatCountOutput = 0;
XrSpatialReferenceImageFormatEXT desiredFormat =
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_YUV_420_888_EXT; // Or XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT for screenshot.
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID, 0,
&formatCountOutput, nullptr));
std::vector<XrSpatialReferenceImageFormatEXT> formats(formatCountOutput);
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
formats.size(), &formatCountOutput, formats.data()));
if (std::find(formats.begin(), formats.end(), desiredFormat) == formats.end()) {
// The desired format is not supported
return;
}
// Enumerate supported components for annotation tracking capability.
XrSpatialCapabilityComponentTypesEXT capabilityComponentTypes{
XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
&capabilityComponentTypes));
std::vector<XrSpatialComponentTypeEXT>
annotationTypes(capabilityComponentTypes.componentTypeCountOutput);
capabilityComponentTypes.componentTypeCapacityInput = annotationTypes.size();
capabilityComponentTypes.componentTypes = annotationTypes.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
&capabilityComponentTypes));
// Check supported annotation components.
XrSpatialComponentTypeEXT desiredComponent =
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID;
const auto supportedComponent = [&annotationTypes](
XrSpatialComponentTypeEXT component) {
return std::find(annotationTypes.begin(), annotationTypes.end(), component) !=
annotationTypes.end();
};
if (!supportedComponent(desiredComponent)) {
// The desired annotation is not supported.
return;
}
پیکربندی حاشیهنویسی چهارگوش
کد نمونه زیر نحوه پیکربندی حاشیهنویسی چهارگوش را نشان میدهد.
XrInstance instance; // previously initialized
XrSystemId systemId; // previously initialized
XrSession session; // previously initialized
XrSpace localSpace; // previously initialized, e.g. from
// XR_REFERENCE_SPACE_TYPE_LOCAL
PFN_xrCreateSpatialReferenceCacheAsyncANDROID xrCreateSpatialReferenceCacheAsyncANDROID;
PFN_xrCreateSpatialReferenceCacheCompleteANDROID xrCreateSpatialReferenceCacheCompleteANDROID;
PFN_xrDestroySpatialReferenceCacheANDROID xrDestroySpatialReferenceCacheANDROID;
PFN_xrCreateSpatialContextAsyncEXT xrCreateSpatialContextAsyncEXT;
PFN_xrCreateSpatialContextCompleteEXT xrCreateSpatialContextCompleteEXT;
void (*waitUntilReady)(XrFutureEXT);
XrSpatialReferenceImageFormatEXT desiredFormat;
XrSpatialAnnotationReferenceSourceANDROID desiredSource;
XrSpatialComponentTypeEXT desiredComponent;
// Create and start reference cache to prepare for capturing reference images.
XrSpatialReferenceCacheANDROID referenceCache;
XrSpatialReferenceCacheCreateInfoANDROID cacheCreateInfo{
.type = XR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROID,
.next = nullptr,
.capability = XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
.source = desiredSource,
};
XrFutureEXT cacheFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialReferenceCacheAsyncANDROID(session, &cacheCreateInfo, &cacheFuture));
waitUntilReady(cacheFuture);
XrCreateSpatialReferenceCacheCompletionANDROID cacheCompletion{
XR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROID};
CHK_XR(xrCreateSpatialReferenceCacheCompleteANDROID(session, cacheFuture,
&cacheCompletion));
if (cacheCompletion.futureResult != XR_SUCCESS) {
// Error, reference cache creation failed
return;
}
referenceCache = cacheCompletion.referenceCache;
// Create the reference image with quad annotations
// YUV 4:2:0 Planar:
// ----------------------
// | Y |Cb |Cr |
// ----------------------
XrSpatialReferenceImagePlaneEXT cameraImagePlanes[3];
// for each plane (0=Y, 1=U(cb), 2=V(Cr)) return by Image#getPlanes().
for (int i = 0; i < 3; ++i) {
cameraImagePlanes[i].buffer; // read from Plane#getBuffer().
cameraImagePlanes[i].bufferSize; // set each buffer size. Y = width * height (bytes); U = Y / 4 (bytes); V = Y / 4 (bytes).
cameraImagePlanes[i].rowStride; // read from Plane#getRowStride().
cameraImagePlanes[i].pixelStride; // read from Plane#getPixelStride().
}
XrSpatialReferenceImageEXT referenceImage{
XR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT};
referenceImage.width = 640;
referenceImage.height = 480;
referenceImage.format = desiredFormat;
referenceImage.planeCount = 3;
referenceImage.planes = cameraImagePlanes;
XrSpatialAnnotationQuadANDROID
quad; // quad coordinates within the reference image.
quad.alignment = XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID;
// Set unnormalized pixel coordinates of 4 corners.
quad.upperLeft = {0.0, 0.0};
quad.upperRight = {0.0, 100.0};
quad.lowerRight = {100.0, 100.0};
quad.lowerLeft = {0.0, 100.0};
XrSpatialAnnotationQuadReferenceANDROID quadReference{
XR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROID};
quadReference.quads = &quad;
quadReference.quadCount = 1;
referenceImage.next = &quadReference;
// Create the spatial context with annotation configuration.
XrSpatialContextEXT spatialContext{};
{
const std::array<XrSpatialComponentTypeEXT, 1> enabledComponents = {
desiredComponent,
};
// Configure annotation tracking
XrSpatialCapabilityConfigurationAnnotationTrackingANDROID annotationConfig{
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROID};
annotationConfig.capability =
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID;
annotationConfig.enabledComponentCount = enabledComponents.size();
annotationConfig.enabledComponents = enabledComponents.data();
annotationConfig.cache = referenceCache;
annotationConfig.time; // The time when this reference image is captured.
annotationConfig.reference = referenceImage;
std::vector<XrSpatialCapabilityConfigurationBaseHeaderEXT *>
capabilityConfigs;
capabilityConfigs.push_back(
reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT *>(
&annotationConfig));
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
return;
}
spatialContext = completion.spatialContext;
CHK_XR(xrDestroySpatialReferenceCacheANDROID(referenceCache));
}
کاوش حاشیهنویسیهای فعال
کد نمونه زیر نحوه کاوش و پُرسمان حاشیهنویسیها را نشان میدهد.
XrInstance instance; // previously initialized
XrSession session; // previously initialized
XrSpace localSpace; // previously initialized, e.g. from
// XR_REFERENCE_SPACE_TYPE_LOCAL
XrSpatialContextEXT spatialContext; // previously created
PFN_xrCreateSpatialDiscoverySnapshotAsyncEXT xrCreateSpatialDiscoverySnapshotAsyncEXT;
PFN_xrCreateSpatialDiscoverySnapshotCompleteEXT xrCreateSpatialDiscoverySnapshotCompleteEXT;
PFN_xrQuerySpatialComponentDataEXT xrQuerySpatialComponentDataEXT;
PFN_xrDestroySpatialSnapshotEXT xrDestroySpatialSnapshotEXT;
PFN_xrPollEvent xrPollEvent;
PFN_xrDestroySpatialContextEXT xrDestroySpatialContextEXT;
void (*waitUntilReady)(XrFutureEXT);
XrSpatialComponentTypeEXT desiredComponent; // e.g. XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
auto discoverAnnotations = [&](XrSpatialContextEXT spatialContext, XrTime time,
XrSpace baseSpace) {
std::array<XrSpatialComponentTypeEXT, 1> snapshotComponents{desiredComponent};
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 = baseSpace;
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 desired annotation data, e.g. quad.
XrSpatialComponentTypeEXT componentsToQuery[] = {
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID};
XrSpatialComponentDataQueryConditionEXT queryCond{
XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypeCount = 1;
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<XrSpatialAnnotationQuadDataANDROID> quads(
queryResult.entityIdCountOutput);
XrSpatialComponentAnnotationQuadListANDROID quadList{
XR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROID};
quadList.quadCount = quads.size();
quadList.quads = quads.data();
queryResult.next = &quadList;
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 XrSpatialAnnotationQuadDataANDROID ¤tQuad = quads[i];
// Rendering quad in the view.
}
}
CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
}
};
while (1) {
// For every frame in frame loop
XrSpace space; // Application's play space.
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_ANNOTATION_TRACKING_ANDROID: {
const XrEventDataSpatialAnnotationTrackingANDROID &eventdata =
*reinterpret_cast<XrEventDataSpatialAnnotationTrackingANDROID *>(
&event);
if (eventdata.initializationResult != XR_SUCCESS) {
// handle initialization failure.
// e.g. CHK_XR(xrDestroySpatialContextEXT(spatialContext));
}
break;
}
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, space);
break;
}
}
}
// Finish frame loop
}
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
انواع شیء جدید
فرمانهای جدید
- xrCreateSpatialReferenceCacheAsyncANDROID
- xrCreateSpatialReferenceCacheCompleteANDROID
- xrDestroySpatialReferenceCacheANDROID
- xrEnumerateSpatialAnnotationReferenceSourcesANDROID
سازههای جدید
- XrCreateSpatialReferenceCacheCompletionANDROID
- XrEventDataSpatialAnnotationTrackingANDROID
- XrSpatialAnnotationQuadANDROID
- XrSpatialAnnotationQuadDataANDROID
- XrSpatialCapabilityConfigurationAnnotationTrackingANDROID
- XrSpatialReferenceCacheCreateInfoANDROID
درحال گسترش دادن XrSpatialComponentDataQueryResultEXT :
درحال گسترش دادن XrSpatialReferenceImageEXT :
درحال گسترش دادن XrSystemProperties :
Enums جدید
ثابتهای شمارشی جدید
XR_ANDROID_SPATIAL_ANNOTATION_TRACKING_EXTENSION_NAMEXR_ANDROID_spatial_annotation_tracking_SPEC_VERSIONدرحال گسترش دادن XrObjectType :
XR_OBJECT_TYPE_SPATIAL_REFERENCE_CACHE_ANDROID
درحال گسترش دادن XrSpatialCapabilityEXT :
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
درحال گسترش دادن XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
درحال گسترش دادن XrStructureType :
XR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROIDXR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDXR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROIDXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROIDXR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROIDXR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROIDXR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROID
مشکلات
سابقه نسخه
بازبینی ۱، ۲۰۲۵-۰۹-۱۷ (لوانا چن)
- توضیحات اولیه افزونه.