XR_ANDROID_scene_meshing
Name String
XR_ANDROID_scene_meshing
ประเภทส่วนขยาย
ส่วนขยายอินสแตนซ์
หมายเลขต่อที่ลงทะเบียนไว้
719
การแก้ไข
3
สถานะการให้สัตยาบัน
ไม่ได้รับการให้สัตยาบัน
ทรัพยากร Dependency ของส่วนขยายและเวอร์ชัน
วันที่แก้ไขล่าสุด
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 ถือเป็นสิทธิ์ที่มีความละเอียดอ่อนเนื่องจากอนุญาตให้รันไทม์ศึกษาสภาพแวดล้อมของผู้ใช้
แอปพลิเคชันต้องขอสิทธิ์ที่รันไทม์เพื่อใช้ฟังก์ชันต่อไปนี้
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
(ระดับการป้องกัน: อันตราย)
ตรวจสอบความสามารถของระบบ
โครงสร้าง 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 แสดงว่าระบบรองรับการสร้างเมชฉาก
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_scene_meshingก่อนใช้ XrSystemSceneMeshingPropertiesANDROID -
typeต้องเป็นXR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
การแจงนับ 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ที่ลองใหม่จาก xrGetSystemsupportedSemanticLabelSetsInputCapacityคือความจุของ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ไม่ใช่0supportedSemanticLabelSetsต้องเป็นพอยเตอร์ไปยังอาร์เรย์ของค่าsupportedSemanticLabelSetsInputCapacityXrSceneMeshSemanticLabelSetANDROID
รหัสการคืนสินค้า
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_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_ANDROID_scene_meshingก่อนเรียกใช้ xrCreateSceneMeshingTrackerANDROID -
sessionต้องเป็นแฮนเดิล XrSession ที่ถูกต้อง -
createInfoต้องเป็นพอยเตอร์ไปยังโครงสร้าง XrSceneMeshingTrackerCreateInfoANDROID ที่ถูกต้อง -
trackerต้องเป็นตัวชี้ไปยังแฮนเดิล XrSceneMeshingTrackerANDROID
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_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 ::vertexSemanticsenableNormalsคือXrBool32ที่ใช้ระบุว่าจะรวมเวกเตอร์ปกติของเวอร์เท็กซ์สำหรับเวอร์เท็กซ์ของ Mesh ในบัฟเฟอร์ Mesh ของฉากหรือไม่เมื่อรับข้อมูล Mesh ของฉาก
โครงสร้าง XrSceneMeshingTrackerCreateInfoANDROID อธิบายข้อมูลเพื่อสร้างแฮนเดิล XrSceneMeshingTrackerANDROID
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_scene_meshingก่อนใช้ XrSceneMeshingTrackerCreateInfoANDROID -
typeต้องเป็นXR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROID -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง -
semanticLabelSetต้องเป็นค่า XrSceneMeshSemanticLabelSetANDROID ที่ถูกต้อง
ฟังก์ชัน xrDestroySceneMeshingTrackerANDROID มีคำจำกัดความดังนี้
XrResult xrDestroySceneMeshingTrackerANDROID(
XrSceneMeshingTrackerANDROID tracker);
คำอธิบายพารามิเตอร์
trackerคือ XrSceneMeshingTrackerANDROID ที่สร้างขึ้นก่อนหน้านี้โดย xrCreateSceneMeshingTrackerANDROID
ฟังก์ชัน xrDestroySceneMeshingTrackerANDROID จะปล่อย tracker และทรัพยากรที่เกี่ยวข้องเมื่อเสร็จสิ้นประสบการณ์การสร้างเมชของฉาก
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_scene_meshingก่อนเรียกใช้ xrDestroySceneMeshingTrackerANDROID -
trackerต้องเป็นแฮนเดิล XrSceneMeshingTrackerANDROID ที่ถูกต้อง
ความปลอดภัยของชุดข้อความ
- การเข้าถึง
trackerและแฮนเดิลย่อยต้องซิงค์กับภายนอก
รหัสการคืนสินค้า
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
สร้างแฮนเดิลสแนปชอตเมชของฉาก
XR_DEFINE_HANDLE(XrSceneMeshSnapshotANDROID)
แฮนเดิล XrSceneMeshSnapshotANDROID แสดงถึงสแนปชอตเมชฉาก ภาพรวมนี้สร้างขึ้นโดยใช้ xrCreateSceneMeshSnapshotANDROID ซึ่งจะจับภาพรวมของข้อมูลเมชฉาก ณ เวลาที่มีการเรียกใช้ฟังก์ชัน
แฮนเดิลนี้สามารถใช้เพื่อดึงข้อมูลและข้อมูล Submesh โดยใช้ xrGetAllSubmeshStatesANDROID และ xrGetSubmeshDataANDROID
ฟังก์ชัน xrCreateSceneMeshSnapshotANDROID มีคำจำกัดความดังนี้
XrResult xrCreateSceneMeshSnapshotANDROID(
XrSceneMeshingTrackerANDROID tracker,
const XrSceneMeshSnapshotCreateInfoANDROID* createInfo,
XrSceneMeshSnapshotCreationResultANDROID* outSnapshotCreationResult);
คำอธิบายพารามิเตอร์
trackerคือแฮนเดิล XrSceneMeshingTrackerANDROID ที่สร้างไว้ก่อนหน้านี้ด้วย xrCreateSceneMeshingTrackerANDROIDcreateInfoเป็นตัวชี้ไปยังโครงสร้าง XrSceneMeshSnapshotCreateInfoANDROID ซึ่งมีข้อมูลที่จำเป็นในการสร้างสแนปชอตเมชของฉากoutSnapshotCreationResultเป็นตัวชี้ไปยังออบเจ็กต์ XrSceneMeshSnapshotCreationResultANDROID ซึ่งรันไทม์จะสร้างขึ้นพร้อมผลลัพธ์การสร้างสแนปชอต
แอปพลิเคชันสามารถใช้ฟังก์ชัน xrCreateSceneMeshSnapshotANDROID เพื่อสร้างสแนปชอตเมชฉากจากเครื่องมือติดตามการสร้างเมชฉาก ฟังก์ชันนี้จะแสดงผลแฮนเดิล XrSceneMeshSnapshotANDROID พร้อมกับ XrSceneMeshTrackingStateANDROID ที่รวมอยู่ในโครงสร้าง XrSceneMeshSnapshotCreationResultANDROID แฮนเดิลเป็นภาพรวมของข้อมูลเมชฉาก ณ เวลาที่สร้างในทางเทคนิค แฮนเดิลนี้สามารถใช้เพื่อค้นหาข้อมูลและข้อมูลเมชของฉากได้โดยใช้ xrGetAllSubmeshStatesANDROID และ xrGetSubmeshDataANDROID ตามลำดับ
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_scene_meshingก่อนเรียกใช้ xrCreateSceneMeshSnapshotANDROID -
trackerต้องเป็นแฮนเดิล XrSceneMeshingTrackerANDROID ที่ถูกต้อง -
createInfoต้องเป็นพอยเตอร์ไปยังโครงสร้าง XrSceneMeshSnapshotCreateInfoANDROID ที่ถูกต้อง -
outSnapshotCreationResultต้องเป็นพอยเตอร์ไปยังโครงสร้าง XrSceneMeshSnapshotCreationResultANDROID
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_POSE_INVALIDXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_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 ::predictedDisplayTimeboundingBoxคือ XrBoxf ที่อธิบายกรอบล้อมรอบที่จะรับเมชฉาก
โครงสร้าง XrSceneMeshSnapshotCreateInfoANDROID อธิบายข้อมูลเพื่อสร้างแฮนเดิล XrSceneMeshSnapshotANDROID
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_scene_meshingก่อนใช้ XrSceneMeshSnapshotCreateInfoANDROID -
typeต้องเป็นXR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROID -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง -
baseSpaceต้องเป็นแฮนเดิล XrSpace ที่ถูกต้อง
โครงสร้าง 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
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_scene_meshingก่อนใช้ XrSceneMeshSnapshotCreationResultANDROID -
typeต้องเป็นXR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROID -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง -
snapshotต้องเป็นแฮนเดิล XrSceneMeshSnapshotANDROID ที่ถูกต้อง -
trackingStateต้องเป็นค่า XrSceneMeshTrackingStateANDROID ที่ถูกต้อง
การแจงนับ 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 ที่สร้างไว้ก่อนหน้านี้ด้วย xrCreateSceneMeshSnapshotANDROIDsubmeshStateCapacityInputคือความจุของsubmeshStatesหรือ 0 เพื่อดึงข้อมูลความจุที่จำเป็นsubmeshStateCountOutputคือตัวชี้ไปยังจำนวนของsubmeshStatesที่เขียน หรือตัวชี้ไปยังความจุที่จำเป็นในกรณีที่submeshStateCapacityInputไม่เพียงพอsubmeshStatesเป็นตัวชี้ไปยังอาร์เรย์ของโครงสร้าง XrSceneSubmeshStateANDROID ซึ่งรันไทม์จะแสดงผลสถานะของเมชย่อยทั้งหมดในเมชฉาก สามารถเป็นNULLได้หากsubmeshStateCapacityInputเป็น 0- ดูคำอธิบายโดยละเอียดเกี่ยวกับการดึงข้อมูลขนาด
submeshStatesที่จำเป็นได้ในบทพารามิเตอร์ขนาดบัฟเฟอร์
แอปพลิเคชันสามารถใช้ฟังก์ชัน xrGetAllSubmeshStatesANDROID เพื่อรับสถานะของซับเมชทั้งหมดในเมชฉาก ซึ่งมีข้อมูลพื้นฐานเพื่อให้แอปพลิเคชันเลือก Submesh ที่แอปพลิเคชันต้องการข้อมูลได้
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_scene_meshingก่อนเรียกใช้ xrGetAllSubmeshStatesANDROID -
snapshotต้องเป็นแฮนเดิล XrSceneMeshSnapshotANDROID ที่ถูกต้อง -
submeshStateCountOutputต้องเป็นตัวชี้ไปยังค่าuint32_t - หาก
submeshStateCapacityInputไม่ใช่0submeshStatesต้องเป็นพอยเตอร์ไปยังอาร์เรย์ของโครงสร้างsubmeshStateCapacityInputXrSceneSubmeshStateANDROID
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_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 ที่ระบุ SubmeshlastUpdatedTimeคือXrTimeที่แสดงเวลาที่มีการอัปเดต Submesh ครั้งล่าสุดsubmeshPoseInBaseSpaceคือ XrPosef ที่แสดงท่าทางของเมชย่อยในพื้นที่ฐานที่ใช้สร้างภาพรวมเมชของฉาก ท่าทางยังเป็นจุดศูนย์กลางของกรอบล้อมรอบ Submesh ด้วยboundsคือ XrExtent3Df ที่อธิบายขนาดของกรอบล้อมรอบที่ล้อมรอบเมชย่อย ขอบเขตนี้กำหนดไว้ในพื้นที่ฐานที่ใช้สร้างแฮนเดิลเมชฉาก
รันไทม์จะพยายามอย่างเต็มที่เพื่อแมป submeshId กับขอบเขตของพื้นที่จริงที่เมชย่อยครอบครองอยู่ รันไทม์อาจสูญเสียการแมปนี้ได้ทุกเมื่อ และกำหนด UUID ใหม่ให้กับชุดย่อยของซับเมชที่ตรวจพบ โดยเฉพาะอย่างยิ่ง รันไทม์ไม่จำเป็นต้องใช้ UUID เดียวกันซ้ำสำหรับ Mesh เดียวกันในอินสแตนซ์แอปพลิเคชันที่ตามมา
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_scene_meshingก่อนใช้ XrSceneSubmeshStateANDROID -
typeต้องเป็นXR_TYPE_SCENE_SUBMESH_STATE_ANDROID -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
ฟังก์ชัน xrGetSubmeshDataANDROID มีคำจำกัดความดังนี้
XrResult xrGetSubmeshDataANDROID(
XrSceneMeshSnapshotANDROID snapshot,
uint32_t submeshDataCount,
XrSceneSubmeshDataANDROID* inoutSubmeshData);
คำอธิบายพารามิเตอร์
snapshotคือแฮนเดิล XrSceneMeshSnapshotANDROID ที่สร้างไว้ก่อนหน้านี้ด้วย xrCreateSceneMeshSnapshotANDROIDsubmeshDataCountคือความยาวของinoutSubmeshDatainoutSubmeshDataคืออาร์เรย์ที่จัดสรรโดยแอปพลิเคชันของ 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ต้องเป็นพอยเตอร์ไปยังอาร์เรย์ของโครงสร้างsubmeshDataCountXrSceneSubmeshDataANDROID - พารามิเตอร์
submeshDataCountต้องมากกว่า0
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_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 ที่ระบุ SubmeshvertexCapacityInputคือความจุของvertexPositions,vertexNormalsและvertexSemanticsหรือ 0 เพื่อดึงข้อมูลความจุที่ต้องการvertexCountOutputคือตัวชี้ไปยังจำนวนของvertexPositions,vertexNormalsและvertexSemanticsที่เขียน หรือตัวชี้ไปยังความจุที่จำเป็นในกรณีที่vertexCapacityInputไม่เพียงพอvertexPositionsคืออาร์เรย์ของ XrVector3f ซึ่งรันไทม์จะแสดงผลตำแหน่งจุดยอดของ SubmeshvertexNormalsคืออาร์เรย์ของ XrVector3f ซึ่งรันไทม์จะแสดงผลเวกเตอร์แนวฉากของจุดยอดของซับเมช สามารถเว้นช่องนี้เป็นNULLได้หากแอปพลิเคชันสร้างเครื่องมือติดตามโดยปิดใช้เวกเตอร์ปกติvertexSemanticsคืออาร์เรย์ของuint8_tซึ่งรันไทม์จะแสดงผลความหมายของจุดยอดของซับเมช ช่องนี้สามารถเว้นว่างเป็นNULLได้หากแอปพลิเคชันสร้างเครื่องมือติดตามที่มีชุดป้ายกำกับความหมายXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROIDindexCapacityInputคือความจุของ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ไม่ใช่0vertexPositionsต้องเป็นพอยเตอร์ไปยังอาร์เรย์ของโครงสร้างvertexCapacityInputXrVector3f - หาก
vertexCapacityInputไม่ใช่0vertexNormalsต้องเป็นพอยเตอร์ไปยังอาร์เรย์ของโครงสร้างvertexCapacityInputXrVector3f - หาก
vertexCapacityInputไม่ใช่0vertexSemanticsต้องเป็นพอยน์เตอร์ไปยังอาร์เรย์ของค่าvertexCapacityInputuint8_t - หาก
indexCapacityInputไม่ใช่0indicesต้องเป็นพอยน์เตอร์ไปยังอาร์เรย์ของค่าindexCapacityInputuint32_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);
คำอธิบายพารามิเตอร์
snapshotคือแฮนเดิล XrSceneMeshSnapshotANDROID ที่สร้างไว้ก่อนหน้านี้ด้วย xrCreateSceneMeshSnapshotANDROID ซึ่งจะถูกทำลายโดยฟังก์ชันนี้
แอปพลิเคชันสามารถใช้ฟังก์ชัน xrDestroySceneMeshSnapshotANDROID เพื่อทำลายสแนปชอตเมชของฉากได้ เมื่อแฮนเดิลถูกทำลาย แอปพลิเคชันจะไม่สามารถใช้แฮนเดิลดังกล่าวเพื่อรับข้อมูลหรือข้อมูลเมชย่อยได้อีกต่อไป แฮนเดิลจะถูกทำลายโดยอัตโนมัติเมื่อเครื่องมือติดตามถูกทำลาย เนื่องจากแฮนเดิลเครื่องมือติดตามเป็นระดับบนสุดของแฮนเดิลสแนปชอตเมชของฉาก
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_scene_meshingก่อนเรียกใช้ xrDestroySceneMeshSnapshotANDROID -
snapshotต้องเป็นแฮนเดิล XrSceneMeshSnapshotANDROID ที่ถูกต้อง
ความปลอดภัยของชุดข้อความ
- การเข้าถึง
snapshotและแฮนเดิลย่อยต้องซิงค์กับภายนอก
รหัสการคืนสินค้า
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_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));
ประเภทออบเจ็กต์ใหม่
คำสั่งใหม่
- xrCreateSceneMeshSnapshotANDROID
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrEnumerateSupportedSemanticLabelSetsANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
โครงสร้างใหม่
- XrSceneMeshSnapshotCreateInfoANDROID
- XrSceneMeshSnapshotCreationResultANDROID
- XrSceneMeshingTrackerCreateInfoANDROID
- XrSceneSubmeshDataANDROID
- XrSceneSubmeshStateANDROID
การขยาย XrSystemProperties :
Enum ใหม่
ค่าคงที่ Enum ใหม่
XR_ANDROID_SCENE_MESHING_EXTENSION_NAMEXR_ANDROID_scene_meshing_SPEC_VERSIONการขยาย XrObjectType :
XR_OBJECT_TYPE_SCENE_MESHING_TRACKER_ANDROIDXR_OBJECT_TYPE_SCENE_MESH_SNAPSHOT_ANDROID
การขยาย XrStructureType :
XR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROIDXR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROIDXR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROIDXR_TYPE_SCENE_SUBMESH_DATA_ANDROIDXR_TYPE_SCENE_SUBMESH_STATE_ANDROIDXR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
ปัญหา
ประวัติเวอร์ชัน
Revision 3, 2025-05-15 (Salar Khan)
- คำอธิบายส่วนขยายเริ่มต้น