XR_ANDROID_scene_meshing

Name String

XR_ANDROID_scene_meshing

ประเภทส่วนขยาย

ส่วนขยายอินสแตนซ์

หมายเลขต่อที่ลงทะเบียนไว้

719

การแก้ไข

3

สถานะการให้สัตยาบัน

ไม่ได้รับการให้สัตยาบัน

ทรัพยากร Dependency ของส่วนขยายและเวอร์ชัน

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

ภาพรวม

ส่วนขยายนี้มีไว้เพื่อแสดง Mesh ที่แสดงถึงวัตถุจริงในสภาพแวดล้อมของผู้ใช้โดยประมาณ

แอปพลิเคชันสามารถใช้ส่วนขยายนี้เพื่อแสดงภาพฉากและอนุญาตให้วัตถุเสมือนโต้ตอบกับวัตถุจริง เช่น การชนกัน

ข้อมูลเมชฉากจะสร้างขึ้นโดยรันไทม์และแชร์กับแอปพลิเคชันโดยใช้ XrSceneMeshingTrackerANDROID และ XrSceneMeshSnapshotANDROID แอปพลิเคชันสามารถเข้าถึงค่าในข้อมูลซับเมชของฉากผ่าน XrSceneSubmeshStateANDROID ที่แสดงผลจาก xrGetAllSubmeshStatesANDROID แอปพลิเคชันสามารถเข้าถึงค่าในข้อมูลซับเมชของฉากผ่าน XrSceneSubmeshDataANDROID ที่แสดงผลจาก xrGetSubmeshDataANDROID

ข้อมูลการสร้างเมชฉากเป็นข้อมูลส่วนบุคคลที่ละเอียดอ่อนและเชื่อมโยงอย่างใกล้ชิดกับความเป็นส่วนตัวและความสมบูรณ์ของข้อมูลส่วนบุคคล ขอแนะนำอย่างยิ่งให้แอปพลิเคชันที่จัดเก็บหรือโอนข้อมูลการสร้างเมชของฉากขอให้ผู้ใช้ยอมรับอย่างชัดเจนและเฉพาะเจาะจงเสมอเพื่อดำเนินการดังกล่าว

สิทธิ์

แอปพลิเคชัน Android ต้องมีสิทธิ์ android.permission.SCENE_UNDERSTANDING_FINE แสดงอยู่ในไฟล์ Manifest สิทธิ์ android.permission.SCENE_UNDERSTANDING_FINE ถือเป็นสิทธิ์ที่มีความละเอียดอ่อนเนื่องจากอนุญาตให้รันไทม์ศึกษาสภาพแวดล้อมของผู้ใช้

แอปพลิเคชันต้องขอสิทธิ์ที่รันไทม์เพื่อใช้ฟังก์ชันต่อไปนี้

(ระดับการป้องกัน: อันตราย)

ตรวจสอบความสามารถของระบบ

โครงสร้าง XrSystemSceneMeshingPropertiesANDROID มีคำจำกัดความดังนี้

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

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • supportsSceneMeshing เป็น XrBool32 ซึ่งระบุว่าระบบรองรับการสร้างเมชฉากหรือไม่

แอปพลิเคชันสามารถตรวจสอบว่าระบบสามารถสร้างเมชฉากได้หรือไม่โดยเชื่อมโยงโครงสร้าง XrSystemSceneMeshingPropertiesANDROID กับ XrSystemProperties เมื่อเรียกใช้ xrGetSystemProperties

หากรันไทม์แสดงผล XR_FALSE สำหรับ supportsSceneMeshing แสดงว่าระบบไม่รองรับการสร้างเมชฉาก ดังนั้นจึงต้องแสดงผล XR_ERROR_FEATURE_UNSUPPORTED จาก xrCreateSceneMeshingTrackerANDROID แอปพลิเคชันควรหลีกเลี่ยงการใช้ฟังก์ชันการสร้างเมชฉากเมื่อ supportsSceneMeshing เป็น XR_FALSE

หากรันไทม์แสดงผล XR_TRUE สำหรับ supportsSceneMeshing แสดงว่าระบบรองรับการสร้างเมชฉาก

การใช้งานที่ถูกต้อง (โดยนัย)

การแจงนับ XrSceneMeshSemanticLabelSetANDROID อธิบายชุดป้ายกำกับความหมายสำหรับการสร้าง Mesh ของฉาก ค่าแต่ละค่าใน 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_DEFAULT2_ANDROID = 1000801000,
    XR_SCENE_MESH_SEMANTIC_LABEL_SET_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshSemanticLabelSetANDROID;

ค่าการแจงนับมีความหมายดังต่อไปนี้

คำอธิบาย Enum

XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID

ชุดป้ายกำกับความหมายนี้แสดงถึงการไม่มีป้ายกำกับความหมาย

XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID

ชุดป้ายกำกับความหมายนี้แสดงถึง XrSceneMeshSemanticLabelANDROID

XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT2_ANDROID

ชุดป้ายกำกับความหมายนี้แสดงถึง XrSceneMeshSemanticLabel2ANDROID (เพิ่มโดยส่วนขยาย XR_ANDROID_scene_meshing_semantic_label2)

ฟังก์ชัน xrEnumerateSupportedSemanticLabelSetsANDROID มีคำจำกัดความดังนี้

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

คำอธิบายพารามิเตอร์

  • instance คือ XrInstance ที่สร้างโดยแอปพลิเคชัน
  • systemId คือ XrSystemId ที่ลองใหม่จาก xrGetSystem
  • supportedSemanticLabelSetsInputCapacity คือความจุของ supportedSemanticLabelSets หรือ 0 เพื่อดึงข้อมูลความจุที่จำเป็น
  • supportedSemanticLabelSetsOutputCount คือตัวชี้ไปยังจำนวนของ supportedSemanticLabelSets ที่เขียน หรือตัวชี้ไปยังความจุที่จำเป็นในกรณีที่ supportedSemanticLabelSetsInputCapacity ไม่เพียงพอ
  • supportedSemanticLabelSets เป็นตัวชี้ไปยังอาร์เรย์ของ XrSceneMeshSemanticLabelSetANDROID สามารถเป็น NULL ได้หาก supportedSemanticLabelSetsInputCapacity เป็น 0
  • ดูคำอธิบายโดยละเอียดเกี่ยวกับการดึงข้อมูลขนาด supportedSemanticLabelSets ที่จำเป็นได้ในบทพารามิเตอร์ขนาดบัฟเฟอร์

แอปพลิเคชันสามารถแจกแจงชุดป้ายกำกับเชิงความหมายที่ระบบรองรับได้โดยใช้ฟังก์ชัน xrEnumerateSupportedSemanticLabelSetsANDROID

ทุกระบบต้องรองรับ XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID เป็นอย่างน้อย เนื่องจากค่า enum นี้แสดงถึงชุดป้ายกำกับเชิงความหมายที่ไม่มี และสามารถใช้ได้ในกรณีที่แอปพลิเคชันไม่จำเป็นต้องใช้ความหมายของจุดยอด

การใช้งานที่ถูกต้อง (โดยนัย)

  • ต้องเปิดใช้ส่วนขยาย XR_ANDROID_scene_meshing ก่อนเรียกใช้ xrEnumerateSupportedSemanticLabelSetsANDROID
  • instance ต้องเป็นแฮนเดิล XrInstance ที่ถูกต้อง
  • supportedSemanticLabelSetsOutputCount ต้องเป็นตัวชี้ไปยังค่า uint32_t
  • หาก supportedSemanticLabelSetsInputCapacity ไม่ใช่ 0 supportedSemanticLabelSets ต้องเป็นพอยเตอร์ไปยังอาร์เรย์ของค่า supportedSemanticLabelSetsInputCapacity XrSceneMeshSemanticLabelSetANDROID

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_SYSTEM_INVALID
  • XR_ERROR_VALIDATION_FAILURE

สร้างแฮนเดิลเครื่องมือติดตามการสร้างเมชของฉาก

XR_DEFINE_HANDLE(XrSceneMeshingTrackerANDROID)

แฮนเดิล XrSceneMeshingTrackerANDROID แสดงถึงเครื่องมือติดตามการสร้างเมชฉากสำหรับการสร้างเมชฉากและการจัดการแหล่งข้อมูลที่เกี่ยวข้อง

แฮนเดิลนี้สามารถใช้เพื่อสร้างสแนปชอตเมชฉากโดยใช้ xrCreateSceneMeshSnapshotANDROID ในส่วนขยายนี้

ฟังก์ชัน xrCreateSceneMeshingTrackerANDROID มีคำจำกัดความดังนี้

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

