XR_EXT_spatial_plane_tracking
מחרוזת שם
XR_EXT_spatial_plane_tracking
סוג התוסף
הרחבת המכונה
מספר שלוחה רשום
742
Revision
1
סטטוס האישור
אושר
תלות בתוסף ובגרסה
XR_EXT_spatial_entity
שותפים ביצירת התוכן
Nihav Jain, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Ron Bessems, Meta
Yin Li, Microsoft
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
Jun Yan, ByteDance
סקירה כללית
התוסף הזה מבוסס על XR_EXT_spatial_entity ומגדיר את היכולת המרחבית של מעקב אחרי מישור עבור מסגרת הישויות המרחביות.
תמיכה בזמן ריצה
אם זמן הריצה תומך במעקב אחר מישור, חובה לציין זאת על ידי מניית XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT ב-xrEnumerateSpatialCapabilitiesEXT .
הגדרות אישיות
המבנה XrSpatialCapabilityConfigurationPlaneTrackingEXT מוגדר כך:
typedef struct XrSpatialCapabilityConfigurationPlaneTrackingEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationPlaneTrackingEXT;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
capabilityהוא XrSpatialCapabilityEXT וחייב להיותXR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT. -
enabledComponentCountהואuint32_tשמתאר את מספר האלמנטים במערךenabledComponents. -
enabledComponentsהוא מצביע למערך של XrSpatialComponentTypeEXT .
אפליקציות יכולות להפעיל את היכולת המרחבית XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT על ידי הוספת מצביע למבנה XrSpatialCapabilityConfigurationPlaneTrackingEXT ב-XrSpatialContextCreateInfoEXT :: capabilityConfigs .
זמן הריצה חייב להחזיר XR_ERROR_VALIDATION_FAILURE אם capability הוא לא XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT .
שימוש תקף (משתמע)
-
XR_EXT_spatial_plane_trackingהתוסף חייב להיות מופעל לפני שמשתמשים ב-XrSpatialCapabilityConfigurationPlaneTrackingEXT -
typeחייב להיותXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT -
nextחייב להיותNULLאו מצביע תקין אל המבנה הבא בשרשרת המבנים -
capabilityחייב להיות ערך תקין של XrSpatialCapabilityEXT -
enabledComponentsmust be a pointer to an array ofenabledComponentCountvalid XrSpatialComponentTypeEXT values - הפרמטר
enabledComponentCountחייב להיות גדול מ-0
רכיבים מובטחים
סביבת זמן ריצה שתומכת ב-XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT חייבת לספק את הרכיבים המרחביים הבאים כרכיבים מובטחים של כל הישויות שמתגלות על ידי היכולת הזו, וחייבת למנות אותם ב-xrEnumerateSpatialCapabilityComponentTypesEXT :
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXTXR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT
רכיב דו-ממדי מוגבל
רכיב דו-ממדי עם גבולות מספק את המרכז והגבולות של המישור שמיוצג על ידי הישות שהוא נמצא עליו. פרטים נוספים מופיעים במאמר בנושא תחום דו-ממדי מוגבל.
רכיב ליישור המישור
נתוני רכיבים
typedef enum XrSpatialPlaneAlignmentEXT {
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_UPWARD_EXT = 0,
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_DOWNWARD_EXT = 1,
XR_SPATIAL_PLANE_ALIGNMENT_VERTICAL_EXT = 2,
XR_SPATIAL_PLANE_ALIGNMENT_ARBITRARY_EXT = 3,
XR_SPATIAL_PLANE_ALIGNMENT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPlaneAlignmentEXT;
הספירה XrSpatialPlaneAlignmentEXT מתארת את היישור של המישור שמשויך לישות המרחבית עם רכיב XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT.
המשמעויות של הערכים המנויים:
תיאור של טיפוס בן מנייה (enum)
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_UPWARD_EXT
הישות אופקית ופונה כלפי מעלה (למשל רצפה).
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_DOWNWARD_EXT
הישות אופקית ופונה כלפי מטה (למשל, תקרה).
XR_SPATIAL_PLANE_ALIGNMENT_VERTICAL_EXT
הישות היא אנכית (למשל קיר).
XR_SPATIAL_PLANE_ALIGNMENT_ARBITRARY_EXT
לישות יש כיוון שרירותי, לא אנכי ולא אופקי.
מבנה רשימת הרכיבים לשאילתת נתונים
המבנה XrSpatialComponentPlaneAlignmentListEXT מוגדר כך:
typedef struct XrSpatialComponentPlaneAlignmentListEXT {
XrStructureType type;
void* next;
uint32_t planeAlignmentCount;
XrSpatialPlaneAlignmentEXT* planeAlignments;
} XrSpatialComponentPlaneAlignmentListEXT;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
planeAlignmentCountהואuint32_tשמתאר את מספר האלמנטים במערךplaneAlignments. -
planeAlignmentsהוא מערך של XrSpatialPlaneAlignmentEXT .
כדי לשלוח שאילתה לגבי רכיב יישור המישור של הישויות המרחביות ב-XrSpatialSnapshotEXT , צריך לכלול את XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes ולהוסיף את XrSpatialComponentPlaneAlignmentListEXT לשרשרת XrSpatialComponentDataQueryResultEXT :: next.
סביבת הריצה חייבת להחזיר XR_ERROR_VALIDATION_FAILURE מ-xrQuerySpatialComponentDataEXT אם XrSpatialComponentPlaneAlignmentListEXT נמצא בשרשרת XrSpatialComponentDataQueryResultEXT :: next אבל XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT לא נכלל ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes .
סביבת זמן הריצה חייבת להחזיר XR_ERROR_SIZE_INSUFFICIENT מ-xrQuerySpatialComponentDataEXT אם planeAlignmentCount קטן מ-XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
שימוש תקף (משתמע)
- חובה להפעיל את התוסף
XR_EXT_spatial_plane_trackingלפני שמשתמשים ב-XrSpatialComponentPlaneAlignmentListEXT -
typeחייב להיותXR_TYPE_SPATIAL_COMPONENT_PLANE_ALIGNMENT_LIST_EXT -
nextחייב להיותNULLאו מצביע תקין אל המבנה הבא בשרשרת המבנים -
planeAlignmentsחייב להיות מצביע למערך של ערכיplaneAlignmentCountXrSpatialPlaneAlignmentEXT - הפרמטר
planeAlignmentCountחייב להיות גדול מ-0
הגדרות אישיות
אם XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT מפורט ב-XrSpatialCapabilityComponentTypesEXT :: componentTypes עבור יכולת מסוימת, אפליקציה יכולה להפעיל אותה על ידי הכללת המונה ברשימה XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents של המבנה הנגזר XrSpatialCapabilityConfigurationBaseHeaderEXT של היכולת שתומכת ברכיב הזה.
אין צורך בהגדרה מיוחדת כדי לכלול את הרכיב הזה בשרשרת XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.
רכיבים אופציונליים
סביבת ריצה שתומכת ב-XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT עשויה לתמוך ברכיבים מרחביים אחרים בנוסף לאלה שמפורטים בקטע רכיבים מובטחים. אפליקציה משתמשת ב-xrEnumerateSpatialCapabilityComponentTypesEXT כדי לקבל את הרשימה המלאה של הרכיבים שזמן ריצה תומך בהם, ואז מגדירה את הרכיבים שהיא מעוניינת בהם כשיוצרים את ההקשר המרחבי.
רכיב רשת דו-ממדית
נתוני רכיבים
XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT משתמש במבנה XrSpatialMeshDataEXT בשביל הנתונים שלו.
מבנה רשימת הרכיבים לשאילתת נתונים
המבנה XrSpatialComponentMesh2DListEXT מוגדר כך:
typedef struct XrSpatialComponentMesh2DListEXT {
XrStructureType type;
void* next;
uint32_t meshCount;
XrSpatialMeshDataEXT* meshes;
} XrSpatialComponentMesh2DListEXT;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
meshCountהואuint32_tשמתאר את מספר האלמנטים במערךmeshes. -
meshesהוא מערך של XrSpatialMeshDataEXT .
כדי לשלוח שאילתה לגבי רכיב הרשת הדו-ממדית של הישויות המרחביות ב-XrSpatialSnapshotEXT , צריך לכלול את XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes ולהוסיף את XrSpatialComponentMesh2DListEXT לשרשרת XrSpatialComponentDataQueryResultEXT :: next.
סביבת הריצה חייבת להחזיר XR_ERROR_VALIDATION_FAILURE מ-xrQuerySpatialComponentDataEXT אם XrSpatialComponentMesh2DListEXT נמצא בשרשרת XrSpatialComponentDataQueryResultEXT :: next אבל XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT לא נכלל ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes .
סביבת זמן הריצה חייבת להחזיר XR_ERROR_SIZE_INSUFFICIENT מ-xrQuerySpatialComponentDataEXT אם meshCount קטן מ-XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
במקרה של XrSpatialMeshDataEXT שאוכלס על ידי זמן הריצה במערך meshes, הערך של XrSpatialBufferEXT :: bufferType עבור XrSpatialMeshDataEXT :: vertexBuffer חייב להיות XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT, והערך של XrSpatialBufferEXT :: bufferType עבור XrSpatialMeshDataEXT :: indexBuffer חייב להיות XR_SPATIAL_BUFFER_TYPE_UINT16_EXT .
שימוש תקף (משתמע)
- צריך להפעיל את התוסף
XR_EXT_spatial_plane_trackingלפני שמשתמשים ב-XrSpatialComponentMesh2DListEXT -
typeחייב להיותXR_TYPE_SPATIAL_COMPONENT_MESH_2D_LIST_EXT -
nextחייב להיותNULLאו מצביע תקין אל המבנה הבא בשרשרת המבנים -
meshesmust be a pointer to an array ofmeshCountXrSpatialMeshDataEXT structures - הפרמטר
meshCountחייב להיות גדול מ-0
הגדרות אישיות
אם XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT מפורט ב-XrSpatialCapabilityComponentTypesEXT :: componentTypes עבור יכולת מסוימת, אפליקציה יכולה להפעיל אותה על ידי הכללת המונה ברשימה XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents של המבנה הנגזר XrSpatialCapabilityConfigurationBaseHeaderEXT של היכולת שתומכת ברכיב הזה.
אין צורך בהגדרה מיוחדת כדי לכלול את הרכיב הזה בשרשרת XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.
רכיב פוליגון דו-ממדי
נתוני רכיבים
המבנה XrSpatialPolygon2DDataEXT מוגדר כך:
typedef struct XrSpatialPolygon2DDataEXT {
XrPosef origin;
XrSpatialBufferEXT vertexBuffer;
} XrSpatialPolygon2DDataEXT;
תיאורים של חברי הקבוצה
-
originהוא XrPosef שמגדיר את המקור של הפוליגון. כל הקודקודים של המצולע הם יחסיים למקור הזה במישור X-Y. -
vertexBufferהוא XrSpatialBufferEXT שמספק את המזהה של מאגר מסוגXR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXTומייצג את מאגר הקודקודים של הישות שבה נמצא הרכיב הזה. הקודקודים חייבים להיות מוחזרים בסדר נגד כיוון השעון. אסור שהפוליגון שמיוצג על ידי הקודקודים האלה יצטלב עם עצמו, ויכול להיות שהוא קעור.
XrSpatialBufferEXT :: bufferType for vertexBuffer must be XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT .
שימוש תקף (משתמע)
- צריך להפעיל את התוסף
XR_EXT_spatial_plane_trackingלפני שמשתמשים ב-XrSpatialPolygon2DDataEXT -
vertexBufferחייב להיות מבנה XrSpatialBufferEXT תקין
מבנה רשימת הרכיבים לשאילתת נתונים
המבנה XrSpatialComponentPolygon2DListEXT מוגדר כך:
typedef struct XrSpatialComponentPolygon2DListEXT {
XrStructureType type;
void* next;
uint32_t polygonCount;
XrSpatialPolygon2DDataEXT* polygons;
} XrSpatialComponentPolygon2DListEXT;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
polygonCountהואuint32_tשמתאר את מספר האלמנטים במערךpolygons. -
polygonsהוא מערך של XrSpatialPolygon2DDataEXT .
כדי לשלוח שאילתה לגבי רכיב דו-ממדי של מצולע של ישויות מרחביות ב-XrSpatialSnapshotEXT , צריך לכלול את XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes ולהוסיף את XrSpatialComponentPolygon2DListEXT לשרשרת XrSpatialComponentDataQueryResultEXT :: next.
הסביבה בזמן ריצה חייבת להחזיר XR_ERROR_VALIDATION_FAILURE מ-xrQuerySpatialComponentDataEXT אם XrSpatialComponentPolygon2DListEXT נמצא בשרשרת XrSpatialComponentDataQueryResultEXT :: next אבל XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT לא נכלל ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes .
סביבת זמן הריצה חייבת להחזיר XR_ERROR_SIZE_INSUFFICIENT מ-xrQuerySpatialComponentDataEXT אם polygonCount קטן מ-XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
שימוש תקף (משתמע)
-
XR_EXT_spatial_plane_trackingהתוסף חייב להיות מופעל לפני השימוש ב-XrSpatialComponentPolygon2DListEXT -
typeחייב להיותXR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXT -
nextחייב להיותNULLאו מצביע תקין אל המבנה הבא בשרשרת המבנים -
polygonsmust be a pointer to an array ofpolygonCountXrSpatialPolygon2DDataEXT structures - הפרמטר
polygonCountחייב להיות גדול מ-0
הגדרות אישיות
אם XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT מפורט ב-XrSpatialCapabilityComponentTypesEXT :: componentTypes עבור יכולת מסוימת, אפליקציה יכולה להפעיל אותה על ידי הכללת המונה ברשימה XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents של המבנה הנגזר XrSpatialCapabilityConfigurationBaseHeaderEXT של היכולת שתומכת ברכיב הזה.
אין צורך בהגדרה מיוחדת כדי לכלול את הרכיב הזה בשרשרת XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.
תווית סמנטית של מטוס
נתוני רכיבים
typedef enum XrSpatialPlaneSemanticLabelEXT {
XR_SPATIAL_PLANE_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_FLOOR_EXT = 2,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_WALL_EXT = 3,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_CEILING_EXT = 4,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_TABLE_EXT = 5,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPlaneSemanticLabelEXT;
הספירה XrSpatialPlaneSemanticLabelEXT מתארת קבוצה של תוויות סמנטיות למישורים.
תיאור של טיפוס בן מנייה (enum)
XR_SPATIAL_PLANE_SEMANTIC_LABEL_UNCATEGORIZED_EXT
סביבת זמן הריצה לא הצליחה לסווג את הישות הזו.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_FLOOR_EXT
הישות היא רצפה.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_WALL_EXT
הישות היא קיר.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_CEILING_EXT
הישות היא תקרה.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_TABLE_EXT
הישויות הן טבלה.
מבנה רשימת הרכיבים לשאילתת נתונים
המבנה XrSpatialComponentPlaneSemanticLabelListEXT מוגדר כך:
typedef struct XrSpatialComponentPlaneSemanticLabelListEXT {
XrStructureType type;
void* next;
uint32_t semanticLabelCount;
XrSpatialPlaneSemanticLabelEXT* semanticLabels;
} XrSpatialComponentPlaneSemanticLabelListEXT;
תיאורים של חברי הקבוצה
-
typeהוא XrStructureType של המבנה הזה. -
nextהואNULLאו מצביע למבנה הבא בשרשרת מבנים. -
semanticLabelCountהואuint32_tשמתאר את מספר האלמנטים במערךsemanticLabels. -
semanticLabelsהוא מערך של XrSpatialPlaneSemanticLabelEXT .
כדי לשלוח שאילתה לגבי רכיב התווית הסמנטית של המישור בישויות מרחביות ב-XrSpatialSnapshotEXT , צריך לכלול את XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes ולהוסיף את XrSpatialComponentPlaneSemanticLabelListEXT לשרשרת XrSpatialComponentDataQueryResultEXT :: next.
סביבת זמן הריצה חייבת להחזיר XR_ERROR_VALIDATION_FAILURE מ-xrQuerySpatialComponentDataEXT אם XrSpatialComponentPlaneSemanticLabelListEXT נמצא בשרשרת הבאה של XrSpatialComponentDataQueryResultEXT :: next אבל XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT לא נכלל ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes .
סביבת זמן הריצה חייבת להחזיר XR_ERROR_SIZE_INSUFFICIENT מ-xrQuerySpatialComponentDataEXT אם semanticLabelCount קטן מ-XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
שימוש תקף (משתמע)
- חובה להפעיל את התוסף
XR_EXT_spatial_plane_trackingלפני שמשתמשים ב-XrSpatialComponentPlaneSemanticLabelListEXT -
typeחייב להיותXR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXT -
nextחייב להיותNULLאו מצביע תקין אל המבנה הבא בשרשרת המבנים -
semanticLabelsחייב להיות מצביע למערך של ערכיsemanticLabelCountXrSpatialPlaneSemanticLabelEXT - הפרמטר
semanticLabelCountחייב להיות גדול מ-0
הגדרות אישיות
אם XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT מפורט ב-XrSpatialCapabilityComponentTypesEXT :: componentTypes עבור יכולת מסוימת, אפליקציה יכולה להפעיל אותה על ידי הכללת הערך המנומר ברשימה XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents של המבנה הנגזר XrSpatialCapabilityConfigurationBaseHeaderEXT של היכולת שתומכת ברכיב הזה.
אין צורך בהגדרה מיוחדת כדי לכלול את הרכיב הזה בשרשרת XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.
קוד לדוגמה
הגדרה של יכולת מעקב אחר מטוסים
בדוגמת הקוד הבאה אפשר לראות איך מגדירים את היכולת לעקוב אחרי מישור כשיוצרים הקשר מרחבי.
// Check if plane tracking capability is supported
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_PLANE_TRACKING_EXT) == capabilities.end()) {
return;
}
// Enumerate supported components for plane tracking capability
XrSpatialCapabilityComponentTypesEXT planeComponents{XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &planeComponents));
std::vector<XrSpatialComponentTypeEXT> planeCapabilityComponents(planeComponents.componentTypeCountOutput);
planeComponents.componentTypeCapacityInput = planeCapabilityComponents.size();
planeComponents.componentTypes = planeCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &planeComponents));
// Check if polygon 2D and plane semantic labels optional components are supported
const auto supportsComponent = [&planeCapabilityComponents](XrSpatialComponentTypeEXT component) {
return std::find(planeCapabilityComponents.begin(), planeCapabilityComponents.end(), component) != planeCapabilityComponents.end();
};
const bool supportsPolygon2DComponent = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT);
const bool supportsSemanticLabelComponent = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT);
// Create a spatial context
XrSpatialContextEXT spatialContext{};
// Enable the 2 guaranteed components of the plane tracking capability
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
};
// Optionally enable polygon2D if it is supported
if (supportsPolygon2DComponent) {
enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT);
}
// Optionally enable semantic labels if it is supported
if (supportsSemanticLabelComponent) {
enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT);
}
XrSpatialCapabilityConfigurationPlaneTrackingEXT planeConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT};
planeConfig.capability = XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT;
planeConfig.enabledComponentCount = enabledComponents.size();
planeConfig.enabledComponents = enabledComponents.data();
std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&planeConfig),
};
XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
XrFutureEXT createContextFuture;
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) {
return;
}
spatialContext = completion.spatialContext;
// ...
// Discover entities with the spatial context
// ...
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
גילוי ישויות מרחביות ושאילתות לגבי נתוני רכיבים
בדוגמת הקוד הבאה אפשר לראות איך מגלים ישויות מרחביות בהקשר שהוגדר עם XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT ושולחים שאילתה לגבי נתוני הרכיבים שלה.
XrFutureEXT future = XR_NULL_FUTURE_EXT;
// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
};
if (supportsPolygon2DComponent) {
snapshotComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT);
}
if (supportsSemanticLabelComponent) {
snapshotComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT);
}
auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
snapshotCreateInfo.componentTypes = snapshotComponents.data();
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));
waitUntilReady(future);
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
completionInfo.baseSpace = localSpace;
completionInfo.time = time;
completionInfo.future = future;
XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
if (completion.futureResult == XR_SUCCESS) {
// Query for the semantic label component data
XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypeCount = snapshotComponents.size();
queryCond.componentTypes = snapshotComponents.data();
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.entityIdCountOutput);
queryResult.entityIdCapacityInput = entityIds.size();
queryResult.entityIds = entityIds.data();
queryResult.entityStateCapacityInput = entityStates.size();
queryResult.entityStates = entityStates.data();
std::vector<XrSpatialBounded2DDataEXT> bounded2D(queryResult.entityIdCountOutput);
XrSpatialComponentBounded2DListEXT bounded2DList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT};
bounded2DList.boundCount = bounded2D.size();
bounded2DList.bounds = bounded2D.data();
queryResult.next = &bounded2DList;
std::vector<XrSpatialPolygon2DDataEXT> polygons;
XrSpatialComponentPolygon2DListEXT polygonList{XR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXT};
if (supportsPolygon2DComponent) {
polygons.resize(queryResult.entityIdCountOutput);
polygonList.polygonCount = polygons.size();
polygonList.polygons = polygons.data();
polygonList.next = queryResult.next;
queryResult.next = &polygonList;
}
std::vector<XrSpatialPlaneSemanticLabelEXT> semanticLabels;
XrSpatialComponentPlaneSemanticLabelListEXT semanticLabelsList{XR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXT};
if (supportsSemanticLabelComponent) {
semanticLabels.resize(queryResult.entityIdCountOutput);
semanticLabelsList.semanticLabelCount = semanticLabels.size();
semanticLabelsList.semanticLabels = semanticLabels.data();
semanticLabelsList.next = queryResult.next;
queryResult.next = &semanticLabelsList;
}
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) {
continue;
}
// 2D bounds for entity entityIds[i] is bounded2D[i].extents centered on bounded2D[i].center.
if (supportsPolygon2DComponent) {
// 2D polygon for entity entityIds[i] is the buffer represented by polygons[i].bufferId.
// Application uses flink:xrGetSpatialBufferVector2fEXT to get the buffer data.
}
if (supportsSemanticLabelComponent) {
// semantic label for entity entityIds[i] is semanticLabels[i].
}
}
CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
}
};
while (1) {
// ...
// For every frame in frame loop
// ...
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_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);
break;
}
}
}
// ...
// Finish frame loop
// ...
}
מבנים חדשים
- XrSpatialCapabilityConfigurationPlaneTrackingEXT
- XrSpatialPolygon2DDataEXT
הרחבה של XrSpatialComponentDataQueryResultEXT :
New Enums
New Enum Constants
XR_EXT_SPATIAL_PLANE_TRACKING_EXTENSION_NAMEXR_EXT_spatial_plane_tracking_SPEC_VERSIONהרחבה של XrSpatialCapabilityEXT :
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT
הרחבה של XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXTXR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXTXR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXTXR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT
הרחבה של XrStructureType :
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXTXR_TYPE_SPATIAL_COMPONENT_MESH_2D_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_PLANE_ALIGNMENT_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXT
בעיות
היסטוריית הגרסאות
גרסה 1, 02.07.2024 (ניהב ג'יין, Google)
- תיאור ראשוני של התוסף