XR_ANDROID_spatial_discovery_raycast
מחרוזת שם
XR_ANDROID_spatial_discovery_raycast
סוג התוסף
הרחבת המכונה
מספר שלוחה רשום
787
Revision
1
סטטוס האישור
לא אושר
תלות בתוסף ובגרסה
XR_EXT_spatial_entity
תאריך השינוי האחרון
2025-08-12
סטטוס כתובת ה-IP
לא ידוע על תלונות בנושא זכויות יוצרים שקשורות לכתובות IP.
שותפים ביצירת התוכן
Brian Chen, Google
Levana Chen, Google
Kyle Chen, Google
Nihav Jain, Google
Spencer Quin, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
סקירה כללית
התוסף הזה מבוסס על XR_EXT_spatial_entity ומספק פונקציונליות של הטלת קרניים ליכולות מרחביות קיימות, כמו XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT , כדי לגלות ישויות מרחביות.
התוסף הזה מציג גם יכולת מרחבית חדשה ל-raycasting בהשוואה למאגר עומק.
הרשאות
ההרשאות הנדרשות תלויות ביכולות שבהן משתמשת אפליקציה ל-Android. אם נעשה שימוש ב-XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID, חובה להעניק לאפליקציה את ההרשאה android.permission.SCENE_UNDERSTANDING_FINE. אם נעשה שימוש ב-XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, חובה להגדיר לאפליקציה את ההרשאה android.permission.SCENE_UNDERSTANDING_COARSE. ההרשאה android.permission.SCENE_UNDERSTANDING_FINE מרמזת גם על ההרשאה android.permission.SCENE_UNDERSTANDING_COARSE. אם האפליקציה משתמשת בשתי היכולות, היא לא צריכה לבקש את שתי ההרשאות בנפרד.
ההרשאות android.permission.SCENE_UNDERSTANDING_COARSE ו-android.permission.SCENE_UNDERSTANDING_FINE נחשבות להרשאות מסוכנות.
(רמת ההגנה: מסוכן)
תמיכה בזמן ריצה
אם סביבת זמן הריצה תומכת באיתור של ישויות מרחביות באמצעות הטלת קרניים, היא חייבת לציין זאת על ידי מניית XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID ב-xrEnumerateSpatialCapabilityComponentTypesEXT עבור היכולות שתומכות באיתור באמצעות הטלת קרניים.
אם סביבת זמן הריצה תומכת ב-raycasting מול מאגר העומק, היא חייבת למנות את XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID ב-xrEnumerateSpatialCapabilitiesEXT .
גילוי ישויות מרחביות באמצעות הטלת קרניים
המבנה XrSpatialRaycastInfoANDROID מוגדר כך:
typedef struct XrSpatialRaycastInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrVector3f origin;
XrVector3f direction;
float maxDistance;
} XrSpatialRaycastInfoANDROID;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
spaceהוא XrSpace שבו ימוקם המיקום של XrSpatialRaycastResultDataANDROID. -
timeהואXrTimeשבו מוגדרת התנוחה של XrSpatialRaycastResultDataANDROID. -
originהוא XrVector3f שמתאר את המקור של הקרן. -
directionהוא XrVector3f שמתאר את הכיוון של הקרן. -
maxDistanceהוא המרחק במטרים שאפליקציה יכולה לציין כדי להגביל את האיתור של ישויות שנמצאות במרחק שצוין מ-origin, לאורךdirection.
אפליקציה יכולה לכלול XrSpatialRaycastInfoANDROID בשרשרת XrSpatialDiscoverySnapshotCreateInfoEXT :: next כדי לגלות ישויות מרחביות שנחתכות על ידי הקרן שמוגדרת במבנה הזה.
אם אפליקציה משתמשת ב-XrSpatialRaycastInfoANDROID עם XrSpatialContextEXT שהוגדר בלי להפעיל את XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID עבור יכולת כלשהי, זמן הריצה חייב להחזיר את XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT מ-xrCreateSpatialDiscoverySnapshotAsyncEXT או מ-xrCreateSpatialRaycastSnapshotANDROID .
סביבת הריצה חייבת לכלול את נתוני הרכיבים ואת המזהים של רק אותם ישויות מרחביות ב-XrSpatialSnapshotEXT שמגיעים מיכולות שתומכות ברכיב XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID.
אם אפליקציה מגדירה את maxDistance לערך חיובי, זמן הריצה לא יכול לכלול בתמונת המצב ישויות מרחביות של היטים שנמצאות במרחק של יותר מ-maxDistance מה-panme:origin לאורך direction . אם הערך של maxDistance הוא 0 או ערך שלילי, זמן הריצה חייב להתייחס לקרן כאל קרן לא חסומה.
שימוש תקף (משתמע)
- חובה להפעיל את התוסף
XR_ANDROID_spatial_discovery_raycastלפני שמשתמשים ב-XrSpatialRaycastInfoANDROID -
typeחייב להיותXR_TYPE_SPATIAL_RAYCAST_INFO_ANDROID -
nextחייב להיותNULLאו מצביע תקין אל המבנה הבא בשרשרת המבנים -
spaceחייב להיות כינוי תקין ב-XrSpace
רכיב תוצאת הטלת קרניים
המבנה XrSpatialRaycastResultDataANDROID מוגדר כך:
typedef struct XrSpatialRaycastResultDataANDROID {
XrPosef hitPose;
float distanceSquared;
} XrSpatialRaycastResultDataANDROID;
תיאורים של חברי הקבוצה
-
hitPoseהוא XrPosef שמגדיר את הנקודה שבה הקרן מצטלבת עם הישות המרחבית. -
distanceSquaredהוא ריבוע המרחק מנקודת המוצא של הקרן לנקודת החיתוך.
הרכיב XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID יהיה קיים רק ב-XrSpatialSnapshotEXT שנוצר מ-xrCreateSpatialDiscoverySnapshotAsyncEXT שבו XrSpatialRaycastInfoANDROID נכלל בשרשרת XrSpatialDiscoverySnapshotCreateInfoEXT :: next או ב-XrSpatialSnapshotEXT שנוצר מ-xrCreateSpatialRaycastSnapshotANDROID .
סביבת הריצה לא יכולה לכלול את הרכיב הזה באף XrSpatialSnapshotEXT שנוצר באמצעות xrCreateSpatialUpdateSnapshotEXT .
סביבת זמן הריצה צריכה להחזיר XR_ERROR_VALIDATION_FAILURE מ-xrCreateSpatialUpdateSnapshotEXT אם האפליקציה כוללת XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID ב-XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes .
אם XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID מופעל רק ליכולות מסוימות, חובה לכלול בצילום המצב רק ישויות מרחביות שמסופקות על ידי היכולות האלה. לדוגמה, אם אובייקט ומטוס נמצאים באותו כיוון ו-XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID מופעל רק עבור XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT , רק המטוס יזוהה.
ה-hitPose של XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID ימוקם ב-XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: baseSpace ב-XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: time . ציר Z החיובי הוא הנורמל של משטח הפגיעה, וציר Y השלילי מצביע בערך לכיוון מקור הקרן.
שימוש תקף (משתמע)
-
XR_ANDROID_spatial_discovery_raycastהתוסף חייב להיות מופעל לפני השימוש ב-XrSpatialRaycastResultDataANDROID
מבנה של רשימת רכיבים לשאילתת נתונים
המבנה XrSpatialComponentRaycastResultListANDROID מוגדר כך:
typedef struct XrSpatialComponentRaycastResultListANDROID {
XrStructureType type;
void* next;
uint32_t raycastResultCount;
XrSpatialRaycastResultDataANDROID* raycastResults;
} XrSpatialComponentRaycastResultListANDROID;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
raycastResultCountהואuint32_tשמתאר את מספר האלמנטים במערךraycastResults. -
raycastResultsהוא מערך של XrSpatialRaycastResultDataANDROID .
כדי לשלוח שאילתה לרכיב תוצאת ה-raycast של הישויות המרחביות ב-XrSpatialSnapshotEXT , כוללים את XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes ומוסיפים את XrSpatialComponentRaycastResultListANDROID לשרשרת XrSpatialComponentDataQueryResultEXT :: next.
סביבת זמן הריצה חייבת להחזיר XR_ERROR_VALIDATION_FAILURE מ-xrQuerySpatialComponentDataEXT אם XrSpatialComponentRaycastResultListANDROID נמצא בשרשרת XrSpatialComponentDataQueryResultEXT :: next אבל XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID לא נכלל ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes .
סביבת זמן הריצה חייבת להחזיר XR_ERROR_SIZE_INSUFFICIENT מ-xrQuerySpatialComponentDataEXT אם raycastResultCount קטן מ-XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
הפריטים שמוחזרים ב-raycastResults לא מסודרים. אפליקציה יכולה להשתמש ב-XrSpatialRaycastResultDataANDROID :: distanceSquared כדי למיין את התוצאות לפי מרחק.
שימוש תקף (משתמע)
-
XR_ANDROID_spatial_discovery_raycastהתוסף חייב להיות מופעל לפני השימוש ב-XrSpatialComponentRaycastResultListANDROID -
typeחייב להיותXR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID -
nextחייב להיותNULLאו מצביע תקין אל המבנה הבא בשרשרת המבנים -
raycastResultsmust be a pointer to an array ofraycastResultCountXrSpatialRaycastResultDataANDROID structures - הפרמטר
raycastResultCountחייב להיות גדול מ-0
הגדרות אישיות
אם הערך XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID מופיע ברשימה XrSpatialCapabilityComponentTypesEXT :: componentTypes עבור יכולת מסוימת, האפליקציה יכולה להפעיל אותה על ידי הכללת ערך ה-enum ברשימה XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents. הכללת הרכיב הזה בשרשרת הבאה של XrSpatialCapabilityConfigurationBaseHeaderEXT לא דורשת הגדרה מיוחדת .
סביבת זמן הריצה צריכה להחזיר XR_ERROR_VALIDATION_FAILURE מ-xrCreateSpatialUpdateSnapshotEXT אם האפליקציה כוללת XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID ב-XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes . הרכיב הזה ספציפי לתמונות מצב של קמפיינים מסוג Discovery.
יכולת מרחבית של Raycast לעומק
הגדרות אישיות
המבנה XrSpatialCapabilityConfigurationDepthRaycastANDROID מוגדר באופן הבא:
typedef struct XrSpatialCapabilityConfigurationDepthRaycastANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationDepthRaycastANDROID;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
capabilityהוא XrSpatialCapabilityEXT וחייב להיותXR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID. -
enabledComponentCountהואuint32_tשמתאר את מספר האלמנטים במערךenabledComponents. הערך חייב להיות גדול מ-0. -
enabledComponentsהוא מצביע למערך של XrSpatialComponentTypeEXT .
אפליקציות יכולות להפעיל את היכולת XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID spatial על ידי הוספת מצביע למבנה XrSpatialCapabilityConfigurationDepthRaycastANDROID ב-XrSpatialContextCreateInfoEXT :: capabilityConfigs .
זמן הריצה חייב להחזיר XR_ERROR_VALIDATION_FAILURE אם capability הוא לא XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID .
המזהה של ישויות שמתגלות באמצעות היכולת הזו הוא תמיד XR_NULL_SPATIAL_ENTITY_ID_EXT . זה גם אומר שהאפליקציה לא יכולה ליצור נקודת אחיזה של XrSpatialEntityEXT עבור הישויות האלה, ולכן אי אפשר לכלול אותן ב-XrSpatialUpdateSnapshotCreateInfoEXT :: entities כדי ליצור תמונת מצב של עדכון.
שימוש תקף (משתמע)
-
XR_ANDROID_spatial_discovery_raycastהתוסף חייב להיות מופעל לפני שמשתמשים ב-XrSpatialCapabilityConfigurationDepthRaycastANDROID -
typeחייב להיותXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROID -
nextחייב להיותNULLאו מצביע תקין אל המבנה הבא בשרשרת המבנים -
capabilityחייב להיות ערך תקין של XrSpatialCapabilityEXT -
enabledComponentsmust be a pointer to an array ofenabledComponentCountvalid XrSpatialComponentTypeEXT values - הפרמטר
enabledComponentCountחייב להיות גדול מ-0
רכיבים מובטחים
סביבת ריצה שתומכת ב-XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID , חייבת לתמוך ברכיבים המרחביים הבאים כרכיבים מובטחים של הישויות שמתגלות על ידי היכולת הזו, וחייבת למנות אותם ב-xrEnumerateSpatialCapabilityComponentTypesEXT –
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
Raycast סינכרוני
הפונקציה xrCreateSpatialRaycastSnapshotANDROID מוגדרת כך:
XrResult xrCreateSpatialRaycastSnapshotANDROID(
XrSpatialContextEXT spatialContext,
const XrSpatialRaycastSnapshotCreateInfoANDROID* createInfo,
XrSpatialSnapshotEXT* snapshot);
תיאורי הפרמטרים
-
spatialContextהוא XrSpatialContextEXT שנוצר קודם באמצעות xrCreateSpatialContextAsyncEXT . -
createInfoהוא מצביע אל XrSpatialRaycastSnapshotCreateInfoANDROID . -
snapshotהוא מצביע אל XrSpatialSnapshotEXT .
הפונקציה xrCreateSpatialDiscoverySnapshotAsyncEXT מספיקה לרוב תרחישי השימוש, אבל היא נחשבת איטית מדי לאפליקציות שדורשות תוצאות מיידיות של הטלת קרניים. הפונקציה xrCreateSpatialRaycastSnapshotANDROID מתחילה הטלת קרניים סינכרונית כדי ליצור תמונת מצב, וכך מאפשרת לאפליקציות להתחיל לשלוח שאילתות לגבי תוצאות של הטלת קרניים באופן מיידי.
סביבת הריצה חייבת להחזיר את הערך XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT אם אף אחד מהערכים של XrSpatialComponentTypeEXT ב-XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes לא מופעל עבור היכולות המרחביות שמועברות אל XrSpatialContextCreateInfoEXT :: capabilityConfigs כשיוצרים את spatialContext .
אם האפליקציה לא מספקת רשימה של סוגי רכיבים מרחביים ב-XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes , סביבת הריצה חייבת לכלול בתמונה את כל הישויות המרחביות שיש להן את קבוצת הרכיבים שמפורטים ב-XrSpatialCapabilityConfigurationBaseHeaderEXT ::enabledComponents עבור יכולות נתמכות של raycast שהוגדרו ל-spatialContext . סביבת זמן הריצה צריכה לכלול את הנתונים של כל הרכיבים המופעלים של היכולות הנתמכות של raycast שהוגדרו עבור spatialContext .
שימוש תקף (משתמע)
- צריך להפעיל את התוסף
XR_ANDROID_spatial_discovery_raycastלפני שמפעילים את xrCreateSpatialRaycastSnapshotANDROID -
spatialContextmust be a valid XrSpatialContextEXT handle -
createInfoחייב להיות מצביע למבנה XrSpatialRaycastSnapshotCreateInfoANDROID תקין -
snapshotmust be a pointer to an XrSpatialSnapshotEXT handle
קודי החזרה
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
המבנה XrSpatialRaycastSnapshotCreateInfoANDROID מוגדר כך:
typedef struct XrSpatialRaycastSnapshotCreateInfoANDROID {
XrStructureType type;
const void* next;
uint32_t componentTypeCount;
const XrSpatialComponentTypeEXT* componentTypes;
const XrSpatialRaycastInfoANDROID* raycastInfo;
} XrSpatialRaycastSnapshotCreateInfoANDROID;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. לא מוגדרים מבנים כאלה ב-OpenXR הבסיסי או בתוסף הזה. -
componentTypeCountהואuint32_tשמתאר את מספר האלמנטים במערךcomponentTypes. -
componentTypesהוא מערך של XrSpatialComponentTypeEXT . -
raycastInfoהוא המבנה XrSpatialRaycastInfoANDROID שמתאר את המידע של קרן.
שימוש תקף (משתמע)
-
XR_ANDROID_spatial_discovery_raycastהתוסף חייב להיות מופעל לפני שמשתמשים ב-XrSpatialRaycastSnapshotCreateInfoANDROID -
typeחייב להיותXR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID -
nextחייב להיותNULLאו מצביע תקין אל המבנה הבא בשרשרת המבנים - אם
componentTypeCountלא0, componentTypesחייב להיות מצביע למערך שלcomponentTypeCountערכים תקינים של XrSpatialComponentTypeEXT -
raycastInfoחייב להיות מצביע למבנה XrSpatialRaycastInfoANDROID תקין
קוד לדוגמה
הגדרת יכולות של Raycast עומק ומעקב אחר מישור
בדוגמת הקוד הבאה אפשר לראות איך יוצרים הקשר מרחבי עם יכולות שתומכות בפונקציונליות של הטלת קרניים. בדוגמה הזו נעשה שימוש ב-XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID וב-XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT.
// Check runtime supported capabilities
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_DEPTH_RAYCAST_ANDROID) == capabilities.end()) {
return;
}
if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT) == capabilities.end()) {
return;
}
// Create capability config for depth raycasting
std::vector<XrSpatialComponentTypeEXT> depthRaycastComponents {
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
};
// Create capability config for depth raycasting
XrSpatialCapabilityConfigurationDepthRaycastANDROID depthRaycastConfig {
.type = XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROID,
.next = nullptr,
.capability = XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID,
.enabledComponentCount = (uint32_t)depthRaycastComponents.size(),
.enabledComponents = depthRaycastComponents.data(),
};
// Enumerate runtime supported components for plane tracking capability
XrSpatialCapabilityComponentTypesEXT capabilityComponentTypes {
XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT
};
bool isRaycastSupportedViaPlaneTracking;
std::vector<XrSpatialComponentTypeEXT> planeTrackingComponents {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId,
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &capabilityComponentTypes));
planeTrackingComponents.resize(capabilityComponentTypes.componentTypeCountOutput);
capabilityComponentTypes.componentTypeCapacityInput = (uint32_t)planeTrackingComponents.size();
capabilityComponentTypes.componentTypes = planeTrackingComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId,
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &capabilityComponentTypes));
// Check if raycast is supported by plane tracking
isRaycastSupportedViaPlaneTracking = std::find(planeTrackingComponents.begin(),
planeTrackingComponents.end(), XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID)
!= planeTrackingComponents.end();
// Create capability config for plane tracking
XrSpatialCapabilityConfigurationPlaneTrackingEXT planeTrackingConfig {
.type = XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT,
.next = nullptr,
.capability = XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT,
.enabledComponentCount = (uint32_t)planeTrackingComponents.size(),
.enabledComponents = planeTrackingComponents.data(),
};
// Create spatial context
// Types of raycast is determined by configs included in XrSpatialContextCreateInfoEXT
// For this example, both plane raycast & depth raycast are performed
std::vector<const XrSpatialCapabilityConfigurationBaseHeaderEXT*> capabilityConfigs;
capabilityConfigs.push_back(reinterpret_cast<const XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&depthRaycastConfig));
if(isRaycastSupportedViaPlaneTracking) capabilityConfigs.push_back(reinterpret_cast<const XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&planeTrackingConfig));
XrSpatialContextCreateInfoEXT contextCreateInfo {
.type = XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT,
.next = nullptr,
.capabilityConfigCount = (uint32_t)capabilityConfigs.size(),
.capabilityConfigs = capabilityConfigs.data(),
};
CHK_XR(xrCreateSpatialContextAsyncEXT(session, &contextCreateInfo, &future))
// Completes creating spatial context
XrCreateSpatialContextCompletionEXT contextCompletion{
XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialContextCompleteEXT(session, future, &contextCompletion))
גילוי ישויות מרחביות ונתוני רכיבים של שאילתות
בדוגמת הקוד הבאה מוצגות דרכים לגלות ישויות מרחביות בהקשר שהוגדר עם XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID ו-XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, ולשאול שאילתות לגבי נתוני הרכיבים שלו.
// Fill in the raycast info.
XrSpatialRaycastInfoANDROID raycastInfo {
.type = XR_TYPE_SPATIAL_RAYCAST_INFO_ANDROID,
.next = nullptr,
.space = viewSpace,
.time = updateTime,
.origin = {0.0f, 0.0f, 0.0f},
.direction = {0.0f, 0.0f,-1.0f},
.maxDistance = 0.0f // ray is unbounded
};
// Next pointing to the raycast info.
XrSpatialDiscoverySnapshotCreateInfoEXT discoverySnapshotCreateInfo {
.type = XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT,
.next = &raycastInfo
};
// Create snapshot
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT (
spatialContext, &discoverySnapshotCreateInfo, &future));
waitUntilReady(future);
// Complete async operation.
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT
createSnapshotCompletionInfo {
.type = XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT,
.baseSpace = viewSpace,
.time = updateTime,
.future = future,
};
XrCreateSpatialDiscoverySnapshotCompletionEXT completion {
XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(
spatialContext, &createSnapshotCompletionInfo,
&completion));
if(completion.futureResult != XR_SUCCESS) return;
// Query hit result components
std::array<XrSpatialComponentTypeEXT, 1> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
};
XrSpatialComponentDataQueryConditionEXT queryCond {
.type = XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT,
.componentTypeCount = 1,
.componentTypes = enabledComponents.data(),
};
XrSpatialComponentDataQueryResultEXT queryResult {
.type = XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT,
};
XrResult result = xrQuerySpatialComponentDataEXT(
completion.snapshot, &queryCond, &queryResult);
// Check query result.
if(result != XR_SUCCESS) return;
// Query again for the hit result list.
std::vector<XrSpatialRaycastResultDataANDROID> raycastResults;
raycastResults.resize(queryResult.entityIdCountOutput);
XrSpatialComponentRaycastResultListANDROID raycastResultList {
.type = XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID,
.raycastResultCount = (uint32_t)raycastResults.size(),
.raycastResults = raycastResults.data(),
};
queryResult.next = &raycastResultList;
result = xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult);
// Check query result again.
if(result != XR_SUCCESS) return;
std::vector<XrSpatialEntityEXT> hitEntities;
std::vector<XrPosef> depthHitPoses;
for(uint32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
// access raycastResults[i] for id & pose
XrSpatialEntityIdEXT id = queryResult.entityIds[i];
XrPosef pose = raycastResults[i].hitPose;
if (id != XR_NULL_SPATIAL_ENTITY_ID_EXT) {
// hit entities (e.g. planes)
// get entity handle via entity id
XrSpatialEntityFromIdCreateInfoEXT entityCreateInfo {
.type = XR_TYPE_SPATIAL_ENTITY_FROM_ID_CREATE_INFO_EXT,
.entityId = id,
};
XrSpatialEntityEXT entity = XR_NULL_HANDLE;
xrCreateSpatialEntityFromIdEXT(spatialContext, &entityCreateInfo, &entity);
hitEntities.push_back(entity);
} else {
// hit depth
depthHitPoses.push_back(pose);
}
}
// Cleanup
xrDestroySpatialSnapshotEXT(completion.snapshot);
יצירת קובץ snapshot של Raycast
בדוגמת הקוד הבאה אפשר לראות איך יוצרים תמונת מצב סינכרונית של הטלת קרניים.
// fill in create info
XrSpatialRaycastSnapshotCreateInfoANDROID createInfo {
.type = XR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID,
.componentTypeCount = 0, // include all hit spatial entities
.componentTypes = nullptr,
.raycastInfo = &raycastInfo
};
// create raycast snapshot
XrSpatialSnapshotEXT raycastSnapshot = XR_NULL_HANDLE;
CHK_XR(xrCreateSpatialRaycastSnapshotANDROID(
spatialContext, &createInfo, &raycastSnapshot));
// ...
// query component data as previous example
// ...
// Cleanup
xrDestroySpatialSnapshotEXT(raycastSnapshot);
פקודות חדשות
מבנים חדשים
- XrSpatialCapabilityConfigurationDepthRaycastANDROID
- XrSpatialRaycastResultDataANDROID
- XrSpatialRaycastSnapshotCreateInfoANDROID
הרחבה של XrSpatialComponentDataQueryResultEXT :
הרחבה של XrSpatialDiscoverySnapshotCreateInfoEXT :
New Enum Constants
XR_ANDROID_SPATIAL_DISCOVERY_RAYCAST_EXTENSION_NAMEXR_ANDROID_spatial_discovery_raycast_SPEC_VERSIONהרחבה של XrSpatialCapabilityEXT :
XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID
הרחבה של XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
הרחבה של XrStructureType :
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROIDXR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROIDXR_TYPE_SPATIAL_RAYCAST_INFO_ANDROIDXR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID
בעיות
היסטוריית הגרסאות
גרסה 1, 15 ביולי 2025 (Brian Chen)
- התיאור הראשוני של התוסף.