XR_EXT_spatial_object_tracking

מחרוזת שם

XR_EXT_spatial_object_tracking

סוג התוסף

תוסף למכונה

מספר השלוחה הרשום

745

גרסה

1

סטטוס האישור

לא אושר

תלויות של תוספים וגרסאות

XR_EXT_spatial_entity

סטטוס IP

אין תלונות ידועות על הפרת קניין רוחני.

שותפים ביצירת התוכן

Nihav Jain, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Ron Bessems, Meta
Yin Li, Microsoft
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
Jun Yan, ByteDance
Andy Biar, Unity Technologies
Rebecca Nordhauser, Unity Technologies

סקירה כללית

התוסף הזה מבוסס על XR_EXT_spatial_entity ומגדיר יכולת מרחבית למעקב אחרי קבוצה של אובייקטים מוגדרים מראש, בלי צורך בקבוצת נתונים כקלט מהאפליקציה.

תמיכה בסביבת זמן הריצה

אם סביבת זמן הריצה תומכת במעקב אחר אובייקטים, היא חייבת לציין זאת על ידי ספירת XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT ב-xrEnumerateSpatialCapabilitiesEXT .

הגדרות אישיות

המבנה של XrSpatialCapabilityConfigurationObjectTrackingEXT מוגדר כך:

typedef struct XrSpatialCapabilityConfigurationObjectTrackingEXT {
    XrStructureType                     type;
    const void*                         next;
    XrSpatialCapabilityEXT              capability;
    uint32_t                            enabledComponentCount;
    const XrSpatialComponentTypeEXT*    enabledComponents;
} XrSpatialCapabilityConfigurationObjectTrackingEXT;

תיאורי חברים

  • ‫type הוא ה-XrStructureType של המבנה הזה.
  • ‫next הוא NULL או מצביע למבנה הבא בשרשרת מבנים.
  • ‫capability הוא XrSpatialCapabilityEXT וחייב להיות XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT .
  • ‫enabledComponentCount הוא uint32_t שמתאר את מספר הרכיבים במערך enabledComponents.
  • ‫enabledComponents הוא מצביע למערך של XrSpatialComponentTypeEXT .

אפליקציות יכולות להפעיל את היכולת המרחבית XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT על ידי הוספת מצביע למבנה XrSpatialCapabilityConfigurationObjectTrackingEXT ב-XrSpatialContextCreateInfoEXT :: capabilityConfigs .

זמן הריצה חייב להחזיר את הערך XR_ERROR_VALIDATION_FAILURE אם capability הוא לא XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT .

שימוש תקין (משתמע)

רכיבים מובטחים

סביבת זמן ריצה שתומכת ב-XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT חייבת לתמוך ברכיבים המרחביים הבאים כרכיבים מובטחים של הישויות שזוהו על ידי היכולת הזו, וחייבת למנות אותם ב-xrEnumerateSpatialCapabilityComponentTypesEXT :

  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT
  • לפחות סוג רכיב אחד שמספק קבוצה של תוויות סמנטיות לאובייקטים במעקב. ליכולת מעקב אחר אובייקטים אין משמעות בלי רכיב תווית סמנטית. התוסף הזה מגדיר את XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT ו-XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT כרכיבים אפשריים של תוויות סמנטיות שזמני הריצה יכולים לתמוך בהם, אבל תוספים אחרים יכולים להגדיר סוגי רכיבים חדשים כדי לספק סוגים שונים של תוויות סמנטיות שמתארות אובייקט במעקב. במאמר [ext_spatial_semantic_labels_guidelines] מוסבר איך לעצב קבוצות של תוויות סמנטיות וסוגי רכיבים. יכול להיות שסביבות זמן הריצה לא יתמכו ב-XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT או ב-XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT ליכולת מעקב אחר אובייקטים, אבל הן חייבות לתמוך לפחות בסוג רכיב אחד שמספק תווית סמנטית.

רכיב תלת-ממדי מוגבל

הרכיב התלת-ממדי התחום מספק את המרכז וההיקף של האובייקט שמיוצג על ידי הישות שעליה הוא נמצא. פרטים נוספים זמינים במאמר תלת-ממד מוגבל.

רכיבים אופציונליים

סביבת זמן ריצה שתומכת ב-XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT עשויה לתמוך ברכיבים מרחביים בנוסף לאלה שמפורטים בקטע רכיבים מובטחים. האפליקציה יכולה להשתמש ב-xrEnumerateSpatialCapabilityComponentTypesEXT כדי לקבל את הרשימה המלאה של הרכיבים שנתמכים בסביבת זמן הריצה, ויכולה להגדיר את הרכיבים הרצויים כשהיא יוצרת את ההקשר המרחבי.