คำอธิบายพารามิเตอร์

  • session คือ XrSession ที่เครื่องมือติดตามการสร้างเมชฉากจะทำงาน
  • createInfo เป็นตัวชี้ไปยังโครงสร้าง XrSceneMeshingTrackerCreateInfoANDROID ที่ใช้อธิบายเครื่องมือติดตามการสร้างเมชของฉากที่จะสร้าง
  • tracker คือแฮนเดิล XrSceneMeshingTrackerANDROID ที่แสดงผล

แอปพลิเคชันสามารถสร้างแฮนเดิล XrSceneMeshingTrackerANDROID โดยใช้ฟังก์ชัน xrCreateSceneMeshingTrackerANDROID

หากระบบไม่รองรับการสร้างเมชฉาก รันไทม์ต้องแสดงผล XR_ERROR_FEATURE_UNSUPPORTED จาก xrCreateSceneMeshingTrackerANDROID ในกรณีนี้ รันไทม์ต้องแสดงผล XR_FALSE สำหรับ XrSystemSceneMeshingPropertiesANDROID :: supportsSceneMeshing เมื่อมีการเรียกใช้ฟังก์ชัน xrGetSystemProperties เพื่อให้แอปพลิเคชันสามารถหลีกเลี่ยงการสร้างเครื่องมือติดตามการสร้างเมชของฉากได้

แอปพลิเคชันต้องใช้เฉพาะชุดป้ายกำกับเชิงความหมายที่ระบบรองรับใน XrSceneMeshingTrackerCreateInfoANDROID :: semanticLabelSet เมื่อสร้างเครื่องมือติดตามการสร้าง Meshing ของฉาก หากแอปพลิเคชันใช้ชุดป้ายกำกับความหมายของจุดยอดของเมชฉากที่ไม่รองรับ รันไทม์ต้องแสดงผล XR_ERROR_FEATURE_UNSUPPORTED จาก xrCreateSceneMeshingTrackerANDROID

แอปพลิเคชันสามารถแจกแจงรายการชุดป้ายกำกับเชิงความหมายที่รองรับได้ด้วยฟังก์ชัน xrEnumerateSupportedSemanticLabelSetsANDROID

แฮนเดิล xrCreateSceneMeshingTrackerANDROID เป็นเจ้าของทรัพยากรทั้งหมดสำหรับการสร้างเมชฉาก เมื่อเสร็จสิ้นการใช้งานการสร้างเมชฉากแล้ว แอปพลิเคชันต้องทำลายแฮนเดิลผ่านฟังก์ชัน xrDestroySceneMeshingTrackerANDROID

การใช้งานที่ถูกต้อง (โดยนัย)

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ความล้มเหลว

  • XR_ERROR_FEATURE_UNSUPPORTED
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_VALIDATION_FAILURE

โครงสร้าง XrSceneMeshingTrackerCreateInfoANDROID มีคำจำกัดความดังนี้

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 ที่ใช้ระบุว่าจะรวมเวกเตอร์ปกติของเวอร์เท็กซ์สำหรับเวอร์เท็กซ์ของ Mesh ในบัฟเฟอร์ Mesh ของฉากหรือไม่เมื่อรับข้อมูล Mesh ของฉาก

โครงสร้าง XrSceneMeshingTrackerCreateInfoANDROID อธิบายข้อมูลเพื่อสร้างแฮนเดิล XrSceneMeshingTrackerANDROID

การใช้งานที่ถูกต้อง (โดยนัย)

ฟังก์ชัน xrDestroySceneMeshingTrackerANDROID มีคำจำกัดความดังนี้

XrResult xrDestroySceneMeshingTrackerANDROID(
    XrSceneMeshingTrackerANDROID                tracker);

คำอธิบายพารามิเตอร์

ฟังก์ชัน xrDestroySceneMeshingTrackerANDROID จะปล่อย tracker และทรัพยากรที่เกี่ยวข้องเมื่อเสร็จสิ้นประสบการณ์การสร้างเมชของฉาก

การใช้งานที่ถูกต้อง (โดยนัย)

ความปลอดภัยของชุดข้อความ

  • การเข้าถึง tracker และแฮนเดิลย่อยต้องซิงค์กับภายนอก

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_RUNTIME_FAILURE

สร้างแฮนเดิลสแนปชอตเมชของฉาก

XR_DEFINE_HANDLE(XrSceneMeshSnapshotANDROID)

