התוסף XR_ANDROID_scene_meshing OpenXR

מחרוזת שם XR_ANDROID_scene_meshing

סוג התוסף תוסף מופע

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

Revision 3

Extension and Version Dependencies OpenXR 1.0

תאריך השינוי האחרון 2025-05-15

סטטוס כתובת ה-IP לא ידוע על תלונות לגבי כתובת ה-IP.

תודות Spencer Quin, Google Jared Finder, Google Antonio Fontan, Google Cairn Overturf, Google Nihav Jain, Google Salar Khan, Google Sebastian Klose, Google Jürgen Sturm, Google Vinny DaSilva, Google Ricardo Campbell, Google

סקירה כללית

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

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

הרשאות

אפליקציות ל-Android חייבות לכלול את ההרשאה android.permission.SCENE_UNDERSTANDING_FINE בקובץ המניפסט שלהן. ההרשאה android.permission.SCENE_UNDERSTANDING_FINE נחשבת להרשאה רגישה כי היא מאפשרת לסביבת זמן הריצה ללמוד את סביבת המשתמש.

האפליקציה חייבת לבקש את ההרשאה בזמן הריצה כדי להשתמש בפונקציות האלה:

(רמת הגנה: מסוכן)

בדיקת יכולות המערכת

אפליקציה יכולה לבדוק אם המערכת מסוגלת ליצור מיפוי של סצנות על ידי שרשור של מבנה XrSystemSceneMeshingPropertiesANDROID אל XrSystemProperties כשקוראים ל-xrGetSystemProperties.

XrSystemSceneMeshingPropertiesANDROID

typedef struct XrSystemSceneMeshingPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsSceneMeshing;
} XrSystemSceneMeshingPropertiesANDROID;

תיאורי חברים

  • type הוא XrStructureType של המבנה הזה.
  • next הוא NULL או מצביע למבנה הבא בשרשרת של מבנים. לא מוגדרים מבנים כאלה ב-OpenXR הבסיסי או בתוסף הזה.
  • supportsSceneMeshing הוא XrBool32, שמציין אם המערכת תומכת במיזוג סצנות.

אם הערך של supportsSceneMeshing הוא XR_FALSE, המערכת לא תומכת במיזוג סצנות. מומלץ להימנע משימוש בפונקציונליות של מיפוי סצנות כשערך המשתנה supportsSceneMeshing הוא XR_FALSE, כי קריאות לפונקציה xrCreateSceneMeshingTrackerANDROID ייכשלו.

אם הערך של supportsSceneMeshing הוא XR_TRUE, המערכת תומכת במיזוג סצנות.

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

XrSceneMeshSemanticLabelSetANDROID

הספירה XrSceneMeshSemanticLabelSetANDROID מתארת את קבוצות התוויות הסמנטיות עבור מיפוי רשתות של סצנות. כל ערך ב-enum הזה מייצג enum אחר שמכיל את התוויות הסמנטיות. לדוגמה, הערך XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID מייצג את הקבוצה XrSceneMeshSemanticLabelANDROID.

