XR_ANDROID_scene_meshing
Name String
XR_ANDROID_scene_meshing
ประเภทส่วนขยาย
ส่วนขยายอินสแตนซ์
หมายเลขต่อที่ลงทะเบียน
719
การแก้ไข
3
สถานะการให้สัตยาบัน
ยังไม่ได้รับการรับรอง
การขึ้นต่อกันของส่วนขยายและเวอร์ชัน
วันที่แก้ไขล่าสุด
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
ภาพรวม
ส่วนขยายนี้มีไว้เพื่อจัดหาเมชที่แสดงถึงออบเจ็กต์จริงในสภาพแวดล้อมของผู้ใช้โดยประมาณ
แอปพลิเคชันสามารถใช้ส่วนขยายนี้เพื่อแสดงภาพฉากและอนุญาตให้วัตถุเสมือนจริงโต้ตอบกับวัตถุจริง เช่น การชนกัน
ข้อมูลตาข่ายฉากสร้างขึ้นโดยรันไทม์และแชร์กับแอปพลิเคชันโดยใช้ XrSceneMeshingTrackerANDROID และ XrSceneMeshSnapshotANDROID แอปพลิเคชันเข้าถึงค่าในข้อมูล Submesh ของฉากได้ผ่าน 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หรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีโครงสร้างดังกล่าวที่กำหนดไว้ใน OpenXR หลักหรือส่วนขยายนี้supportsSceneMeshingคือXrBool32ที่ระบุว่าระบบรองรับการเชื่อมต่อฉากหรือไม่
แอปพลิเคชันสามารถตรวจสอบว่าระบบสามารถทำ Scene Meshing ได้หรือไม่โดยการเชื่อมต่อโครงสร้าง 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หรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง
การแจงนับ 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;
ค่าการแจงนับมีความหมายดังนี้
คำอธิบาย Enum
XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
ชุดป้ายกำกับความหมายนี้แสดงถึงการไม่มีป้ายกำกับความหมาย
XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID
ชุดป้ายกำกับความหมายนี้แสดง XrSceneMeshSemanticLabelANDROID
ฟังก์ชัน 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 ทำได้หากsupportedSemanticLabelSetsInputCapacityเป็น 0NULL- ดูคำอธิบายโดยละเอียดเกี่ยวกับการดึงข้อมูลขนาด
supportedSemanticLabelSetsที่ต้องการได้ในบทพารามิเตอร์ขนาดบัฟเฟอร์
แอปพลิเคชันสามารถแจงนับชุดป้ายกำกับเชิงความหมายที่ระบบรองรับได้โดยใช้ฟังก์ชัน xrEnumerateSupportedSemanticLabelSetsANDROID
ทุกระบบต้องรองรับ XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID เป็นอย่างน้อย เนื่องจากค่า Enum นี้แสดงถึงชุดป้ายกำกับเชิงความหมายที่ไม่มี และใช้ได้ในกรณีที่แอปพลิเคชันไม่จำเป็นต้องใช้ความหมายของจุดยอด
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_scene_meshingก่อนเรียกใช้ xrEnumerateSupportedSemanticLabelSetsANDROID -
instanceต้องเป็นแฮนเดิล XrInstance ที่ถูกต้อง -
supportedSemanticLabelSetsOutputCountต้องเป็นพอยน์เตอร์ไปยังค่าuint32_t - หาก
supportedSemanticLabelSetsInputCapacityไม่ใช่0supportedSemanticLabelSetsต้องเป็น Pointer ไปยัง อาร์เรย์ ของค่า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 เท่านั้นเมื่อสร้างเครื่องมือติดตามการสร้างตาข่ายฉาก หากแอปพลิเคชันใช้ชุดป้ายกำกับเชิงความหมายของจุดยอดใน Scene Mesh ที่ไม่รองรับ รันไทม์ต้องส่งคืน 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หรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีโครงสร้างดังกล่าวที่กำหนดไว้ใน OpenXR หลักหรือส่วนขยายนี้semanticLabelSetคือ XrSceneMeshSemanticLabelSetANDROID ที่ใช้เพื่อระบุชุดป้ายกำกับเชิงความหมายที่จะใช้สำหรับการสร้างตาข่ายฉาก หากตั้งค่าเป็นXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROIDรันไทม์จะไม่สนใจฟิลด์บัฟเฟอร์ XrSceneSubmeshDataANDROID ::vertexSemanticsenableNormalsคือXrBool32ที่ใช้เพื่อระบุว่าจะรวมเวกเตอร์ปกติของจุดยอดสำหรับจุดยอดของเมชในบัฟเฟอร์เมชของฉากเมื่อรับข้อมูลเมชของฉากหรือไม่
โครงสร้าง XrSceneMeshingTrackerCreateInfoANDROID อธิบายข้อมูลเพื่อสร้างแฮนเดิล XrSceneMeshingTrackerANDROID
การใช้งานที่ถูกต้อง (โดยนัย)
- คุณต้องเปิดใช้ส่วนขยาย
XR_ANDROID_scene_meshingก่อนจึงจะใช้ XrSceneMeshingTrackerCreateInfoANDROID ได้ -
typeต้องเป็นXR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง -
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 แสดงถึงภาพรวมของ Scene Mesh สแนปชอตนี้สร้างขึ้นโดยใช้ xrCreateSceneMeshSnapshotANDROID ซึ่งจะถ่ายสแนปชอตของข้อมูลตาข่ายฉาก ณ เวลาที่เรียกใช้ฟังก์ชัน
แฮนเดิลนี้ใช้เพื่อดึงข้อมูลและข้อมูลของซับเมชได้โดยใช้ xrGetAllSubmeshStatesANDROID และ xrGetSubmeshDataANDROID
ฟังก์ชัน xrCreateSceneMeshSnapshotANDROID มีคำจำกัดความดังนี้
XrResult xrCreateSceneMeshSnapshotANDROID(
XrSceneMeshingTrackerANDROID tracker,
const XrSceneMeshSnapshotCreateInfoANDROID* createInfo,
XrSceneMeshSnapshotCreationResultANDROID* outSnapshotCreationResult);
คำอธิบายพารามิเตอร์
trackerคือแฮนเดิล XrSceneMeshingTrackerANDROID ที่สร้างไว้ก่อนหน้านี้ด้วย xrCreateSceneMeshingTrackerANDROIDcreateInfoคือตัวชี้ไปยังโครงสร้าง XrSceneMeshSnapshotCreateInfoANDROID ซึ่งมีข้อมูลที่จำเป็นในการสร้างภาพรวมของ Scene MeshoutSnapshotCreationResultเป็นตัวชี้ไปยังออบเจ็กต์ XrSceneMeshSnapshotCreationResultANDROID ซึ่งรันไทม์จะป้อนข้อมูลผลการสร้างสแนปชอต
แอปพลิเคชันสามารถใช้ฟังก์ชัน xrCreateSceneMeshSnapshotANDROID เพื่อสร้างสแนปชอตของ Scene Mesh จากเครื่องมือติดตาม Scene Meshing ฟังก์ชันนี้จะแสดงผลแฮนเดิล 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 ที่ใช้แสดงข้อมูลท่าทางของ Submesh ของฉากtimeคือXrTimeที่อธิบายเวลาที่จะประมวลผลหรือแสดง Scene Mesh ซึ่งโดยปกติคือ 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หรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีโครงสร้างดังกล่าวที่กำหนดไว้ใน OpenXR หลักหรือส่วนขยายนี้snapshotคือแฮนเดิล XrSceneMeshSnapshotANDROID ที่รันไทม์สร้างขึ้นtrackingStateคือ XrSceneMeshTrackingStateANDROID ที่อธิบายสถานะของเครื่องมือติดตามการสร้างตาข่ายฉาก ณ เวลาที่สร้างสแนปชอต
โครงสร้าง XrSceneMeshSnapshotCreationResultANDROID จะจัดเก็บผลลัพธ์ของการสร้างสแนปชอตของ Scene Mesh ที่ส่งคืนจาก 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 ซึ่งรันไทม์จะเอาต์พุตสถานะของซับเมชทั้งหมดในเมชฉาก ทำได้หากsubmeshStateCapacityInputเป็น 0NULL- ดูคำอธิบายโดยละเอียดเกี่ยวกับการดึงข้อมูลขนาด
submeshStatesที่ต้องการได้ในบทพารามิเตอร์ขนาดบัฟเฟอร์
แอปพลิเคชันสามารถใช้ฟังก์ชัน xrGetAllSubmeshStatesANDROID เพื่อรับสถานะของ Submesh ทั้งหมดใน Scene Mesh ซึ่งมีข้อมูลพื้นฐานเพื่อให้แอปพลิเคชันเลือกซับเมชที่แอปพลิเคชันต้องการข้อมูล
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้
XR_ANDROID_scene_meshingส่วนขยายก่อนเรียกใช้ xrGetAllSubmeshStatesANDROID -
snapshotต้องเป็นแฮนเดิล XrSceneMeshSnapshotANDROID ที่ถูกต้อง -
submeshStateCountOutputต้องเป็น Pointer ไปยังค่าuint32_t - หาก
submeshStateCapacityInputไม่ใช่0submeshStatesต้องเป็น Pointer ไปยัง อาร์เรย์ ของโครงสร้าง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 ที่ระบุซับเมชlastUpdatedTimeคือXrTimeที่แสดงเวลาที่อัปเดตซับเมชครั้งล่าสุดsubmeshPoseInBaseSpaceคือ XrPosef ที่แสดงท่าทางของซับเมชในพื้นที่ฐานที่ใช้สร้างสแนปชอตของเมชฉาก ท่าทางยังเป็นจุดศูนย์กลางของกรอบล้อมรอบของตาข่ายย่อยด้วยboundsคือ XrExtent3Df ที่อธิบายขนาดของกรอบล้อมรอบที่ล้อมรอบตาข่ายย่อย ขอบเขตนี้กำหนดไว้ในพื้นที่ฐานที่ใช้สร้างแฮนเดิลของตาข่ายฉาก
รันไทม์จะพยายามอย่างเต็มที่เพื่อแมป submeshId กับภูมิภาคของพื้นที่จริงที่ซับเมชครอบครอง รันไทม์อาจสูญเสียการเชื่อมโยงนี้ได้ทุกเมื่อ และกำหนด UUID ใหม่ให้กับชุดย่อยของ Submesh ที่ตรวจพบ โดยเฉพาะอย่างยิ่ง รันไทม์ไม่จำเป็นต้องใช้ UUID เดียวกันซ้ำสำหรับ Mesh เดียวกันในอินสแตนซ์แอปพลิเคชันที่ตามมา
การใช้งานที่ถูกต้อง (โดยนัย)
- คุณต้องเปิดใช้ส่วนขยาย
XR_ANDROID_scene_meshingก่อนจึงจะใช้ XrSceneSubmeshStateANDROID ได้ -
typeต้องเป็นXR_TYPE_SCENE_SUBMESH_STATE_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง
ฟังก์ชัน xrGetSubmeshDataANDROID มีคำจำกัดความดังนี้
XrResult xrGetSubmeshDataANDROID(
XrSceneMeshSnapshotANDROID snapshot,
uint32_t submeshDataCount,
XrSceneSubmeshDataANDROID* inoutSubmeshData);
คำอธิบายพารามิเตอร์
snapshotคือแฮนเดิล XrSceneMeshSnapshotANDROID ที่สร้างไว้ก่อนหน้านี้ด้วย xrCreateSceneMeshSnapshotANDROIDsubmeshDataCountคือความยาวของinoutSubmeshDatainoutSubmeshDataคืออาร์เรย์ที่จัดสรรแอปพลิเคชันของ XrSceneSubmeshDataANDROID ซึ่งรันไทม์จะสร้างแต่ละองค์ประกอบด้วยข้อมูลเมชที่เชื่อมโยงกับรหัสซับเมชที่ส่งใน XrSceneSubmeshDataANDROID ::submeshId
แอปพลิเคชันสามารถใช้ฟังก์ชัน xrGetSubmeshDataANDROID เพื่อรับกลุ่มของ Submesh หรือ Submesh ทั้งหมดพร้อมกันได้โดยการส่งรายการ XrSceneSubmeshDataANDROID ที่มี XrSceneSubmeshDataANDROID :: submeshId แต่ละรายการตั้งค่าเป็นรหัสของ Submesh ที่เกี่ยวข้องเพื่อดึงข้อมูล
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 ที่ระบุซับเมชvertexCapacityInputคือความจุของvertexPositions,vertexNormalsและvertexSemanticsหรือ 0 เพื่อดึงข้อมูลความจุที่ต้องการvertexCountOutputเป็นตัวชี้ไปยังจำนวนของvertexPositions,vertexNormalsและvertexSemanticsที่เขียน หรือตัวชี้ไปยังความจุที่จำเป็นในกรณีที่vertexCapacityInputไม่เพียงพอvertexPositionsคืออาร์เรย์ของ XrVector3f ที่รันไทม์จะส่งออกตำแหน่งจุดยอดของซับเมชvertexNormalsคืออาร์เรย์ของ 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หรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง - หาก
vertexCapacityInputไม่ใช่0vertexPositionsต้องเป็น Pointer ไปยัง อาร์เรย์ ของโครงสร้าง XrVector3f จำนวนvertexCapacityInput - หาก
vertexCapacityInputไม่ใช่0vertexNormalsต้องเป็น Pointer ไปยัง อาร์เรย์ ของโครงสร้าง XrVector3f จำนวนvertexCapacityInput - หาก
vertexCapacityInputไม่ใช่0vertexSemanticsต้องเป็น Pointer ไปยัง อาร์เรย์ ของค่าvertexCapacityInputuint8_t - หาก
indexCapacityInputไม่ใช่0indicesต้องเป็นพอยน์เตอร์ไปยังอาร์เรย์ของค่าindexCapacityInputuint32_t
การแจงนับ XrSceneMeshSemanticLabelANDROID คือชุดป้ายกำกับเชิงความหมายเริ่มต้นที่ใช้ติดป้ายกำกับจุดยอดของตาข่ายเพื่ออธิบายว่าจุดยอดของตาข่ายอยู่บนพื้นผิวสภาพแวดล้อมจริงใด ชุดการแจงนับนี้แสดงด้วยค่า 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
ปัญหา
ประวัติเวอร์ชัน
การแก้ไข 3, 2025-05-15 (Salar Khan)
- คำอธิบายส่วนขยายเริ่มต้น