แฮนเดิล XrSceneMeshSnapshotANDROID แสดงถึงสแนปชอตเมชฉาก ภาพรวมนี้สร้างขึ้นโดยใช้ xrCreateSceneMeshSnapshotANDROID ซึ่งจะจับภาพรวมของข้อมูลเมชฉาก ณ เวลาที่มีการเรียกใช้ฟังก์ชัน

แฮนเดิลนี้สามารถใช้เพื่อดึงข้อมูลและข้อมูล Submesh โดยใช้ xrGetAllSubmeshStatesANDROID และ xrGetSubmeshDataANDROID

ฟังก์ชัน xrCreateSceneMeshSnapshotANDROID มีคำจำกัดความดังนี้

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

คำอธิบายพารามิเตอร์

  • tracker คือแฮนเดิล XrSceneMeshingTrackerANDROID ที่สร้างไว้ก่อนหน้านี้ด้วย xrCreateSceneMeshingTrackerANDROID
  • createInfo เป็นตัวชี้ไปยังโครงสร้าง XrSceneMeshSnapshotCreateInfoANDROID ซึ่งมีข้อมูลที่จำเป็นในการสร้างสแนปชอตเมชของฉาก
  • outSnapshotCreationResult เป็นตัวชี้ไปยังออบเจ็กต์ XrSceneMeshSnapshotCreationResultANDROID ซึ่งรันไทม์จะสร้างขึ้นพร้อมผลลัพธ์การสร้างสแนปชอต

แอปพลิเคชันสามารถใช้ฟังก์ชัน xrCreateSceneMeshSnapshotANDROID เพื่อสร้างสแนปชอตเมชฉากจากเครื่องมือติดตามการสร้างเมชฉาก ฟังก์ชันนี้จะแสดงผลแฮนเดิล XrSceneMeshSnapshotANDROID พร้อมกับ XrSceneMeshTrackingStateANDROID ที่รวมอยู่ในโครงสร้าง XrSceneMeshSnapshotCreationResultANDROID แฮนเดิลเป็นภาพรวมของข้อมูลเมชฉาก ณ เวลาที่สร้างในทางเทคนิค แฮนเดิลนี้สามารถใช้เพื่อค้นหาข้อมูลและข้อมูลเมชของฉากได้โดยใช้ xrGetAllSubmeshStatesANDROID และ xrGetSubmeshDataANDROID ตามลำดับ

การใช้งานที่ถูกต้อง (โดยนัย)

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_POSE_INVALID
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_TIME_INVALID

โครงสร้าง XrSceneMeshSnapshotCreateInfoANDROID มีคำจำกัดความดังนี้

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

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • baseSpace คือ XrSpace ที่แสดงข้อมูลท่าทางของซับเมชฉาก
  • time คือ XrTime ที่อธิบายเวลาที่จะประมวลผลหรือแสดงเมชฉาก โดยปกติจะเป็น XrFrameState :: predictedDisplayTime
  • boundingBox คือ XrBoxf ที่อธิบายกรอบล้อมรอบที่จะรับเมชฉาก

โครงสร้าง XrSceneMeshSnapshotCreateInfoANDROID อธิบายข้อมูลเพื่อสร้างแฮนเดิล XrSceneMeshSnapshotANDROID

การใช้งานที่ถูกต้อง (โดยนัย)

โครงสร้าง XrSceneMeshSnapshotCreationResultANDROID มีคำจำกัดความดังนี้

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

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • snapshot คือแฮนเดิล XrSceneMeshSnapshotANDROID ที่สร้างโดยรันไทม์
  • trackingState คือ XrSceneMeshTrackingStateANDROID ที่อธิบายสถานะของเครื่องมือติดตามการสร้างเมชฉาก ณ เวลาที่สร้างสแนปชอต

โครงสร้าง XrSceneMeshSnapshotCreationResultANDROID จะจัดเก็บผลลัพธ์ของการสร้างสแนปชอตเมชของฉากที่แสดงผลจาก xrCreateSceneMeshSnapshotANDROID

การใช้งานที่ถูกต้อง (โดยนัย)

การแจงนับ XrSceneMeshTrackingStateANDROID อธิบายสถานะการติดตามสำหรับเครื่องมือติดตามการสร้างเมชฉาก ค่าแต่ละค่าใน enum นี้แสดงถึงสถานะของเครื่องมือติดตามการสร้างเมชของฉาก

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;

ค่าการแจงนับมีความหมายดังต่อไปนี้