typedef enum XrSceneMeshSemanticLabelSetANDROID {
    XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID = 0,
    XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID = 1,
    XR_SCENE_MESH_SEMANTIC_LABEL_SET_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshSemanticLabelSetANDROID;

xrEnumerateSupportedSemanticLabelSetsANDROID

האפליקציה יכולה לקבל קבוצות של תוויות סמנטיות שנתמכות על ידי המערכת באמצעות הפונקציה xrEnumerateSupportedSemanticLabelSetsANDROID.

XrResult xrEnumerateSupportedSemanticLabelSetsANDROID(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    uint32_t                                    supportedSemanticLabelSetsInputCapacity,
    uint32_t*                                   supportedSemanticLabelSetsOutputCount,
    XrSceneMeshSemanticLabelSetANDROID*         supportedSemanticLabelSets);

תיאורי פרמטרים

  • instance הוא XrInstance שנוצר על ידי האפליקציה.
  • systemId הוא XrSystemId שבוצעה לו פעולת ניסיון חוזר מ-xrGetSystem.
  • supportedSemanticLabelSetsInputCapacity הוא האורך של supportedSemanticLabelSets.
  • supportedSemanticLabelSetsOutputCount הוא מספר הרכיבים ב-supportedSemanticLabelSets ששונה על ידי זמן הריצה החל מתחילת המערך.
  • supportedSemanticLabelSets הוא מערך של XrSceneMeshSemanticLabelSetANDROID שזמן הריצה כותב אליו את קבוצות התוויות הסמנטיות הנתמכות.

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

יצירת כינוי למעקב אחרי מיזוג סצנות

XrSceneMeshingTrackerANDROID

XR_DEFINE_HANDLE(XrSceneMeshingTrackerANDROID)

ה-handle‏ XrSceneMeshingTrackerANDROID מייצג אמצעי מעקב אחר מיפוי סצנות למיפוי סצנות ולניהול המשאבים הקשורים.

אפשר להשתמש בכינוי הזה כדי ליצור תמונת מצב של רשת סצנה באמצעות xrCreateSceneMeshSnapshotANDROID בתוסף הזה.

xrCreateSceneMeshingTrackerANDROID

אפליקציה יכולה ליצור נקודת אחיזה מסוג XrSceneMeshingTrackerANDROID באמצעות הפונקציה xrCreateSceneMeshingTrackerANDROID.

XrResult xrCreateSceneMeshingTrackerANDROID(
    XrSession                                   session,
    const XrSceneMeshingTrackerCreateInfoANDROID* createInfo,
    XrSceneMeshingTrackerANDROID*               tracker);

תיאורי פרמטרים

אם המערכת לא תומכת במיזוג סצנות, הפונקציה xrCreateSceneMeshingTrackerANDROID תחזיר את הערך XR_ERROR_FEATURE_UNSUPPORTED. האפליקציה יכולה לבדוק אם יש תמיכה במערכת על ידי קריאה ל-xrGetSystemProperties עם המבנה XrSystemSceneMeshingPropertiesANDROID.

אפשר להשתמש רק בערכות של תוויות סמנטיות שנתמכות על ידי המערכת ב-XrSceneMeshingTrackerCreateInfoANDROID::semanticLabelSet כשיוצרים כלי למעקב אחר רשתות של סצנות. אפשר להשתמש בפונקציה xrEnumerateSupportedSemanticLabelSetsANDROID כדי לקבל את רשימת קבוצות התוויות הסמנטיות הנתמכות.

אם האפליקציה מבקשת semanticLabelSet שלא נתמך, הפונקציה xrCreateSceneMeshingTrackerANDROID תחזיר את הערך XR_ERROR_FEATURE_UNSUPPORTED.

ה-handle‏ xrCreateSceneMeshingTrackerANDROID הוא הבעלים של כל המשאבים של מיפוי הרשת של הסצנה. בסיום השימוש בחוויית מיפוי הסצנה, האפליקציה חייבת להרוס את ה-handle באמצעות הפונקציה xrDestroySceneMeshingTrackerANDROID.

XrSceneMeshingTrackerCreateInfoANDROID

המבנה XrSceneMeshingTrackerCreateInfoANDROID מתאר את המידע ליצירת נקודת אחיזה XrSceneMeshingTrackerANDROID.

typedef struct XrSceneMeshingTrackerCreateInfoANDROID {
    XrStructureType                       type;
    const void*                           next;
    XrSceneMeshSemanticLabelSetANDROID    semanticLabelSet;
    XrBool32                              enableNormals;
} XrSceneMeshingTrackerCreateInfoANDROID;

תיאורי חברים

  • type הוא XrStructureType של המבנה הזה.
  • next הוא NULL או מצביע למבנה הבא בשרשרת של מבנים. לא מוגדרים מבנים כאלה ב-OpenXR הבסיסי או בתוסף הזה.
  • semanticLabelSet הוא XrSceneMeshSemanticLabelSetANDROID שמשמש לציון קבוצת התוויות הסמנטיות שתשמש למיפוי הסצנה. אם הערך הוא XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID, סביבת זמן הריצה מתעלמת משדה המאגר XrSceneSubmeshDataANDROID::vertexSemantics.
  • enableNormals הוא XrBool32 שמשמש כדי לציין אם לכלול את הנורמלים של הקודקודים של רשת המשולשים במאגר של רשת המשולשים של הסצנה כשמקבלים את נתוני רשת המשולשים של הסצנה.

xrDestroySceneMeshingTrackerANDROID

הפונקציה xrDestroySceneMeshingTrackerANDROID משחררת את tracker ואת המשאבים הבסיסיים כשמסיימים את השימוש בחוויות של מיפוי סצנות.

XrResult xrDestroySceneMeshingTrackerANDROID(
    XrSceneMeshingTrackerANDROID          tracker);

תיאורי פרמטרים

יצירת כינוי לקובץ snapshot של רשת סצנה

XrSceneMeshSnapshotANDROID

XR_DEFINE_HANDLE(XrSceneMeshSnapshotANDROID)

ה-handle‏ XrSceneMeshSnapshotANDROID מייצג תמונת מצב של רשת סצנה. הוא נוצר באמצעות xrCreateSceneMeshSnapshotANDROID, שלמעשה לוכד תמונה של נתוני רשת הסצנה בזמן הקריאה לפונקציה.

אפשר להשתמש ב-handle הזה כדי לאחזר מידע ונתונים על רשתות משנה באמצעות xrGetAllSubmeshStatesANDROID ו-xrGetSubmeshDataANDROID.

XrSceneMeshSnapshotCreateInfoANDROID

המבנה XrSceneMeshSnapshotCreateInfoANDROID מתאר את המידע ליצירת נקודת זמן של רשת תלת-ממדית של סצנה XrSceneMeshSnapshotANDROID

typedef struct XrSceneMeshSnapshotCreateInfoANDROID {
    XrStructureType    type;
    const void*        next;
    XrSpace            baseSpace;
    XrTime             time;
    XrBoxf             boundingBox;
} XrSceneMeshSnapshotCreateInfoANDROID;

תיאורי חברים

  • type הוא XrStructureType של המבנה הזה.
  • next הוא NULL או מצביע למבנה הבא בשרשרת של מבנים. לא מוגדרים מבנים כאלה ב-OpenXR הבסיסי או בתוסף הזה.
  • baseSpace הוא XrSpace שמשמש לתיאור מרחב ההפניה שבו צריך לייצג את נתוני התנוחה של רשתות המשנה של הסצנה.
  • time הוא XrTime שמתאר את הזמן שבו רשת הסצנה תעובד או תוצג.
  • boundingBox הוא XrBoxf שמתאר את התיבה התוחמת שבתוכה יתבצע איסוף של רשת הסצנה.

XrSceneMeshTrackingStateANDROID

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

typedef enum XrSceneMeshTrackingStateANDROID {
    XR_SCENE_MESH_TRACKING_STATE_INITIALIZING_ANDROID = 0,
    XR_SCENE_MESH_TRACKING_STATE_TRACKING_ANDROID = 1,
    XR_SCENE_MESH_TRACKING_STATE_WAITING_ANDROID = 2,
    XR_SCENE_MESH_TRACKING_STATE_ERROR_ANDROID = 3,
    XR_SCENE_MESH_TRACKING_STATE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshTrackingStateANDROID;

XrSceneMeshSnapshotCreationResultANDROID

המבנה XrSceneMeshSnapshotCreationResultANDROID מאחסן את התוצאה של יצירת קובץ snapshot של רשת הסצנה שמוחזרת מ-xrCreateSceneMeshSnapshotANDROID. התוצאה כוללת את נקודת האחיזה של ה-snapshot ואת מצב המעקב של כלי המעקב של מיפוי התלת-ממד של הסצנה בזמן יצירת ה-snapshot.

typedef struct XrSceneMeshSnapshotCreationResultANDROID {
    XrStructureType                  type;
    void*                            next;
    XrSceneMeshSnapshotANDROID       snapshot;
    XrSceneMeshTrackingStateANDROID    trackingState;
} XrSceneMeshSnapshotCreationResultANDROID;

תיאורי חברים

  • type הוא XrStructureType של המבנה הזה.
  • next הוא NULL או מצביע למבנה הבא בשרשרת של מבנים. לא מוגדרים מבנים כאלה ב-OpenXR הבסיסי או בתוסף הזה.
  • snapshot הוא אובייקט מסוג XrSceneMeshSnapshotANDROID שנוצר על ידי זמן הריצה.
  • trackingState הוא XrSceneMeshTrackingStateANDROID שמתאר את המצב של כלי המעקב אחר רשת הסצנה בזמן יצירת תמונת המצב.

xrCreateSceneMeshSnapshotANDROID

האפליקציה יכולה להשתמש בפונקציה xrCreateSceneMeshSnapshotANDROID כדי ליצור תמונת מצב של רשת הסצנה מהכלי למעקב אחר רשת הסצנה. הפונקציה מחזירה נקודת אחיזה מסוג XrSceneMeshSnapshotANDROID יחד עם XrSceneMeshTrackingStateANDROID שעטופה במבנה XrSceneMeshSnapshotCreationResultANDROID. מבחינה טכנית, נקודת האחיזה היא תמונת מצב של נתוני רשת הסצנה בזמן היצירה. אפשר להשתמש בכינוי הזה כדי לבצע שאילתות על המידע והנתונים של רשת הסצנה באמצעות הפונקציות xrGetAllSubmeshStatesANDROID ו-xrGetSubmeshDataANDROID, בהתאמה.

XrResult xrCreateSceneMeshSnapshotANDROID(
    XrSceneMeshingTrackerANDROID                tracker,
    const XrSceneMeshSnapshotCreateInfoANDROID* createInfo,
    XrSceneMeshSnapshotCreationResultANDROID*   outSnapshotCreationResult);

תיאורי פרמטרים

איך מקבלים נתוני רשת של סצנה מתמונת מצב של רשת הסצנה

XrSceneSubmeshStateANDROID

XrSceneSubmeshStateANDROID מתאר רשת משנה. הוא מכיל את המידע הבסיסי על רשת המשנה (מזהה, תנוחה, גבולות, מועד העדכון האחרון).

typedef struct XrSceneSubmeshStateANDROID {
    XrStructureType    type;
    void*              next;
    XrUuid             submeshId;
    XrTime             lastUpdatedTime;
    XrPosef            submeshPoseInBaseSpace;
    XrExtent3Df        bounds;
} XrSceneSubmeshStateANDROID;

תיאורי חברים

  • type הוא XrStructureType של המבנה הזה.
  • next הוא NULL או מצביע למבנה הבא בשרשרת של מבנים. לא מוגדרים מבנים כאלה ב-OpenXR הבסיסי או בתוסף הזה.
  • submeshId הוא XrUuid שמזהה את רשת המשנה.
  • lastUpdatedTime הוא XrTime שמייצג את הזמן שבו עודכן לאחרונה רכיב המשנה.
  • submeshPoseInBaseSpace הוא XrPosef שמייצג את התנוחה של רשת המשנה במרחב הבסיסי ששימש ליצירת ה-snapshot של רשת הסצנה. זו גם התנוחה של מרכז התיבה התוחמת של רשת המשנה.
  • bounds הוא XrExtent3Df שמתאר את המידות של התיבה התוחמת שמקיפה את רשת המשנה. התיחום הזה נמצא במרחב הבסיס ששימש ליצירת נקודת האחיזה של רשת הסצנה.

xrGetAllSubmeshStatesANDROID

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

XrResult xrGetAllSubmeshStatesANDROID(
    XrSceneMeshSnapshotANDROID            snapshot,
    uint32_t                              submeshStateCapacityInput,
    uint32_t*                             submeshStateCountOutput,
    XrSceneSubmeshStateANDROID*           submeshStates);

תיאורי פרמטרים

  • snapshot הוא מאחזת XrSceneMeshSnapshotANDROID שנוצרה קודם באמצעות xrCreateSceneMeshSnapshotANDROID.
  • submeshStateCapacityInput הוא האורך של submeshStates.
  • submeshStateCountOutput הוא מספר הרכיבים ב-submeshStates שמשתנים על ידי זמן הריצה החל מתחילת המערך.
  • submeshStates הוא מערך של מבני XrSceneSubmeshStateANDROID שאליהם זמן הריצה יוציא את המצב של כל רשתות המשנה ברשת הסצנה.

XrSceneSubmeshDataANDROID

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

typedef struct XrSceneSubmeshDataANDROID {
    XrStructureType    type;
    const void*        next;
    XrUuid             submeshId;
    uint32_t           vertexCapacityInput;
    uint32_t           vertexCountOutput;
    XrVector3f*        vertexPositions;
    XrVector3f*        vertexNormals;
    uint8_t*           vertexSemantics;
    uint32_t           indexCapacityInput;
    uint32_t           indexCountOutput;
    uint32_t*          indices;
} XrSceneSubmeshDataANDROID;

תיאורי חברים

  • type הוא XrStructureType של המבנה הזה.
  • next הוא NULL או מצביע למבנה הבא בשרשרת של מבנים. לא מוגדרים מבנים כאלה ב-OpenXR הבסיסי או בתוסף הזה.
  • submeshId הוא XrUuid שמזהה את רשת המשנה.
  • vertexCapacityInput הוא האורך של vertexPositions,‏ vertexNormals ו-vertexSemantics.
  • vertexCountOutput הוא מספר הרכיבים ב-vertexPositions, ב-vertexNormals וב-vertexSemantics ששונו על ידי זמן הריצה החל מתחילת המערך.
  • vertexPositions הוא מערך של XrVector3f שהסביבה בזמן הריצה תוציא אליו את מיקומי הקודקודים של רשת המשנה.
  • vertexNormals הוא מערך של XrVector3f שהסביבה בזמן הריצה תוציא אליו את הנורמלים של הקודקודים של רשת המשנה. אפשר להשאיר את השדה הזה ריק NULL אם האפליקציה יצרה כלי מעקב עם השבתה של הנורמלים.
  • vertexSemantics היא מערך של uint8_t שאליו זמן הריצה יוציא את הסמנטיקה של הקודקודים של רשת המשנה. אפשר להשאיר את השדה הזה ריק NULL אם האפליקציה יצרה כלי מעקב עם XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID תווית סמנטית מוגדרת.
  • indexCapacityInput הוא האורך של indices.
  • indexCountOutput הוא מספר הרכיבים ב-indices שעברו שינוי בזמן הריצה, החל מתחילת המערך.
  • indices הוא מערך של uint32_t שאליו זמן הריצה יוציא את האינדקסים של רשת המשנה.

xrGetSubmeshDataANDROID

האפליקציה יכולה להשתמש בפונקציה xrGetSubmeshDataANDROID כדי לקבל את הנתונים של רשימה נבחרת של רשתות משנה. אפשר להשתמש בפונקציה הזו בביטוי של 2 קריאות. בשיחה הראשונה, האפליקציה חייבת להגדיר מזהה תקף של רשת משנה (כלומר: ניתן לאחזר מ-xrGetAllSubmeshStatesANDROID עם אותו צילום מצב של רשת הסצנה) וקיבולת אפס לכל רכיב ברשימה הנבחרת של רשתות המשנה כדי לקבל את הגדלים של המאגרים שנדרשים לנתוני רשת המשנה. בשיחה השנייה, האפליקציה חייבת להגדיר את מצביעי המאגר למאגר שהוקצה לכל רכיב ברשימת המשנה שנבחרה, יחד עם הקיבולת של המאגרים, כדי לקבל את הנתונים של רשתות המשנה.

XrResult xrGetSubmeshDataANDROID(
    XrSceneMeshSnapshotANDROID            snapshot,
    uint32_t                              submeshDataCount,
    XrSceneSubmeshDataANDROID*            inoutSubmeshData);

תיאורי פרמטרים

XrSceneMeshSemanticLabelANDROID

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

typedef enum XrSceneMeshSemanticLabelANDROID {
    XR_SCENE_MESH_SEMANTIC_LABEL_OTHER_ANDROID = 0,
    XR_SCENE_MESH_SEMANTIC_LABEL_FLOOR_ANDROID = 1,
    XR_SCENE_MESH_SEMANTIC_LABEL_CEILING_ANDROID = 2,
    XR_SCENE_MESH_SEMANTIC_LABEL_WALL_ANDROID = 3,
    XR_SCENE_MESH_SEMANTIC_LABEL_TABLE_ANDROID = 4,
    XR_SCENE_MESH_SEMANTIC_LABEL_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshSemanticLabelANDROID;

מחיקת תמונת מצב של רשת סצנה

xrDestroySceneMeshSnapshotANDROID

האפליקציה יכולה להשתמש בפונקציה xrDestroySceneMeshSnapshotANDROID כדי להרוס תמונה של רשת סצנה. אחרי שהידית נמחקת, האפליקציה לא יכולה יותר להשתמש בה כדי לקבל את המידע או הנתונים של רשת המשנה. ה-handle נמחק אוטומטית כשה-tracker נמחק, כי ה-handle של ה-tracker הוא ההורה של ה-handle של תמונת הרשת של הסצנה.

XrResult xrDestroySceneMeshSnapshotANDROID(
    XrSceneMeshSnapshotANDROID            snapshot);

תיאורי פרמטרים

קוד לדוגמה ליצירת רשת של סצנה

הקוד לדוגמה הבא מראה איך לגשת לנתוני רשת של סצנה לצורך עיבוד.

XrInstance instance;  // Created at app startup
XrSystemId systemId;  // Received from xrGetSystem() at app startup
XrSession session;    // Created at app startup
XrSpace appPlaySpace; // Created at app startup

// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateSceneMeshingTrackerANDROID xrCreateSceneMeshingTrackerANDROID;
PFN_xrDestroySceneMeshingTrackerANDROID xrDestroySceneMeshingTrackerANDROID;
PFN_xrEnumerateSupportedSemanticLabelSetsANDROID xrEnumerateSupportedSemanticLabelSetsANDROID;
PFN_xrCreateSceneMeshSnapshotANDROID xrCreateSceneMeshSnapshotANDROID;
PFN_xrDestroySceneMeshSnapshotANDROID xrDestroySceneMeshSnapshotANDROID;
PFN_xrGetAllSubmeshStatesANDROID xrGetAllSubmeshStatesANDROID;
PFN_xrGetSubmeshDataANDROID xrGetSubmeshDataANDROID;

// Inspect system capability
XrSystemSceneMeshingPropertiesANDROID sceneMeshingProps = {
  .type = XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID,
};
XrSystemProperties sysProps = {
  .type = XR_TYPE_SYSTEM_PROPERTIES,
  .next = &sceneMeshingProps
};
CHK_XR(xrGetSystemProperties(instance, systemId, &sysProps));
if (!sceneMeshingProps.supportsSceneMeshing) {
    // scene meshing is not supported.
    return;
}

uint32_t supportedsemanticLabelSetsCount = 0;
xrEnumerateSupportedSemanticLabelSetsANDROID(
  instance, systemId, 0, &supportedsemanticLabelSetsCount, nullptr);
std::vector<XrSceneMeshSemanticLabelSetANDROID> supportedSemanticLabelSets(
  supportedsemanticLabelSetsCount);
xrEnumerateSupportedSemanticLabelSetsANDROID(
  instance, systemId, supportedsemanticLabelSetsCount,
  &supportedsemanticLabelSetsCount, supportedSemanticLabelSets.data());

XrSceneMeshSemanticLabelSetANDROID semanticLabelSet = XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID;
// Check if system supports XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID
if (std::find(supportedSemanticLabelSets.begin(), supportedSemanticLabelSets.end(),
              XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID) !=
    supportedSemanticLabelSets.end()) {
  semanticLabelSet = XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID;
}

XrSceneMeshingTrackerCreateInfoANDROID trackerCreateInfo = {
  .type = XR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROID,
  .semanticLabelSet = semanticLabelSet,
  .enableNormals = XR_TRUE
};

XrSceneMeshingTrackerANDROID tracker = XR_NULL_HANDLE;
CHK_XR(xrCreateSceneMeshingTrackerANDROID(session, &trackerCreateInfo, &tracker));

XrSceneMeshSnapshotCreationResultANDROID snapshotResult = {
  .type = XR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROID,
  .snapshot = XR_NULL_HANDLE
};
XrSceneMeshSnapshotANDROID& snapshot = snapshotResult.snapshot;
XrSceneMeshSnapshotCreateInfoANDROID createInfo = {
  .type = XR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROID
};

// app update loop
while (true) {
  // ...
  // For every frame in frame loop
  // ...

  XrFrameState frameState; // previously returned from xrWaitFrame
  const XrTime time = frameState.predictedDisplayTime;
  XrBoxf box; // populated with the bounding box of the camera frustum

  // ...

  createInfo.baseSpace = appPlaySpace;
  createInfo.time = time;
  createInfo.boundingBox = box;

  // Grab the scene mesh snapshot. This way the app can: know all of the submesh infos,
  // choose the appropriate submeshes for which to get data, allocate the necessary
  // buffer for those submeshes, and then get the data.
  CHK_XR(xrCreateSceneMeshSnapshotANDROID(tracker, &createInfo, &snapshotResult));

  // check the tracking state
  if (snapshotResult.trackingState == XR_SCENE_MESH_TRACKING_STATE_ERROR_ANDROID) {
    // unrecoverable error. Exit the app.
    if (snapshot != XR_NULL_HANDLE) {
      CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
      snapshot = XR_NULL_HANDLE;
    }
    break;
  } else if (snapshotResult.trackingState != XR_SCENE_MESH_TRACKING_STATE_TRACKING_ANDROID) {
    // The tracker is not tracking. Try again later.
    if (snapshot != XR_NULL_HANDLE) {
      CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
      snapshot = XR_NULL_HANDLE;
    }
    continue;
  }

  // 2-call idiom for getting submesh states
  std::vector<XrSceneSubmeshStateANDROID> states;
  uint32_t submeshCount = 0;
  CHK_XR(xrGetAllSubmeshStatesANDROID(snapshot, 0, &submeshCount, nullptr));
  states.resize(submeshCount);
  for (XrSceneSubmeshStateANDROID& state : states) {
    state = {.type = XR_TYPE_SCENE_SUBMESH_STATE_ANDROID};
  }
  CHK_XR(xrGetAllSubmeshStatesANDROID(snapshot, submeshCount, &submeshCount, states.data()));

  // To store the poses for the selected submeshes
  std::vector<XrPosef> submeshesPoses;
  submeshesPoses.reserve(submeshCount);

  std::vector<XrSceneSubmeshDataANDROID> submeshes;
  submeshes.reserve(submeshCount);
  // Iterate the states and determine which submeshes the app wants data for
  for (XrSceneSubmeshStateANDROID& state : states) {
    // Modify this bool as necessary by looking at states. Maybe state.lastUpdatedTime
    // is below a threshold or maybe the bounding box does not intersect with camera view
    // frustum (The submesh will be culled).
    bool needed;
    if (needed) {
      // Add the selected submesh to the submeshes list. Set the capacity
      // zero for now since the size of the buffer will be determined later.
      XrSceneSubmeshDataANDROID submesh = {
        .type = XR_TYPE_SCENE_SUBMESH_DATA_ANDROID,
        .submeshId = state.submeshId,
        .vertexCapacityInput = 0,
        .vertexCountOutput = 0,
        .vertexPositions = nullptr,
        .vertexNormals = nullptr,
        .vertexSemantics = nullptr,
        .indexCapacityInput = 0,
        .indexCountOutput = 0,
        .indices = nullptr,
      };
      submeshes.push_back(submesh);
      submeshesPoses.push_back(state.submeshPoseInBaseSpace);
    }
  }

  // Grab the data for the selected submeshes using the 2-call idiom.
  CHK_XR(xrGetSubmeshDataANDROID(snapshot, submeshes.size(), submeshes.data()));
  for (XrSceneSubmeshDataANDROID& submesh : submeshes) {
    submesh.vertexCapacityInput = submesh.vertexCountOutput;
    submesh.vertexCountOutput = 0;
    submesh.vertexPositions = new XrVector3f[submesh.vertexCountOutput];
    submesh.vertexNormals = new XrVector3f[submesh.vertexCountOutput];
    submesh.vertexSemantics = new uint8_t[submesh.vertexCountOutput];
    submesh.indexCapacityInput = submesh.indexCountOutput;
    submesh.indexCountOutput = 0;
    submesh.indices = new uint32_t[submesh.indexCountOutput];
  }
  CHK_XR(xrGetSubmeshDataANDROID(snapshot, submeshes.size(), submeshes.data()));

  // Destroy the scene mesh snapshot since we have finally grabbed the submeshes data. In
  // next iteration app can: create a new one to get latest mesh data
  CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
  snapshot = XR_NULL_HANDLE;

  // Iterate the submeshes and get the vertex positions, vertex normals and
  // vertex semantics data for the selected submeshes
  for (uint32_t i = 0; i < submeshes.size(); i++) {
    XrSceneSubmeshDataANDROID& data = submeshes[i];
    XrVector3f* vertexPositions = data.vertexPositions;
    XrVector3f* vertexNormals = data.vertexNormals;
    XrSceneMeshSemanticLabelANDROID* vertexSemantics =
      reinterpret_cast<XrSceneMeshSemanticLabelANDROID*>(data.vertexSemantics);
    XrPosef pose = submeshesPoses[i];

    // *** Use the data as per needs ***

    // Release the allocated memory for the data buffers when done using
    delete [] data.vertexPositions;
    delete [] data.vertexNormals;
    delete [] data.vertexSemantics;
    delete [] data.indices;
  }

  // ...
  // Finish frame loop
  // ...
}

CHK_XR(xrDestroySceneMeshingTrackerANDROID(tracker));

סוגי אובייקטים חדשים

New Enum Constants

הספירה XrObjectType הורחבה עם:

  • XR_OBJECT_TYPE_SCENE_MESHING_TRACKER_ANDROID
  • XR_OBJECT_TYPE_SCENE_MESH_SNAPSHOT_ANDROID

הספירה XrStructureType הורחבה עם:

  • XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
  • XR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROID
  • XR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROID
  • XR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROID
  • XR_TYPE_SCENE_SUBMESH_STATE_ANDROID
  • XR_TYPE_SCENE_SUBMESH_DATA_ANDROID

New Enums

מבנים חדשים

פונקציות חדשות

בעיות

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

  • גרסה 3, ‏ 2025-05-15 (סלאר חאן) ** תיאור ראשוני של התוסף

‫OpenXR™‎ והלוגו של OpenXR הם סימנים מסחריים בבעלות The Khronos Group Inc. ‎ והם רשומים כסימן מסחרי בסין, באיחוד האירופי, ביפן ובבריטניה.