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
אין תלונות ידועות על הפרת קניין רוחני.
שותפים ביצירת התוכן
לבנה חן, Google
כריסטופר פייל, Google
מרטין סנדרמאייר, Google
דייוויד ג'וזף טאן, Google
ג'ארד פינדר, Google
ניהב ג'יין, Google
סקירה כללית
התוסף הזה מספק את יכולת המעקב אחרי הערות לתוסף XR_EXT_spatial_entity כדי לעקוב אחרי הערות שונות בסצנה. היא מאפשרת לאפליקציות להציב שכבות-על על אובייקטים פיזיים או וירטואליים שמוגדרים על ידי הפניות בזמן ריצה.
התוסף הזה מספק סוג הערה בסיסי בשם Quad, שהוא פוליגון עם 4 צלעות בדיוק, כלומר מרובע קמור, שמייצג תיבה תוחמת דו-ממדית כללית בתוך קובץ עזר של זמן ריצה. הערה מרובעת במעקב מיוצגת כישות מרחבית עם (או "שיש לה") הרכיבים הבאים:
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 . -
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חייב להיות מצביע למערך של ערכי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 מתארת את מקור ההפניה שמספק את המטא-נתונים של ההערה.
אלה המשמעויות של ה-enums:
תיאור הטיפוס בן המנייה (enum)
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID
תמונת הרפרנס היא פלט של תמונה לא חתוכה מ-API של מצלמת Android, למשל תמונה מ-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 . האפליקציה יכולה ליצור מחדש את נקודת האחיזה XrSpatialContextEXT עם קובץ עזר חדש במהלך פרק הזמן של XrSpatialReferenceCacheANDROID .
אם מספר תמונות הרפרנס שהוקצו חורג מ-maxReferenceCount , זמן הריצה חייב להחזיר את הערך XR_ERROR_LIMIT_REACHED ולציין את הכשל באתחול באמצעות XrEventDataSpatialAnnotationTrackingANDROID :: initializationResult . האפליקציה יכולה להשמיד את נקודת האחיזה 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)
הכינוי 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 מתאר את המידע ליצירת נקודת אחיזה (handle) מסוג 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 -
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;
תיאורי חברים
-
typeהוא ה-XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. מבנים כאלה לא מוגדרים ב-OpenXR או בתוסף הזה. -
futureResultהוא ה-XrResult של פעולת היצירה של מטמון העזר. -
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
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 תקין -
enabledComponentsחייב להיות מצביע למערך של ערכי XrSpatialComponentTypeEXT תקינים מסוגenabledComponentCount -
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 שבו הופעל מעקב אחרי הערות. -
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;
תיאורי חברים
-
typeהוא ה-XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
quadCountהואuint32_tשמתאר את מספר הרכיבים במערךquads. -
quadsהוא המצביע למערך של XrSpatialAnnotationQuadANDROID .
כשהסביבה תומכת בהערות מרובעות, אפליקציה יכולה להגדיר הערות על ידי שרשור של מבנה XrSpatialAnnotationQuadReferenceANDROID אל XrSpatialReferenceImageEXT :: next , ולהגדיר את ההפניה ב-XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference כשיוצרים את נקודת האחיזה XrSpatialContextEXT.
זמן הריצה חייב להחזיר את הערך XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT מ-xrCreateSpatialContextAsyncEXT אם הערך של quadCount הוא 0.
שימוש תקין (משתמע)
- צריך להפעיל את התוסף
XR_ANDROID_spatial_annotation_trackingלפני שמשתמשים ב-XrSpatialAnnotationQuadReferenceANDROID -
typeחייב להיותXR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROID -
nextחייב להיותNULLאו מצביע תקין למבנה הבא בשרשרת מבנים -
quadsחייב להיות מצביע למערך של מבני XrSpatialAnnotationQuadANDROID תקינים שלquadCount - הפרמטר
quadCountחייב להיות גדול מ-0
המבנה של XrSpatialAnnotationQuadANDROID מוגדר כך:
typedef struct XrSpatialAnnotationQuadANDROID {
XrSpatialAnnotationQuadAlignmentANDROID alignment;
XrVector2f upperLeft;
XrVector2f upperRight;
XrVector2f lowerRight;
XrVector2f lowerLeft;
} XrSpatialAnnotationQuadANDROID;
תיאורי חברים
-
alignmentהוא ה-XrSpatialAnnotationQuadAlignmentANDROID של ה-quad. -
upperLeftהוא XrVector2f שמתאר את הקואורדינטה של הפינה השמאלית העליונה של המרובע שקשור למקור. -
upperRightהוא XrVector2f שמתאר את הקואורדינטה של הפינה הימנית העליונה של המרובע שקשור לנקודת המוצא. -
lowerRightהוא XrVector2f שמתאר את הקואורדינטה של הפינה הימנית התחתונה של המרובע שקשור לנקודת המוצא. -
lowerLeftהוא XrVector2f שמתאר את הקואורדינטה של הפינה השמאלית התחתונה של המרובע שקשור לנקודת המוצא.
מרובע במרחב דו-ממדי הוא מרובע קמור עם סדר בכיוון השעון. הערך של 4 הפינות קשור לנקודת המוצא (0, 0) שאליה משויך המרובע.
- כשהוא משויך ל-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 מתארת את היישור של ההערה המרובעת.
אלה המשמעויות של ה-enums:
תיאור הטיפוס בן המנייה (enum)
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;
תיאורי חברים
-
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או מצביע תקין למבנה הבא בשרשרת מבנים -
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 חדשים
קבועי Enum חדשים
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, 17 בספטמבר 2025 (לבנה חן)
- תיאור התוסף הראשוני.