คำอธิบาย Enum

XR_SCENE_MESH_TRACKING_STATE_INITIALIZING_ANDROID

เครื่องมือติดตามยังไม่พร้อมให้ข้อมูล Mesh

XR_SCENE_MESH_TRACKING_STATE_TRACKING_ANDROID

อุปกรณ์ติดตามกำลังติดตามอยู่

XR_SCENE_MESH_TRACKING_STATE_WAITING_ANDROID

เครื่องมือติดตามกำลังรอการวัดที่ถูกต้องเพื่อผสานรวมนับตั้งแต่การอัปเดต Mesh ครั้งล่าสุด

XR_SCENE_MESH_TRACKING_STATE_ERROR_ANDROID

เครื่องมือติดตามไม่ได้รับการวัดที่ถูกต้องเป็นเวลาหลายรอบและอยู่ในสถานะข้อผิดพลาด

สถานะนี้เป็นเพียงข้อมูลเพิ่มเติมสำหรับแอปพลิเคชันเท่านั้น ในกรณีที่ไม่มีแหล่งที่มาอื่นๆ ของข้อผิดพลาด รันไทม์ต้องอนุญาตให้แอปพลิเคชันสร้างสแนปชอตและดึงข้อมูลจากสแนปชอตต่อไป ไม่ว่า XrSceneMeshTrackingStateANDROID ปัจจุบันของเครื่องมือติดตามจะเป็นอย่างไรก็ตาม หากสถานะไม่ใช่ XR_SCENE_MESH_TRACKING_STATE_TRACKING_ANDROID สแนปชอตอาจไม่เป็นปัจจุบันหรือว่างเปล่า

กำลังรับข้อมูลเมชฉากจากสแนปชอตเมชฉาก

ฟังก์ชัน xrGetAllSubmeshStatesANDROID มีคำจำกัดความดังนี้

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

คำอธิบายพารามิเตอร์

  • snapshot คือแฮนเดิล XrSceneMeshSnapshotANDROID ที่สร้างไว้ก่อนหน้านี้ด้วย xrCreateSceneMeshSnapshotANDROID
  • submeshStateCapacityInput คือความจุของ submeshStates หรือ 0 เพื่อดึงข้อมูลความจุที่จำเป็น
  • submeshStateCountOutput คือตัวชี้ไปยังจำนวนของ submeshStates ที่เขียน หรือตัวชี้ไปยังความจุที่จำเป็นในกรณีที่ submeshStateCapacityInput ไม่เพียงพอ
  • submeshStates เป็นตัวชี้ไปยังอาร์เรย์ของโครงสร้าง XrSceneSubmeshStateANDROID ซึ่งรันไทม์จะแสดงผลสถานะของเมชย่อยทั้งหมดในเมชฉาก สามารถเป็น NULL ได้หาก submeshStateCapacityInput เป็น 0
  • ดูคำอธิบายโดยละเอียดเกี่ยวกับการดึงข้อมูลขนาด submeshStates ที่จำเป็นได้ในบทพารามิเตอร์ขนาดบัฟเฟอร์

แอปพลิเคชันสามารถใช้ฟังก์ชัน xrGetAllSubmeshStatesANDROID เพื่อรับสถานะของซับเมชทั้งหมดในเมชฉาก ซึ่งมีข้อมูลพื้นฐานเพื่อให้แอปพลิเคชันเลือก Submesh ที่แอปพลิเคชันต้องการข้อมูลได้

การใช้งานที่ถูกต้อง (โดยนัย)

  • ต้องเปิดใช้ส่วนขยาย XR_ANDROID_scene_meshing ก่อนเรียกใช้ xrGetAllSubmeshStatesANDROID
  • snapshot ต้องเป็นแฮนเดิล XrSceneMeshSnapshotANDROID ที่ถูกต้อง
  • submeshStateCountOutput ต้องเป็นตัวชี้ไปยังค่า uint32_t
  • หาก submeshStateCapacityInput ไม่ใช่ 0 submeshStates ต้องเป็นพอยเตอร์ไปยังอาร์เรย์ของโครงสร้าง submeshStateCapacityInput XrSceneSubmeshStateANDROID

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_VALIDATION_FAILURE