תווית סמנטית של אובייקט

נתוני רכיבים

typedef enum XrSpatialObjectSemanticLabelEXT {
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT = 2,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_BED_EXT = 3,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CHAIR_EXT = 4,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT = 5,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_LAMP_EXT = 6,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_PLANT_EXT = 7,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT = 8,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT = 9,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CABINET_EXT = 10,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialObjectSemanticLabelEXT;

הספירה XrSpatialObjectSemanticLabelEXT מתארת קבוצה של תוויות סמנטיות לאובייקטים.

בישויות עם התווית XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT, ציר ה-+Z של הרכיב Bounded 3D חייב להתאים פחות או יותר לנורמל של משטח המסך.

בישויות עם התווית XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT, ציר ה-Z+‎ של הרכיב Bounded 3D חייב להתאים לנורמל המשטח של הקיר שעליו נמצאה היצירה.

בישויות עם התווית XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT, ציר ה-Z+‎ של הרכיב Bounded 3D חייב להתאים לנורמל של משטח השולחן.

לגבי כל התוויות האחרות ב-XrSpatialObjectSemanticLabelEXT , האפליקציה לא יכולה להניח הנחות לגבי האופן שבו XrBoxf :: center :: orientation שסופק על ידי רכיב Bounded 3D בישות תואם למאפיינים הפיזיים של האובייקט הזה.

אלה המשמעויות של ערכי הספירה:

תיאור הטיפוס בן המנייה (enum)

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT

זמן הריצה לא הצליח לסווג את הישות הזו.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT

הישות היא ספה.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_BED_EXT

הישות היא מיטה.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CHAIR_EXT

הישות היא כיסא.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT

הישות היא טבלה.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_LAMP_EXT

הישות היא מנורה.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_PLANT_EXT

הישות היא צמח.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT

הישות היא מסך תצוגה, כמו צג או טלוויזיה.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT

הישות היא תמונה לתלייה על הקיר.

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CABINET_EXT

הישות היא ארון.

מבנה רשימת הרכיבים לשליפת נתונים

המבנה של XrSpatialComponentObjectSemanticLabelListEXT מוגדר כך:

typedef struct XrSpatialComponentObjectSemanticLabelListEXT {
    XrStructureType                     type;
    void*                               next;
    uint32_t                            semanticLabelCount;
    XrSpatialObjectSemanticLabelEXT*    semanticLabels;
} XrSpatialComponentObjectSemanticLabelListEXT;

תיאורי חברים

  • ‫type הוא ה-XrStructureType של המבנה הזה.
  • ‫next הוא NULL או מצביע למבנה הבא בשרשרת מבנים. מבנים כאלה לא מוגדרים ב-OpenXR או בתוסף הזה.
  • ‫semanticLabelCount הוא uint32_t שמתאר את מספר הרכיבים במערך semanticLabels.
  • ‫semanticLabels הוא מערך של XrSpatialObjectSemanticLabelEXT .

כדי לשלוח שאילתה לרכיב התווית הסמנטית של האובייקט של הישויות המרחביות ב-XrSpatialSnapshotEXT , צריך לכלול את XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes ולהוסיף את XrSpatialComponentObjectSemanticLabelListEXT לשרשרת XrSpatialComponentDataQueryResultEXT :: next.

סביבת זמן הריצה חייבת להחזיר את הערך XR_ERROR_VALIDATION_FAILURE מ-xrQuerySpatialComponentDataEXT אם XrSpatialComponentObjectSemanticLabelListEXT נמצא בשרשרת XrSpatialComponentDataQueryResultEXT :: next אבל XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT לא נכלל ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes .

זמן הריצה חייב להחזיר את הערך XR_ERROR_SIZE_INSUFFICIENT מ-xrQuerySpatialComponentDataEXT אם semanticLabelCount קטן מ-XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .

שימוש תקין (משתמע)

הגדרות אישיות

אם XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT מופיע ב-XrSpatialCapabilityComponentTypesEXT :: componentTypes עבור יכולת מסוימת, אפליקציה יכולה להפעיל אותה על ידי הכללת הערך ברשימה XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents של המבנה הנגזר XrSpatialCapabilityConfigurationBaseHeaderEXT של היכולת שתומכת ברכיב הזה.

הרכיב הזה לא דורש הגדרה מיוחדת כדי להיכלל בשרשרת XrSpatialCapabilityConfigurationBaseHeaderEXT :: next, אבל הוא מציע הגדרה אופציונלית שאפליקציות יכולות לספק.

המבנה של XrSpatialFeatureObjectSemanticLabelSubsetEXT מוגדר כך:

typedef struct XrSpatialFeatureObjectSemanticLabelSubsetEXT {
    XrStructureType                           type;
    const void*                               next;
    uint32_t                                  semanticLabelCount;
    const XrSpatialObjectSemanticLabelEXT*    semanticLabels;
} XrSpatialFeatureObjectSemanticLabelSubsetEXT;

תיאורי חברים

  • ‫type הוא ה-XrStructureType של המבנה הזה.
  • ‫next הוא NULL או מצביע למבנה הבא בשרשרת מבנים.
  • ‫semanticLabelCount הוא uint32_t שמתאר את מספר הרכיבים במערך semanticLabels.
  • ‫semanticLabels הוא מערך של XrSpatialObjectSemanticLabelEXT .

אם זמן הריצה מונה את XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT מ-xrEnumerateSpatialCapabilityComponentTypesEXT ליכולת מסוימת, הוא חייב גם למנות את XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT מ-xrEnumerateSpatialCapabilityFeaturesEXT לאותה יכולת. אם אפליקציה מפעילה את XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT כשהיא מגדירה את היכולת הזו, היא יכולה לשרשר את XrSpatialFeatureObjectSemanticLabelSubsetEXT למבנה ההגדרות התואם של היכולת הזו כדי לספק לזמן הריצה קבוצת משנה של תוויות שמוגדרות ב-XrSpatialObjectSemanticLabelEXT . יכול להיות שזמן הריצה ישתמש בקבוצת המשנה הזו של תוויות כדי לבצע אופטימיזציה של צינורות עיבוד הנתונים למעקב.

זמן הריצה חייב להחזיר את הערך XR_ERROR_VALIDATION_FAILURE מ-xrCreateSpatialContextAsyncEXT אם semanticLabels מכיל תווית שלא מוגדרת ב-XrSpatialObjectSemanticLabelEXT או אם semanticLabels מכיל את הערך XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT .

סביבת זמן הריצה חייבת להחזיר את הערך XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT מ-xrCreateSpatialContextAsyncEXT אם האפליקציה מספקת רשימה חוקית של תוויות ב-semanticLabels אבל XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT לא נכלל במערך enabledComponents של XrSpatialCapabilityConfigurationBaseHeaderEXT :: במבנה ההגדרות האישיות שאליו משורשר XrSpatialFeatureObjectSemanticLabelSubsetEXT.

אם האפליקציה מגדירה יכולת עם XrSpatialFeatureObjectSemanticLabelSubsetEXT תקין, זמן הריצה לא יכול לכלול ישויות עם תוויות סמנטיות שלא מופיעות ב-semanticLabels באף תמונת מצב של גילוי שנוצרה בשביל ההקשר המרחבי שהוגדר.

שימוש תקין (משתמע)

תווית סמנטית של מקלדת

נתוני רכיבים

typedef enum XrSpatialKeyboardSemanticLabelEXT {
    XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
    XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT = 2,
    XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialKeyboardSemanticLabelEXT;

הספירה XrSpatialKeyboardSemanticLabelEXT מתארת תווית סמנטית למקלדת.

ההיקף והכיוון של XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT שמיוצגים על ידי הרכיב Bounded 3D באותה ישות מוצגים בתמונה הבאה (עם xyz = rgb) שמקורה במרכז האובייקט.

ext spatial object tracking keyboard orientation

איור 30. כיוון המקלדת.

תיאור הטיפוס בן המנייה (enum)

XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_UNCATEGORIZED_EXT

זמן הריצה לא הצליח לסווג את הישות הזו.

XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT

הישות היא מקלדת.

מבנה של רשימת רכיבים לשאילתת נתונים

המבנה של XrSpatialComponentKeyboardSemanticLabelListEXT מוגדר כך:

typedef struct XrSpatialComponentKeyboardSemanticLabelListEXT {
    XrStructureType                       type;
    void*                                 next;
    uint32_t                              semanticLabelCount;
    XrSpatialKeyboardSemanticLabelEXT*    semanticLabels;
} XrSpatialComponentKeyboardSemanticLabelListEXT;

תיאורי חברים

  • ‫type הוא ה-XrStructureType של המבנה הזה.
  • ‫next הוא NULL או מצביע למבנה הבא בשרשרת מבנים. מבנים כאלה לא מוגדרים ב-OpenXR או בתוסף הזה.
  • ‫semanticLabelCount הוא uint32_t שמתאר את מספר הרכיבים במערך semanticLabels.
  • ‫semanticLabels הוא מערך של XrSpatialKeyboardSemanticLabelEXT .

כדי לשלוח שאילתה לרכיב התווית הסמנטית של המקלדת של הישויות המרחביות ב-XrSpatialSnapshotEXT , צריך לכלול את XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes ולהוסיף את XrSpatialComponentKeyboardSemanticLabelListEXT לשרשרת XrSpatialComponentDataQueryResultEXT :: next.

זמן הריצה חייב להחזיר את הערך XR_ERROR_VALIDATION_FAILURE מ-xrQuerySpatialComponentDataEXT אם XrSpatialComponentKeyboardSemanticLabelListEXT נמצא בשרשרת XrSpatialComponentDataQueryResultEXT :: next אבל XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT לא נכלל ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes .

זמן הריצה חייב להחזיר את הערך XR_ERROR_SIZE_INSUFFICIENT מ-xrQuerySpatialComponentDataEXT אם semanticLabelCount קטן מ-XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .

שימוש תקין (משתמע)

הגדרות אישיות

אם XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT מופיע ב-XrSpatialCapabilityComponentTypesEXT :: componentTypes עבור יכולת מסוימת, אפליקציה יכולה להפעיל אותה על ידי הכללת הערך ברשימה XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents של המבנה הנגזר XrSpatialCapabilityConfigurationBaseHeaderEXT של היכולת שתומכת ברכיב הזה.

הרכיב הזה לא דורש הגדרה מיוחדת כדי להיכלל בשרשרת XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.

תווית סמנטית של עכבר

נתוני רכיבים

typedef enum XrSpatialMouseSemanticLabelEXT {
    XR_SPATIAL_MOUSE_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
    XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MOUSE_EXT = 2,
    XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialMouseSemanticLabelEXT;

הספירה XrSpatialMouseSemanticLabelEXT מתארת תווית סמנטית לעכבר.

תיאור הטיפוס בן המנייה (enum)

XR_SPATIAL_MOUSE_SEMANTIC_LABEL_UNCATEGORIZED_EXT

זמן הריצה לא הצליח לסווג את הישות הזו.

XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MOUSE_EXT

הישות היא עכבר.

מבנה של רשימת רכיבים לשאילתת נתונים

המבנה של XrSpatialComponentMouseSemanticLabelListEXT מוגדר כך:

typedef struct XrSpatialComponentMouseSemanticLabelListEXT {
    XrStructureType                    type;
    void*                              next;
    uint32_t                           semanticLabelCount;
    XrSpatialMouseSemanticLabelEXT*    semanticLabels;
} XrSpatialComponentMouseSemanticLabelListEXT;

תיאורי חברים

  • ‫type הוא ה-XrStructureType של המבנה הזה.
  • ‫next הוא NULL או מצביע למבנה הבא בשרשרת מבנים. מבנים כאלה לא מוגדרים ב-OpenXR או בתוסף הזה.
  • ‫semanticLabelCount הוא uint32_t שמתאר את מספר הרכיבים במערך semanticLabels.
  • ‫semanticLabels הוא מערך של XrSpatialMouseSemanticLabelEXT .

כדי לשלוח שאילתה לרכיב התווית הסמנטית של העכבר של הישויות המרחביות ב-XrSpatialSnapshotEXT , צריך לכלול את XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes ולהוסיף את XrSpatialComponentMouseSemanticLabelListEXT לשרשרת XrSpatialComponentDataQueryResultEXT :: next.

זמן הריצה חייב להחזיר את הערך XR_ERROR_VALIDATION_FAILURE מ-xrQuerySpatialComponentDataEXT אם XrSpatialComponentMouseSemanticLabelListEXT נמצא בשרשרת XrSpatialComponentDataQueryResultEXT :: next אבל XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT לא נכלל ב-XrSpatialComponentDataQueryConditionEXT :: componentTypes .

זמן הריצה חייב להחזיר את הערך XR_ERROR_SIZE_INSUFFICIENT מ-xrQuerySpatialComponentDataEXT אם semanticLabelCount קטן מ-XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .

שימוש תקין (משתמע)

הגדרות אישיות

אם XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT מופיע ב-XrSpatialCapabilityComponentTypesEXT :: componentTypes עבור יכולת מסוימת, אפליקציה יכולה להפעיל אותה על ידי הכללת הערך ברשימה XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents של המבנה הנגזר XrSpatialCapabilityConfigurationBaseHeaderEXT של היכולת שתומכת ברכיב הזה.

הרכיב הזה לא דורש הגדרה מיוחדת כדי להיכלל בשרשרת XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.

קוד לדוגמה

הגדרת יכולת מעקב אחר אובייקטים

הקוד לדוגמה הבא מראה איך להגדיר את יכולת מעקב האובייקטים כשיוצרים הקשר מרחבי.

// Check if object 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_OBJECT_TRACKING_EXT) == capabilities.end()) {
  return;
}

// Enumerate supported components for object tracking capability
XrSpatialCapabilityComponentTypesEXT objectComponents{XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, &objectComponents));
std::vector<XrSpatialComponentTypeEXT> objectCapabilityComponents(objectComponents.componentTypeCountOutput);
objectComponents.componentTypeCapacityInput = objectCapabilityComponents.size();
objectComponents.componentTypes = objectCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, &objectComponents));

