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 .
- האפליקציה יכולה להרוס את הטיפול ב-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 תקף .
- האפליקציה יכולה לבצע כיבוי סופי של ה-handle של 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 מתארת את מקור ההפניה שמספק את המטא-נתונים של הערה.
המשמעויות של סוגי ה-enum הן:
תיאור ה-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מציין את משך הזמן בשניות של נקודת אחיזה (handle) תקינה של 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 תקין -
createInfomust be a pointer to a valid XrSpatialReferenceCacheCreateInfoANDROID structure -
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חייב להיות נקודת אחיזה (handle) תקינה של XrSpatialReferenceCacheANDROID
הפונקציה xrDestroySpatialReferenceCacheANDROID מוגדרת כך:
XrResult xrDestroySpatialReferenceCacheANDROID(
XrSpatialReferenceCacheANDROID cacheHandle);
תיאורים של פרמטרים
-
cacheHandleהוא XrSpatialReferenceCacheANDROID שנוצר בעבר על ידי xrCreateSpatialReferenceCacheAsyncANDROID .
האפליקציה יכולה לקרוא לפונקציה xrDestroySpatialReferenceCacheANDROID כדי לשחרר את ה-handle של cacheHandle ואת המשאבים הבסיסיים כשמסיימים ליצור את ההקשר המרחבי.
שימוש תקף (משתמע)
- צריך להפעיל את התוסף
XR_ANDROID_spatial_annotation_trackingלפני שקוראים לפונקציה xrDestroySpatialReferenceCacheANDROID -
cacheHandleחייב להיות נקודת אחיזה (handle) תקינה של XrSpatialReferenceCacheANDROID
Thread Safety
- הגישה אל
cacheHandleואל כל הכינויים של הילדים חייבת להיות מסונכרנת חיצונית
קודי החזרה
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
הגדרות אישיות
המבנה 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 .
הפונקציה runtime חייבת להחזיר את הערך 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חייב להיות נקודת אחיזה (handle) תקינה של 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) שאליו משויך הריבוע.
- כשמשייכים אותו ל-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 מתארת את היישור של הערת הריבוע.
המשמעויות של סוגי ה-enum הן:
תיאור ה-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 (לבנה חן)
- התיאור הראשוני של התוסף.