โครงสร้าง XrSceneSubmeshStateANDROID มีคำจำกัดความดังนี้

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

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • submeshId คือ XrUuid ที่ระบุ Submesh
  • lastUpdatedTime คือ XrTime ที่แสดงเวลาที่มีการอัปเดต Submesh ครั้งล่าสุด
  • submeshPoseInBaseSpace คือ XrPosef ที่แสดงท่าทางของเมชย่อยในพื้นที่ฐานที่ใช้สร้างภาพรวมเมชของฉาก ท่าทางยังเป็นจุดศูนย์กลางของกรอบล้อมรอบ Submesh ด้วย
  • bounds คือ XrExtent3Df ที่อธิบายขนาดของกรอบล้อมรอบที่ล้อมรอบเมชย่อย ขอบเขตนี้กำหนดไว้ในพื้นที่ฐานที่ใช้สร้างแฮนเดิลเมชฉาก

รันไทม์จะพยายามอย่างเต็มที่เพื่อแมป submeshId กับขอบเขตของพื้นที่จริงที่เมชย่อยครอบครองอยู่ รันไทม์อาจสูญเสียการแมปนี้ได้ทุกเมื่อ และกำหนด UUID ใหม่ให้กับชุดย่อยของซับเมชที่ตรวจพบ โดยเฉพาะอย่างยิ่ง รันไทม์ไม่จำเป็นต้องใช้ UUID เดียวกันซ้ำสำหรับ Mesh เดียวกันในอินสแตนซ์แอปพลิเคชันที่ตามมา

การใช้งานที่ถูกต้อง (โดยนัย)

ฟังก์ชัน xrGetSubmeshDataANDROID มีคำจำกัดความดังนี้

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

คำอธิบายพารามิเตอร์

  • snapshot คือแฮนเดิล XrSceneMeshSnapshotANDROID ที่สร้างไว้ก่อนหน้านี้ด้วย xrCreateSceneMeshSnapshotANDROID
  • submeshDataCount คือความยาวของ inoutSubmeshData
  • inoutSubmeshData คืออาร์เรย์ที่จัดสรรโดยแอปพลิเคชันของ XrSceneSubmeshDataANDROID ซึ่งรันไทม์จะป้อนข้อมูลเมชที่เชื่อมโยงกับรหัสซับเมชที่ส่งใน XrSceneSubmeshDataANDROID :: submeshId ลงในแต่ละองค์ประกอบ

แอปพลิเคชันสามารถใช้ฟังก์ชัน xrGetSubmeshDataANDROID เพื่อรับกลุ่มของซับเมชหรือซับเมชทั้งหมดพร้อมกัน โดยส่งรายการ XrSceneSubmeshDataANDROID พร้อมกับ XrSceneSubmeshDataANDROID :: submeshId แต่ละรายการที่ตั้งค่าเป็นรหัสที่เกี่ยวข้องของซับเมชที่จะดึงข้อมูล

XrSceneSubmeshDataANDROID :: submeshId ต้องไม่ซ้ำกันสำหรับทุกองค์ประกอบใน inoutSubmeshData และเรียกข้อมูลได้โดย xrGetAllSubmeshStatesANDROID สำหรับ snapshot เดียวกัน หากรหัส Submesh ไม่ถูกต้องหรือมีองค์ประกอบมากกว่า 1 รายการใน inoutSubmeshData ที่มีรหัส Submesh เดียวกัน รันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE

submeshDataCount ต้องเท่ากับหรือน้อยกว่าค่าที่ xrGetAllSubmeshStatesANDROID :: submeshStateCountOutput แสดงผล ไม่เช่นนั้นรันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE

สามารถใช้ฟังก์ชันนี้ในสำนวนการเรียก 2 ครั้งเพื่อค้นหาจำนวนจุดยอดและดัชนีสำหรับซับเมชที่เลือกทั้งหมด

การใช้งานที่ถูกต้อง (โดยนัย)

  • ต้องเปิดใช้ส่วนขยาย XR_ANDROID_scene_meshing ก่อนเรียกใช้ xrGetSubmeshDataANDROID
  • snapshot ต้องเป็นแฮนเดิล XrSceneMeshSnapshotANDROID ที่ถูกต้อง
  • inoutSubmeshData ต้องเป็นพอยเตอร์ไปยังอาร์เรย์ของโครงสร้าง submeshDataCount XrSceneSubmeshDataANDROID
  • พารามิเตอร์ submeshDataCount ต้องมากกว่า 0

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_VALIDATION_FAILURE

