XR_ANDROID_spatial_annotation_tracking
מחרוזת שם
XR_ANDROID_spatial_annotation_tracking
סוג התוסף
הרחבת המכונה
מספר שלוחה רשום
795
Revision
1
סטטוס האישור
לא אושר
תלות בתוסף ובגרסה
XR_EXT_spatial_entity
וגם
XR_EXT_spatial_image_tracking
תאריך השינוי האחרון
2026-01-12
סטטוס כתובת ה-IP
לא ידוע על תלונות בנושא זכויות יוצרים שקשורות לכתובות 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, שהוא מצולע עם בדיוק 4 צלעות, כלומר מרובע קמור, שמייצג תיבת תוחמת דו-ממדית כללית בהפניה בזמן ריצה. הערה של ריבוע למעקב מיוצגת כישות מרחבית עם (או "שכוללת") הרכיבים הבאים:
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
אפליקציות יכולות בדרך כלל להשתמש בתוסף למעקב אחר הערות מרחביות בדפוסים הבאים:
- אפליקציה יוצרת קודם כל נקודת אחיזה של XrSpatialReferenceCacheANDROID שמתחילה לתעד הפניות בזמן ריצה מהמקור הנתון.
- לאחר מכן האפליקציה מתעדת הפניה בזמן ריצה אל XrSpatialReferenceImageEXT ומגדירה הערה רצויה בהפניה במהלך משך הזמן של מטמון ההפניה.
- לאחר מכן האפליקציה יוצרת נקודת אחיזה של XrSpatialContextEXT על סמך XrSpatialReferenceImageEXT שסופקה על ידי XrSpatialCapabilityConfigurationAnnotationTrackingANDROID .
- האפליקציה יכולה להרוס את ה-handle של 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כדי לעקוב אחרי ההערה. - אם האתחול נכשל, האפליקציה יכולה להשתמש בקוד השגיאה שמוחזר באירוע כדי לקבוע את סיבת הכשל, ולכבות סופית את ה-handle הקיים של 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 . -
systemIdהואXrSystemIdשמקורות ההפניה שלו יפורטו. -
capabilityהוא XrSpatialCapabilityEXT שעבורו יפורטו מקורות ההפניה. -
sourceCapacityInputהוא הקיבולת של המערךsources, או 0 כדי לציין בקשה לאחזור הקיבולת הנדרשת. -
sourceCountOutputהוא מספר המקורות או הקיבולת הנדרשת במקרה ש-sourceCapacityInputלא מספיק. -
sourcesהוא מערך של XrSpatialAnnotationReferenceSourceANDROID . הערך של יכול להיותNULLאם הערך שלsourceCapacityInputהוא 0. - בקטע פרמטרים של גודל המאגר מופיע תיאור מפורט של אחזור הגודל הנדרש של
sources.
האפליקציה יכולה למנות את רשימת מקורות ההפניה שנתמכים על ידי XrSystemId נתון באמצעות xrEnumerateSpatialAnnotationReferenceSourcesANDROID .
זמן הריצה לא יכול למנות את מקורות ההפניה שהתוסף שלהם לא מופעל עבור instance .
שימוש תקף (משתמע)
- חובה להפעיל את התוסף
XR_ANDROID_spatial_annotation_trackingלפני שמפעילים את xrEnumerateSpatialAnnotationReferenceSourcesANDROID -
instanceחייב להיות ידית XrInstance תקינה -
capabilityחייב להיות ערך תקין של XrSpatialCapabilityEXT -
sourceCountOutputחייב להיות מצביע לערךuint32_t - אם
sourceCapacityInputהוא לא0,sourcesחייב להיות מצביע למערך שלsourceCapacityInputערכים מסוג XrSpatialAnnotationReferenceSourceANDROID
קודי החזרה
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 מתארת את מקור ההפניה שמספק את המטא-נתונים של ההערה.
המשמעויות של ה-enums הן:
תיאור של טיפוס בן מנייה (enum)
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID
תמונת ההפניה היא פלט של תמונה לא חתוכה מ-Android Camera API, למשל תמונה מ-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;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
referenceCacheTimespanמציין את משך הזמן בשניות של נקודת אחיזה תקפה של XrSpatialReferenceCacheANDROID. -
maxReferencePixelWidthמציין את הרוחב המקסימלי של קצה תמונות ההפניה בפיקסלים. -
maxReferencePixelHeightמציין את הגובה המקסימלי של קצה תמונות ההפניה בפיקסלים. -
maxReferenceCountמציין את המספר המקסימלי של תמונות להשוואה שיוקצו בו-זמנית. -
maxAnnotationCountמציין את המספר המקסימלי של הערות שאפשר לעקוב אחריהן בו-זמנית.
אם סביבת זמן הריצה תומכת ביכולת מעקב ההערות, אפליקציה יכולה לבדוק מאפייני מערכת רלוונטיים על ידי שרשור מבנה XrSystemSpatialAnnotationPropertiesANDROID אל XrSystemProperties כשקוראים ל-xrGetSystemProperties .
אם הערך של XrSpatialReferenceImageEXT :: width מתוך XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference גדול מ-maxReferencePixelWidth , סביבת הריצה חייבת להחזיר את הערך XR_ERROR_VALIDATION_FAILURE כשקוראים ל-xrCreateSpatialContextAsyncEXT .
אם הערך של XrSpatialReferenceImageEXT :: height מתוך XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference גדול מ-maxReferencePixelHeight , סביבת הריצה חייבת להחזיר את הערך XR_ERROR_VALIDATION_FAILURE כשקוראים ל-xrCreateSpatialContextAsyncEXT .
אם XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: time נמצא מחוץ לטווח הזמן של XrSpatialReferenceCacheANDROID :: cache , סביבת הריצה חייבת להחזיר XR_ERROR_TIME_INVALID כשקוראים ל- xrCreateSpatialContextAsyncEXT . האפליקציה יכולה ליצור מחדש את ה-handle XrSpatialContextEXT עם הפניה חדשה במהלך טווח הזמן של XrSpatialReferenceCacheANDROID .
אם מספר תמונות הייחוס שהוקצו חורג מ-maxReferenceCount , זמן הריצה חייב להחזיר את הערך XR_ERROR_LIMIT_REACHED ולציין את כשל האתחול באמצעות XrEventDataSpatialAnnotationTrackingANDROID :: initializationResult . האפליקציה יכולה להרוס את ה-handle של XrSpatialContextEXT ולנסות שוב אחרי שהאתחול בהמתנה יסתיים.
אם מספר ההערות הפעילות גדול מ-maxAnnotationCount , סביבת זמן הריצה חייבת להחזיר XR_ERROR_VALIDATION_FAILURE כשקוראים לפונקציה xrCreateSpatialContextAsyncEXT .
שימוש תקף (משתמע)
- חובה להפעיל את התוסף
XR_ANDROID_spatial_annotation_trackingלפני שמשתמשים ב-XrSystemSpatialAnnotationPropertiesANDROID -
typeחייב להיותXR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROID -
nextחייב להיותNULLאו מצביע תקין אל המבנה הבא בשרשרת המבנים
מטמון הפניות בזמן ריצה
XR_DEFINE_HANDLE(XrSpatialReferenceCacheANDROID)
ה-handle XrSpatialReferenceCacheANDROID מייצג מטמון של הפניות בזמן ריצה שתועדו ממקור נתון.
הפונקציה xrCreateSpatialReferenceCacheAsyncANDROID מוגדרת כך:
XrResult xrCreateSpatialReferenceCacheAsyncANDROID(
XrSession session,
const XrSpatialReferenceCacheCreateInfoANDROID* createInfo,
XrFutureEXT* future);
תיאורי הפרמטרים
-
sessionהוא XrSession שבו מטמון ההפניות יהיה פעיל. -
createInfoהוא מצביע אל XrSpatialReferenceCacheCreateInfoANDROID שמשמש לציון הפרמטרים של מטמון ההפניות. -
futureהוא מצביע לכינוי הפלט שלXrFutureEXT.
האפליקציה יכולה ליצור נקודת אחיזה של XrSpatialReferenceCacheANDROID על ידי קריאה ל-xrCreateSpatialReferenceCacheAsyncANDROID . יכול להיות שיעבור זמן מה עד שסביבת זמן הריצה תאתחל את שירותי המעקב. לאחר מכן, האפליקציה יכולה לקרוא שוב ושוב לפונקציה xrCreateSpatialReferenceCacheCompleteANDROID כדי לבדוק אם הפעולה האסינכרונית הזו הושלמה.
סביבת זמן הריצה חייבת להחזיר את הערך XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT אם XrSpatialReferenceCacheCreateInfoANDROID :: capability לא מופיע ברשימה של xrEnumerateSpatialCapabilitiesEXT .
סביבת זמן הריצה חייבת להחזיר XR_ERROR_FEATURE_UNSUPPORTED אם XrSpatialReferenceCacheCreateInfoANDROID :: source לא מופיע ב-xrEnumerateSpatialAnnotationReferenceSourcesANDROID עבור היכולת הנתונה.
האפליקציה יכולה ליצור רק שם משתמש אחד לכל מקור עבור יכולת נתונה. אחרת, סביבת זמן הריצה חייבת להחזיר 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;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
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 .
סביבת זמן הריצה חייבת להחזיר XR_ERROR_FUTURE_PENDING_EXT אם future לא במצב מוכן. סביבת זמן הריצה חייבת להחזיר את הערך XR_ERROR_FUTURE_INVALID_EXT אם הפעולה future כבר הושלמה או בוטלה.
שימוש תקף (משתמע)
- צריך להפעיל את התוסף
XR_ANDROID_spatial_annotation_trackingלפני שקוראים ל-xrCreateSpatialReferenceCacheCompleteANDROID -
sessionחייב להיות נקודת אחיזה חוקית של XrSession -
completionmust be a pointer to an XrCreateSpatialReferenceCacheCompletionANDROID structure
קודי החזרה
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;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. לא מוגדרים מבנים כאלה ב-OpenXR הבסיסי או בתוסף הזה. -
futureResultהוא XrResult של פעולת יצירת מטמון ההפניות. -
referenceCacheהוא ה-handle של 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 הוא קוד הצלחה, זמן הריצה חייב להחזיר נקודת אחיזה (handle) תקפה של referenceCache. אם referenceCache תקף, הוא יישאר תקף רק במהלך משך החיים של xrCreateSpatialReferenceCacheAsyncANDROID :: session או עד שהאפליקציה תהרוס את ה-handle באמצעות 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
Thread Safety
- הגישה אל
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;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
capabilityהוא XrSpatialCapabilityEXT וחייב להיותXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID. -
enabledComponentCountהואuint32_tשמתאר את מספר האלמנטים במערךenabledComponents. -
enabledComponentsהוא מצביע למערך של XrSpatialComponentTypeEXT . -
cacheהוא XrSpatialReferenceCacheANDROID שנוצר קודם לכן כדי לתעד הפניות בזמן ריצה להגדרהreference. -
timeהואXrTimeשבו מתועדreference. -
referenceהוא XrSpatialReferenceImageEXT עם הערות שמשורשרות למצביע הבא שלו.
אפליקציות יכולות להפעיל את היכולת המרחבית XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID על ידי הוספת מצביע למבנה XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ב-XrSpatialContextCreateInfoEXT :: capabilityConfigs .
זמן הריצה חייב להחזיר XR_ERROR_VALIDATION_FAILURE אם capability הוא לא XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID .
סביבת זמן הריצה חייבת להחזיר את הערך XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT אם reference לא מכיל הערות.
זמן הריצה חייב להחזיר XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT אם רכיב ההערה מופיע ב-enabledComponents אבל לא משויכות אליו הערות תואמות ב-reference .
סביבת הריצה חייבת להחזיר את הערך XR_ERROR_VALIDATION_FAILURE אם cache לא בבעלות אותו XrSession שמועבר אל xrCreateSpatialContextAsyncEXT .
סביבת זמן הריצה חייבת להחזיר XR_ERROR_TIME_INVALID אם time נמצא מחוץ לטווח הזמן של cache .
שימוש תקף (משתמע)
- התוסף
XR_ANDROID_spatial_annotation_trackingחייב להיות מופעל לפני שמשתמשים ב-XrSpatialCapabilityConfigurationAnnotationTrackingANDROID -
typeחייב להיותXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROID -
nextחייב להיותNULLאו מצביע תקין אל המבנה הבא בשרשרת המבנים -
capabilityחייב להיות ערך תקין של XrSpatialCapabilityEXT -
enabledComponentsmust be a pointer to an array ofenabledComponentCountvalid XrSpatialComponentTypeEXT values -
cacheחייב להיות נקודת אחיזה תקינה של XrSpatialReferenceCacheANDROID -
referenceחייב להיות מבנה XrSpatialReferenceImageEXT תקין - הפרמטר
enabledComponentCountחייב להיות גדול מ-0
אירועים של מעקב אחר הערות
המבנה XrEventDataSpatialAnnotationTrackingANDROID מוגדר כך:
typedef struct XrEventDataSpatialAnnotationTrackingANDROID {
XrStructureType type;
const void* next;
XrSpatialContextEXT spatialContext;
uint32_t annotationIndex;
XrResult initializationResult;
} XrEventDataSpatialAnnotationTrackingANDROID;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
spatialContextהוא XrSpatialContextEXT שהופעל עבורו מעקב אחר הערות. -
annotationIndexmaps to the index from the annotation array associated with XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ::reference. -
initializationResultמציין את תוצאת האתחול של ההערה. אם הוא לאXR_SUCCESS, האפליקציה יכולה להרוס וליצור מחדש את ה-handle של 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 עם קוד שגיאה מתאים כדי לציין את סיבת הכשל. האפליקציה יכולה להרוס את ה-handle של XrSpatialContextEXT כדי להתחיל הערה חדשה או להמשיך להשתמש ב-spatialContext כדי לעקוב אחרי הערות אחרות.
הערה מרובעת
סביבת ריצה חייבת לפרסם את התמיכה שלה בהערות מרובעות באמצעות xrEnumerateSpatialCapabilityComponentTypesEXT על ידי רישום סוג הרכיב הבא:
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
Quad Reference
המבנה XrSpatialAnnotationQuadReferenceANDROID מוגדר כך:
typedef struct XrSpatialAnnotationQuadReferenceANDROID {
XrStructureType type;
const void* next;
uint32_t quadCount;
const XrSpatialAnnotationQuadANDROID* quads;
} XrSpatialAnnotationQuadReferenceANDROID;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
quadCountהואuint32_tשמתאר את מספר האלמנטים במערךquads. -
quadsהוא המצביע למערך של XrSpatialAnnotationQuadANDROID .
כשסביבת זמן הריצה תומכת בהערות של ריבועים, אפליקציה יכולה להגדיר הערות על ידי שרשור מבנה XrSpatialAnnotationQuadReferenceANDROID אל XrSpatialReferenceImageEXT :: next והגדרת ההפניה ב-XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference כשיוצרים את נקודת האחיזה XrSpatialContextEXT.
אם הערך של quadCount הוא 0, זמן הריצה חייב להחזיר את הערך 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חייב להיות מצביע למערך שלquadCountמבני XrSpatialAnnotationQuadANDROID תקינים - הפרמטר
quadCountחייב להיות גדול מ-0
המבנה XrSpatialAnnotationQuadANDROID מוגדר כך:
typedef struct XrSpatialAnnotationQuadANDROID {
XrSpatialAnnotationQuadAlignmentANDROID alignment;
XrVector2f upperLeft;
XrVector2f upperRight;
XrVector2f lowerRight;
XrVector2f lowerLeft;
} XrSpatialAnnotationQuadANDROID;
תיאורים של חברי הקבוצה
-
alignmentהוא XrSpatialAnnotationQuadAlignmentANDROID של המרובע. -
upperLeftהוא XrVector2f שמתאר את הקואורדינטה של הפינה השמאלית העליונה של הריבוע שקשורה למקור. -
upperRightהוא XrVector2f שמתאר את הקואורדינטה של הפינה השמאלית העליונה של הריבוע ביחס לנקודת האפס. -
lowerRightהוא XrVector2f שמתאר את הקואורדינטה של הפינה הימנית התחתונה של המרובע ביחס לנקודת המוצא. -
lowerLeftהוא XrVector2f שמתאר את הקואורדינטה של הפינה השמאלית התחתונה של הריבוע שקשורה לנקודת האפס.
מרובע במרחב דו-ממדי הוא מרובע קמור עם סדר בכיוון השעון. הערך של 4 הפינות קשור למקור (0, 0) שאליו משויך ה-quad.
- כשמשייכים אותו ל-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_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSpatialAnnotationQuadAlignmentANDROID;
הספירה XrSpatialAnnotationQuadAlignmentANDROID מתארת את היישור של הערת הריבוע.
המשמעויות של ה-enums הן:
תיאור של טיפוס בן מנייה (enum)
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SCREEN_ANDROID
הריבוע של ההערה מקביל למישור המסך, והסיבוב שלו במישור נשאר נעול לכוח המשיכה של העולם. הפלט מופיע כתיבת תוחמת רגילה וזקופה.
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_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;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
quadCountהואuint32_tשמתאר את מספר האלמנטים במערךquads. -
quadsהוא מערך של XrSpatialAnnotationQuadDataANDROID .
האפליקציה יכולה לשלוף נתונים מרכיב ההערות של הריבועים של הישויות המרחביות ב-XrSpatialSnapshotEXT על ידי הוספת XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes והוספת XrSpatialComponentAnnotationQuadListANDROID לשרשרת המצביעים הבאה של XrSpatialComponentDataQueryResultEXT .
סביבת זמן הריצה חייבת להחזיר XR_ERROR_VALIDATION_FAILURE מהפונקציה xrQuerySpatialComponentDataEXT אם XrSpatialComponentAnnotationQuadListANDROID נמצא בשרשרת הבאה של XrSpatialComponentDataQueryResultEXT :: next אבל XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID לא נכלל ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes .
סביבת זמן הריצה חייבת להחזיר XR_ERROR_SIZE_INSUFFICIENT מ-xrQuerySpatialComponentDataEXT אם quadCount קטן מ-XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
שימוש תקף (משתמע)
- התוסף
XR_ANDROID_spatial_annotation_trackingחייב להיות מופעל לפני השימוש ב-XrSpatialComponentAnnotationQuadListANDROID -
typeחייב להיותXR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROID -
nextחייב להיותNULLאו מצביע תקין אל המבנה הבא בשרשרת המבנים -
quadsmust be a pointer to an array ofquadCountXrSpatialAnnotationQuadDataANDROID structures - הפרמטר
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 :
New Enums
New Enum Constants
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
בעיות
היסטוריית הגרסאות
גרסה 1, 2025-09-17 (לבנה חן)
- התיאור הראשוני של התוסף.