// Check if the object & keyboard semantic labels component is supported
const auto supportsComponent = [&objectCapabilityComponents](XrSpatialComponentTypeEXT component) {
  return std::find(objectCapabilityComponents.begin(), objectCapabilityComponents.end(), component) != objectCapabilityComponents.end();
};

const bool supportsObjectSemanticLabel = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT);
const bool supportsKeyboardSemanticLabel = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT);

// Enumerate supported features for object tracking capability
uint32_t featureCount;
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, 0, &featureCount, nullptr));
std::vector<XrSpatialCapabilityFeatureEXT> features(featureCount);
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, featureCount, &featureCount, features.data()));

const bool supportsObjectSemanticLabelSubsetFeature = std::find(features.begin(), features.end(), XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT) != features.end();

// Create a spatial context
XrSpatialContextEXT spatialContext{};

// Enable the guaranteed components of the object tracking capability
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
  XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT,
};
// Optionally enable the supported semantic labels
if (supportsObjectSemanticLabel) {
  enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT);
}
if (supportsKeyboardSemanticLabel) {
  enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT);
}

// We only want to track sofa and table.
std::vector<XrSpatialObjectSemanticLabelEXT> objectSemanticLabelSubset = {
  XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT,
  XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT
};
XrSpatialFeatureObjectSemanticLabelSubsetEXT subsetFeature{XR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT};
subsetFeature.semanticLabelCount = objectSemanticLabelSubset.size();
subsetFeature.semanticLabels = objectSemanticLabelSubset.data();