โครงสร้าง XrSceneSubmeshDataANDROID มีคำจำกัดความดังนี้

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 ที่ระบุ Submesh
  • vertexCapacityInput คือความจุของ vertexPositions, vertexNormals และ vertexSemantics หรือ 0 เพื่อดึงข้อมูลความจุที่ต้องการ
  • vertexCountOutput คือตัวชี้ไปยังจำนวนของ vertexPositions, vertexNormals และ vertexSemantics ที่เขียน หรือตัวชี้ไปยังความจุที่จำเป็นในกรณีที่ vertexCapacityInput ไม่เพียงพอ
  • vertexPositions คืออาร์เรย์ของ XrVector3f ซึ่งรันไทม์จะแสดงผลตำแหน่งจุดยอดของ Submesh
  • vertexNormals คืออาร์เรย์ของ XrVector3f ซึ่งรันไทม์จะแสดงผลเวกเตอร์แนวฉากของจุดยอดของซับเมช สามารถเว้นช่องนี้เป็น NULL ได้หากแอปพลิเคชันสร้างเครื่องมือติดตามโดยปิดใช้เวกเตอร์ปกติ
  • vertexSemantics คืออาร์เรย์ของ uint8_t ซึ่งรันไทม์จะแสดงผลความหมายของจุดยอดของซับเมช ช่องนี้สามารถเว้นว่างเป็น NULL ได้หากแอปพลิเคชันสร้างเครื่องมือติดตามที่มีชุดป้ายกำกับความหมาย XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
  • indexCapacityInput คือความจุของ indices หรือ 0 เพื่อดึงข้อมูลความจุที่จำเป็น
  • indexCountOutput คือตัวชี้ไปยังจำนวนของ indices ที่เขียน หรือตัวชี้ไปยังความจุที่จำเป็นในกรณีที่ vertexCapacityInput ไม่เพียงพอ
  • indices คืออาร์เรย์ของ uint32_t ซึ่งรันไทม์จะแสดงผลดัชนีของซับเมช
  • ดูคำอธิบายโดยละเอียดเกี่ยวกับการดึงข้อมูลขนาด vertexPositions, vertexNormals, vertexSemantics และ indices ที่จำเป็นได้ในบทพารามิเตอร์ขนาดบัฟเฟอร์

การใช้งานที่ถูกต้อง (โดยนัย)

  • ต้องเปิดใช้ส่วนขยาย XR_ANDROID_scene_meshing ก่อนใช้ XrSceneSubmeshDataANDROID
  • type ต้องเป็น XR_TYPE_SCENE_SUBMESH_DATA_ANDROID
  • next ต้องเป็น NULL หรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
  • หาก vertexCapacityInput ไม่ใช่ 0 vertexPositions ต้องเป็นพอยเตอร์ไปยังอาร์เรย์ของโครงสร้าง vertexCapacityInput XrVector3f
  • หาก vertexCapacityInput ไม่ใช่ 0 vertexNormals ต้องเป็นพอยเตอร์ไปยังอาร์เรย์ของโครงสร้าง vertexCapacityInput XrVector3f
  • หาก vertexCapacityInput ไม่ใช่ 0 vertexSemantics ต้องเป็นพอยน์เตอร์ไปยังอาร์เรย์ของค่า vertexCapacityInput uint8_t
  • หาก indexCapacityInput ไม่ใช่ 0 indices ต้องเป็นพอยน์เตอร์ไปยังอาร์เรย์ของค่า indexCapacityInput uint32_t

การแจงนับ XrSceneMeshSemanticLabelANDROID คือชุดป้ายกำกับเชิงความหมายเริ่มต้นที่สามารถใช้เพื่อติดป้ายกำกับจุดยอดของ Mesh เพื่ออธิบายว่าจุดยอดของ Mesh อยู่บนพื้นผิวสภาพแวดล้อมทางกายภาพใด ชุด 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;

Enum มีความหมายดังนี้

คำอธิบาย Enum

XR_SCENE_MESH_SEMANTIC_LABEL_OTHER_ANDROID

ป้ายกำกับเชิงความหมายนี้บ่งบอกว่าองค์ประกอบ Mesh ที่เกี่ยวข้องแสดงถึงวัตถุที่ไม่รู้จัก

XR_SCENE_MESH_SEMANTIC_LABEL_FLOOR_ANDROID

ป้ายกำกับเชิงความหมายนี้ระบุว่าองค์ประกอบ Mesh ที่เกี่ยวข้องแสดงถึงพื้น

XR_SCENE_MESH_SEMANTIC_LABEL_CEILING_ANDROID

ป้ายกำกับเชิงความหมายนี้ระบุว่าองค์ประกอบ Mesh ที่เกี่ยวข้องแสดงถึงเพดาน

XR_SCENE_MESH_SEMANTIC_LABEL_WALL_ANDROID

ป้ายกำกับเชิงความหมายนี้บ่งบอกว่าองค์ประกอบ Mesh ที่เกี่ยวข้องแสดงถึงผนัง

XR_SCENE_MESH_SEMANTIC_LABEL_TABLE_ANDROID

ป้ายกำกับเชิงความหมายนี้ระบุว่าองค์ประกอบ Mesh ที่เกี่ยวข้องแสดงถึงตาราง

ทำลายสแนปชอตเมชของฉาก

ฟังก์ชัน xrDestroySceneMeshSnapshotANDROID มีคำจำกัดความดังนี้

XrResult xrDestroySceneMeshSnapshotANDROID(
    XrSceneMeshSnapshotANDROID                  snapshot);

คำอธิบายพารามิเตอร์

แอปพลิเคชันสามารถใช้ฟังก์ชัน xrDestroySceneMeshSnapshotANDROID เพื่อทำลายสแนปชอตเมชของฉากได้ เมื่อแฮนเดิลถูกทำลาย แอปพลิเคชันจะไม่สามารถใช้แฮนเดิลดังกล่าวเพื่อรับข้อมูลหรือข้อมูลเมชย่อยได้อีกต่อไป แฮนเดิลจะถูกทำลายโดยอัตโนมัติเมื่อเครื่องมือติดตามถูกทำลาย เนื่องจากแฮนเดิลเครื่องมือติดตามเป็นระดับบนสุดของแฮนเดิลสแนปชอตเมชของฉาก

การใช้งานที่ถูกต้อง (โดยนัย)

ความปลอดภัยของชุดข้อความ

  • การเข้าถึง snapshot และแฮนเดิลย่อยต้องซิงค์กับภายนอก

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_RUNTIME_FAILURE

โค้ดตัวอย่างสำหรับการสร้างเมชฉาก

โค้ดตัวอย่างต่อไปนี้แสดงวิธีเข้าถึงข้อมูลเมชของฉากเพื่อแสดงผล

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
  uint32_t submeshCount = 0;
  CHK_XR(xrGetAllSubmeshStatesANDROID(snapshot, 0, &submeshCount, nullptr));
  std::vector<XrSceneSubmeshStateANDROID> states(submeshCount, {
    .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.vertexCapacityInput];
    submesh.vertexNormals = new XrVector3f[submesh.vertexCapacityInput];
    submesh.vertexSemantics = new uint8_t[submesh.vertexCapacityInput];
    submesh.indexCapacityInput = submesh.indexCountOutput;
    submesh.indexCountOutput = 0;
    submesh.indices = new uint32_t[submesh.indexCapacityInput];
  }
  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 =
      new XrSceneMeshSemanticLabelANDROID[data.vertexCountOutput];
    for (uint32_t j = 0; j < data.vertexCountOutput; j++) {
      vertexSemantics[j] =
        static_cast<XrSceneMeshSemanticLabelANDROID>(data.vertexSemantics[j]);
    }
    XrPosef pose = submeshesPoses[i];

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

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

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

CHK_XR(xrDestroySceneMeshingTrackerANDROID(tracker));

ประเภทออบเจ็กต์ใหม่

คำสั่งใหม่

โครงสร้างใหม่

Enum ใหม่

ค่าคงที่ Enum ใหม่

  • XR_ANDROID_SCENE_MESHING_EXTENSION_NAME
  • XR_ANDROID_scene_meshing_SPEC_VERSION
  • การขยาย XrObjectType :

    • XR_OBJECT_TYPE_SCENE_MESHING_TRACKER_ANDROID
    • XR_OBJECT_TYPE_SCENE_MESH_SNAPSHOT_ANDROID
  • การขยาย XrStructureType :

    • 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_DATA_ANDROID
    • XR_TYPE_SCENE_SUBMESH_STATE_ANDROID
    • XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID

ปัญหา

ประวัติเวอร์ชัน

  • Revision 3, 2025-05-15 (Salar Khan)

    • คำอธิบายส่วนขยายเริ่มต้น