XrSpatialCapabilityConfigurationObjectTrackingEXT objectTrackingConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXT};
objectTrackingConfig.capability = XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT;
objectTrackingConfig.enabledComponentCount = enabledComponents.size();
objectTrackingConfig.enabledComponents = enabledComponents.data();
if (supportsObjectSemanticLabelSubsetFeature) {
  objectTrackingConfig.next = &subsetFeature;
}

std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
  reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&objectTrackingConfig),
};

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;

// ...
// Discovery entities with the spatial context
// ...

CHK_XR(xrDestroySpatialContextEXT(spatialContext));

חיפוש ישויות מרחביות ושאילתות על נתוני רכיבים

הקוד לדוגמה הבא מדגים איך לגלות ישויות מרחביות בהקשר שמוגדר עם XR_SPATIAL_CAPABILITY_OBJECT_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_3D_EXT,
};
if (supportsKeyboardSemanticLabel) {
  snapshotComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_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<XrBoxf> bounded3D(queryResult.entityIdCountOutput);
    XrSpatialComponentBounded3DListEXT bounded3DList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_3D_LIST_EXT};
    bounded3DList.boundCount = bounded3D.size();
    bounded3DList.bounds = bounded3D.data();
    queryResult.next = &bounded3DList;

    std::vector<XrSpatialKeyboardSemanticLabelEXT> semanticLabels;
    XrSpatialComponentKeyboardSemanticLabelListEXT semanticLabelsList{XR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXT};
    if (supportsKeyboardSemanticLabel) {
      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;
      }

      // 3D bounds for entity entityIds[i] is bounded3D[i].extents centered on bounded3D[i].center.

      if (supportsKeyboardSemanticLabel) {
        // 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
  // ...
}

מבנים חדשים

ערכי Enums חדשים

קבועי Enum חדשים

  • XR_EXT_SPATIAL_OBJECT_TRACKING_EXTENSION_NAME
  • XR_EXT_spatial_object_tracking_SPEC_VERSION
  • הרחבה של XrSpatialCapabilityEXT :

    • XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT
  • הרחבה של XrSpatialCapabilityFeatureEXT :

    • XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT
  • הרחבה של XrSpatialComponentTypeEXT :

    • XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT
    • XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT
    • XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT
  • הרחבה של XrStructureType :

    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXT
    • XR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_COMPONENT_MOUSE_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_COMPONENT_OBJECT_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT

בעיות

היסטוריית הגרסאות

  • גרסה 1, 3 ביוני 2025 (Nihav Jain, ‏ Google)

    • תיאור התוסף הראשוני