XR_EXT_spatial_container
Name String
XR_EXT_spatial_container
ประเภทส่วนขยาย
ส่วนขยายอินสแตนซ์
หมายเลขต่อที่ลงทะเบียนไว้
811
การแก้ไข
1
สถานะการให้สัตยาบัน
ไม่ได้รับการให้สัตยาบัน
ทรัพยากร Dependency ของส่วนขยายและเวอร์ชัน
วันที่แก้ไขล่าสุด
2026-08-06
สถานะ IP
ไม่มีการอ้างสิทธิ์ IP ที่ทราบ
ผู้เขียน
Jared Finder, Google
Andreas Loeve Selvik, Meta Platforms
Lachlan Ford, Google
Cass Everitt, Meta Platforms
Adam Gousetis, Meta Platforms
Ankur Agrawal, Unity Technologies
Bjorn Swenson, LÖVR
Denny Rönngren, Varjo Technologies
Fredia Huya-Kouadio, Godot Engine
Guodong Rong, Meta Platforms
Jakob Bornecrantz, NVIDIA
Jian Zhang, ByteDance
John Kearney, Meta Platforms
Jonathan Wright, Meta Platforms
Junfeng She, ByteDance
Kenny Vercaemer, Google
Kurtis Eveleigh, Qualcomm
Mauricio Narvaez, Meta Platforms
Nathan Nuber, Valve Corporation
Nihav Jain, Google
Nikita Lutsenko, Meta Platforms
Praveen Babu J D, ByteDance
Rylie Pavlik, Collabora
Salar Khan, Google
Shuai Liu, ByteDance
Walter Luh, Meta Platforms
Yin Li, Microsoft
Zhipeng Liu, ByteDance
ภาพรวม
ส่วนขยายนี้กำหนดเอนทิตีที่แสดงได้คลาสใหม่ที่เรียกว่า "คอนเทนเนอร์เชิงพื้นที่" ซึ่งคล้ายกับแนวคิดของ "หน้าต่าง" ในระบบหน้าต่าง 2 มิติบนเดสก์ท็อป
ใน OpenXR 1.x แอปจะควบคุมทุกสิ่งที่ผู้ใช้เห็นและวิธีผสมผสานสิ่งนั้นไว้ด้านบนของสภาพแวดล้อมจริงหรือเสมือนของผู้ใช้แต่เพียงผู้เดียว รันไทม์จะทำการแก้ไขเล็กน้อยในสิ่งที่แสดงเพื่อความปลอดภัยของผู้ใช้ โมเดลแอปนี้เหมาะสำหรับการทำให้ผู้ใช้ดื่มด่ำกับประสบการณ์เดียว แต่ไม่ครอบคลุมถึงประสบการณ์หลายอย่างพร้อมกัน โดยเฉพาะอย่างยิ่งในสภาพแวดล้อม AR และเทคโนโลยีความจริงแบบผสม (MR) ผู้ใช้มักต้องการสัมผัสประสบการณ์การใช้งานแอปต่างๆ หลายแอปพร้อมกัน
คอนเทนเนอร์เชิงพื้นที่ก็เหมือนกับหน้าต่างที่ขยายเป็น 3 มิติ ผู้ใช้จะเห็นคอนเทนเนอร์เชิงพื้นที่หลายรายการพร้อมกันและป้อนข้อมูลลงในคอนเทนเนอร์บางส่วน คอนเทนเนอร์เชิงพื้นที่ที่มองเห็นได้สามารถเป็นของแอปต่างๆ และรันไทม์จะจัดการขนาดและตำแหน่งในนามของผู้ใช้
ส่วนขยายนี้รองรับประสบการณ์การใช้งานแบบมีขอบเขตเชิงพื้นที่ประเภทใหม่ๆ เหล่านี้ นอกเหนือจากประสบการณ์การใช้งาน OpenXR แบบสมจริงที่มีอยู่ ประสบการณ์การใช้งาน OpenXR แบบจำกัดอนุญาตให้มีเนื้อหา 3 มิติเล็กน้อย (แผงแบนที่มีออฟเซ็ตความลึกเล็กน้อย) หรือวอลุ่มที่โฮสต์เนื้อหา 3 มิติเต็มรูปแบบ ประสบการณ์การใช้งาน OpenXR ที่สมจริงคือแอปแบบสมจริงเต็มหน้าจอที่มีอยู่ซึ่งได้รับการรองรับตั้งแต่ OpenXR 1.0 แอปสามารถสลับไปมาระหว่างเนื้อหา 2 ประเภทได้หากแอปเลือกที่จะทำเช่นนั้น
ส่วนขยายนี้ไม่ได้กำหนดวิธีการใดๆ สำหรับแอปในการแสดงผลเนื้อหา วิธีวาดเนื้อหาได้รับการกำหนดไว้ในส่วนขยายอื่นๆ: XR_EXT_spatial_container_self_rendering
การใช้คอนเทนเนอร์เชิงพื้นที่
XrSpatialContainerEXT คือแฮนเดิลที่แสดงถึงคอนเทนเนอร์เชิงพื้นที่
XR_DEFINE_HANDLE(XrSpatialContainerEXT)
แอปพลิเคชันจะเริ่มแสดงผลผ่านคอนเทนเนอร์เชิงพื้นที่โดยทำตามขั้นตอนต่อไปนี้
- สร้างคอนเทนเนอร์เชิงพื้นที่ด้วย xrCreateSpatialContainerEXT
- แก้ไขสถานะใดก็ได้ในคอนเทนเนอร์สำหรับการนำเสนอครั้งแรก เช่น โหมดขอบเขต
- ขอให้รันไทม์แสดงคอนเทนเนอร์ด้วย xrRequestSpatialContainerVisibleEXT
- รอให้รันไทม์พร้อมแสดงคอนเทนเนอร์ เมื่อรันไทม์พร้อมแล้ว ระบบจะจัดคิวเหตุการณ์ XrEventDataSpatialContainerVisibleChangedEXT โดยตั้งค่า
visibleเป็นXR_TRUE - เริ่มแสดงผลคอนเทนเนอร์เชิงพื้นที่
และวิธีทำลายคอนเทนเนอร์เชิงพื้นที่เป็นดังนี้
- ขอให้รันไทม์ซ่อนคอนเทนเนอร์ด้วย xrRequestSpatialContainerVisibleEXT
- รอให้รันไทม์ซ่อนคอนเทนเนอร์ให้เสร็จสิ้น เมื่อรันไทม์ซ่อนคอนเทนเนอร์โดยสมบูรณ์แล้ว ระบบจะจัดคิวเหตุการณ์ XrEventDataSpatialContainerVisibleChangedEXT โดยตั้งค่า
visibleเป็นXR_FALSE - สิ้นสุดการแสดงผลสำหรับคอนเทนเนอร์เชิงพื้นที่
- ทำลายคอนเทนเนอร์ด้วย xrDestroySpatialContainerEXT
หมายเหตุ
ส่วนขยายนี้ออกแบบมาเพื่อมอบสิทธิ์การเข้าถึงและการจัดการโฟกัสให้กับคอนเทนเนอร์เชิงพื้นที่แต่ละรายการ เนื่องจากเซสชันโดยรวมไม่ได้แสดงออบเจ็กต์ที่มองเห็นได้หรือโฟกัสเพียงรายการเดียวอีกต่อไป เซสชันจึงไม่เปลี่ยนผ่านเครื่องสถานะ OpenXR มาตรฐาน (READY, SYNCHRONIZED, VISIBLE, FOCUSED) แต่เซสชันจะยังคงอยู่ใน XR_SESSION_STATE_IDLE ตลอดอายุการใช้งาน และกฎในการเปลี่ยนแปลงสถานะเซสชันจะระบุวิธีที่การดำเนินการ OpenXR หลักเชื่อมโยงกับโหมดนี้
สร้างคอนเทนเนอร์เชิงพื้นที่
ฟังก์ชัน xrCreateSpatialContainerEXT จะสร้างคอนเทนเนอร์เชิงพื้นที่ใหม่
XrResult xrCreateSpatialContainerEXT(
XrSession session,
const XrSpatialContainerCreateInfoEXT* createInfo,
XrSpatialContainerEXT* spatialContainer);
คำอธิบายพารามิเตอร์
sessionคือ XrSession ที่สร้างคอนเทนเนอร์เชิงพื้นที่createInfoเป็นตัวชี้ไปยัง XrSpatialContainerCreateInfoEXT ที่มีพารามิเตอร์สำหรับสร้างคอนเทนเนอร์เชิงพื้นที่spatialContainerคือตัวชี้ไปยังแฮนเดิลที่แสดงผล XrSpatialContainerEXT ที่สร้างขึ้น
XrSpatialContainerEXT ที่สร้างขึ้นใหม่ต้องไม่แสดง ไม่สามารถโต้ตอบได้ และอยู่ในโหมดขอบเขต XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT แอปที่ต้องการให้คอนเทนเนอร์เชิงพื้นที่เริ่มต้นในโหมดใหญ่พิเศษสามารถขอโหมดขอบเขตเป็น XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT ก่อนที่จะขอให้แสดงคอนเทนเนอร์เชิงพื้นที่ได้
รันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE หากมิติข้อมูลใดๆ ของ XrSpatialContainerCreateInfoEXT :: suggestedBounds เป็นค่าลบ ไม่มีที่สิ้นสุด หรือไม่ใช่ตัวเลข รันไทม์ต้องแสดงผล XR_ERROR_LIMIT_REACHED หากแอปพยายามสร้างคอนเทนเนอร์เชิงพื้นที่มากกว่าที่ระบุไว้ใน XrSystemSpatialContainerPropertiesEXT :: maxSpatialContainerCount หากไม่ได้เปิดใช้คอนเทนเนอร์เชิงพื้นที่สำหรับเซสชันนี้ รันไทม์ต้องแสดงผล XR_ERROR_SPATIAL_CONTAINERS_NOT_ENABLED_EXT
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนเรียกใช้ xrCreateSpatialContainerEXT -
sessionต้องเป็นแฮนเดิล XrSession ที่ถูกต้อง -
createInfoต้องเป็นตัวชี้ไปยังโครงสร้าง XrSpatialContainerCreateInfoEXT ที่ถูกต้อง -
spatialContainerต้องเป็นตัวชี้ไปยังแฮนเดิล XrSpatialContainerEXT
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CONTAINERS_NOT_ENABLED_EXTXR_ERROR_VALIDATION_FAILURE
ระบบจะส่ง XrSpatialContainerCreateInfoEXT ไปยัง xrCreateSpatialContainerEXT เพื่อสร้างคอนเทนเนอร์เชิงมิติพื้นที่
typedef struct XrSpatialContainerCreateInfoEXT {
XrStructureType type;
const void* next;
XrSpatialContainerGraphicsPresentationEXT graphicsPresentation;
XrExtent3Df suggestedBounds;
} XrSpatialContainerCreateInfoEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้graphicsPresentationคือ XrSpatialContainerGraphicsPresentationEXT ที่อธิบายวิธีที่คอนเทนเนอร์เชิงพื้นที่นี้แสดงกราฟิกsuggestedBoundsคือ XrExtent3Df ที่อธิบายขนาดที่ขอของคอนเทนเนอร์เชิงพื้นที่ในหน่วยเมตร
แอปที่ไม่มีค่ากำหนดสำหรับขนาดของตนเองสามารถตั้งค่า suggestedBounds เป็น {0, 0, 0} ได้ รันไทม์อาจละเว้น suggestedBounds ที่ขอ
รันไทม์ที่อนุญาตให้คอนเทนเนอร์เชิงพื้นที่ถูกจำกัดด้วยรูปร่างอื่นๆ นอกเหนือจากกล่องที่กำหนดทิศทางต้องใช้ suggestedBounds เป็นกรอบล้อมรอบรูปร่างอื่นๆ กล่องที่ปรับแนวเป็นรูปร่างขอบเขตที่พบบ่อยที่สุด
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrSpatialContainerCreateInfoEXT -
typeต้องเป็นXR_TYPE_SPATIAL_CONTAINER_CREATE_INFO_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง -
graphicsPresentationต้องเป็นค่า XrSpatialContainerGraphicsPresentationEXT ที่ถูกต้อง
เมื่อคอนเทนเนอร์เชิงพื้นที่ใช้งานไม่ได้อีกต่อไป รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerClosedEXT
typedef struct XrEventDataSpatialContainerClosedEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
} XrEventDataSpatialContainerClosedEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้spatialContainerคือ XrSpatialContainerEXT ที่เหตุการณ์นี้มีไว้เพื่อ
การได้รับเหตุการณ์ XrEventDataSpatialContainerClosedEXT บ่งชี้ว่ารันไทม์ไม่สามารถแสดงคอนเทนเนอร์เชิงพื้นที่ได้อีกต่อไป เช่น เนื่องจากผู้ใช้คลิกปุ่ม "ปิด" หรือเซสชันเข้าสู่สถานะ XR_SESSION_STATE_LOSS_PENDING
หลังจากได้รับเหตุการณ์ XrEventDataSpatialContainerClosedEXT แอปควรหยุดใช้คอนเทนเนอร์เชิงพื้นที่นั้น ล้างสถานะที่เกี่ยวข้อง เช่น ลูปการแสดงผล และทำลายคอนเทนเนอร์ รันไทม์ต้องแสดงผล XR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT จากฟังก์ชันทั้งหมดที่ทำงานในคอนเทนเนอร์นั้นนอกเหนือจาก xrDestroySpatialContainerEXT
หากคอนเทนเนอร์เชิงพื้นที่ปรากฏขึ้นเมื่อรันไทม์จัดคิวเหตุการณ์ปิด รันไทม์ต้องเปลี่ยนคอนเทนเนอร์เป็นไม่ปรากฏก่อน แล้วจึงจัดคิวเหตุการณ์ XrEventDataSpatialContainerVisibleChangedEXT
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนที่จะใช้ XrEventDataSpatialContainerClosedEXT -
typeต้องเป็นXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_CLOSED_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
ฟังก์ชัน xrDestroySpatialContainerEXT จะทำลายคอนเทนเนอร์เชิงพื้นที่ที่มีอยู่
XrResult xrDestroySpatialContainerEXT(
XrSpatialContainerEXT spatialContainer);
คำอธิบายพารามิเตอร์
spatialContainerคือ XrSpatialContainerEXT ที่สร้างไว้ก่อนหน้านี้โดย xrCreateSpatialContainerEXT
หลังจากทำลายคอนเทนเนอร์เชิงพื้นที่แล้ว รันไทม์ต้องไม่แสดงเนื้อหาของคอนเทนเนอร์อีก และต้องไม่จัดคิวเหตุการณ์เพิ่มเติมเกี่ยวกับคอนเทนเนอร์
แอปไม่ควรทำลายคอนเทนเนอร์เชิงพื้นที่ที่มองเห็นได้ เนื่องจากการทำเช่นนั้นอาจส่งผลให้เกิดข้อบกพร่องด้านกราฟิก แต่แอปควรขอซ่อนคอนเทนเนอร์เชิงพื้นที่ด้วย xrRequestSpatialContainerVisibleEXT รอเหตุการณ์ XrEventDataSpatialContainerVisibleChangedEXT แล้วจึงทำลายคอนเทนเนอร์
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนเรียกใช้ xrDestroySpatialContainerEXT -
spatialContainerต้องเป็นแฮนเดิล XrSpatialContainerEXT ที่ถูกต้อง
ความปลอดภัยของชุดข้อความ
- การเข้าถึง
spatialContainerและแฮนเดิลย่อยต้องซิงค์กับภายนอก
รหัสการคืนสินค้า
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
พื้นที่คอนเทนเนอร์เชิงพื้นที่
ฟังก์ชัน xrCreateSpatialContainerSpaceEXT จะสร้างแฮนเดิล XrSpace สำหรับพื้นที่คอนเทนเนอร์เชิงมิติพื้นที่ของคอนเทนเนอร์เชิงมิติพื้นที่ที่เฉพาะเจาะจง
XrResult xrCreateSpatialContainerSpaceEXT(
XrSession session,
const XrSpatialContainerSpaceCreateInfoEXT* createInfo,
XrSpace* space);
คำอธิบายพารามิเตอร์
sessionคือ XrSession ที่สร้างพื้นที่ทำงานcreateInfoเป็นตัวชี้ไปยัง XrSpatialContainerSpaceCreateInfoEXT ที่มีพารามิเตอร์สำหรับสร้างพื้นที่ทำงานspaceคือตัวชี้ไปยังแฮนเดิลที่แสดงผล XrSpace ที่สร้างขึ้น
"พื้นที่คอนเทนเนอร์เชิงพื้นที่" สำหรับคอนเทนเนอร์เชิงพื้นที่หนึ่งๆ คือระบบพิกัดที่มีจุดเริ่มต้นอยู่ที่กึ่งกลางของขอบเขตของคอนเทนเนอร์เชิงพื้นที่นั้น โดยทั่วไปแล้ว พื้นที่นี้จะใช้เป็นพื้นที่ฐานสำหรับฟังก์ชันต่างๆ เช่น xrLocateSpace
+X ชี้ไปที่ด้านขวาของคอนเทนเนอร์ +Y ชี้ไปที่ด้านบนของคอนเทนเนอร์ และ +Z ชี้ไปที่ด้านหน้าของคอนเทนเนอร์ ตัวอย่างเช่น หากคอนเทนเนอร์จัดแนวตามแรงโน้มถ่วง อยู่ด้านหน้าผู้ดู และผู้ดูอยู่ในท่าทางเอกลักษณ์ที่สัมพันธ์กับพื้นที่ LOCAL รันไทม์ต้องปรับทิศทางพื้นที่คอนเทนเนอร์ด้วยการวางแนวเอกลักษณ์ที่สัมพันธ์กับพื้นที่ LOCAL รันไทม์อาจตั้งค่าท่าทางของพื้นที่คอนเทนเนอร์ที่สัมพันธ์กับพื้นที่ LOCAL เป็นท่าทางใดก็ได้เมื่อคอนเทนเนอร์นั้นปรากฏขึ้น
ext spatial container space convention
รูปที่ 18 ข้อตกลงแกนของพื้นที่คอนเทนเนอร์เชิงพื้นที่
พื้นที่คอนเทนเนอร์เชิงพื้นที่เป็นต้นทางที่ไม่ได้ล็อกโลก แอปที่ต้องการจุดเริ่มต้นที่ล็อกไว้กับโลกขณะอยู่ในโหมดใหญ่พิเศษสามารถใช้พื้นที่ที่ล็อกไว้กับโลก เช่น XR_REFERENCE_SPACE_TYPE_LOCAL
รันไทม์อาจเปลี่ยนท่าทางของพื้นที่คอนเทนเนอร์เชิงพื้นที่ได้ทุกเมื่อ โดยทั่วไปเพื่อรองรับผู้ใช้ที่ย้ายคอนเทนเนอร์เชิงพื้นที่ไปยังตำแหน่งหรือการหมุนอื่น รันไทม์อาจเปลี่ยนท่าทางเมื่อเปลี่ยนระหว่างโหมดขอบเขต XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT และ XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT ด้วย
พื้นที่คอนเทนเนอร์เชิงพื้นที่ต้องยังคงเป็นแฮนเดิลที่ถูกต้อง แม้ว่าคอนเทนเนอร์เชิงพื้นที่ที่เกี่ยวข้องจะถูกทำลายด้วย xrDestroySpatialContainerEXT ก็ตาม แม้ว่าคอนเทนเนอร์เชิงพื้นที่จะไม่ปรากฏหรือถูกทำลาย แต่พื้นที่คอนเทนเนอร์เชิงพื้นที่ต้องไม่สามารถระบุตำแหน่งได้เมื่อเทียบกับพื้นที่อื่นๆ XrSpaceLocation :: locationFlags และ XrViewState ::viewStateFlags จะเป็น 0
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนเรียกใช้ xrCreateSpatialContainerSpaceEXT -
sessionต้องเป็นแฮนเดิล XrSession ที่ถูกต้อง -
createInfoต้องเป็นตัวชี้ไปยังโครงสร้าง XrSpatialContainerSpaceCreateInfoEXT ที่ถูกต้อง -
spaceต้องเป็นตัวชี้ไปยังแฮนเดิล XrSpace
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CONTAINER_CLOSED_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialContainerSpaceCreateInfoEXT ใช้กับ xrCreateSpatialContainerSpaceEXT เพื่อสร้างแฮนเดิล XrSpace
typedef struct XrSpatialContainerSpaceCreateInfoEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
} XrSpatialContainerSpaceCreateInfoEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้spatialContainerคือ XrSpatialContainerEXT เพื่อสร้างพื้นที่ทำงาน
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrSpatialContainerSpaceCreateInfoEXT -
typeต้องเป็นXR_TYPE_SPATIAL_CONTAINER_SPACE_CREATE_INFO_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง -
spatialContainerต้องเป็นแฮนเดิล XrSpatialContainerEXT ที่ถูกต้อง
การนำเสนอคอนเทนเนอร์เชิงพื้นที่
การส่งเนื้อหาของคอนเทนเนอร์เชิงพื้นที่ไปยัง OpenXR เพื่อแสดงผลจะจัดการโดยส่วนขยายอื่นๆ: XR_EXT_spatial_container_self_rendering
หากต้องการอนุญาตให้ส่วนขยายอื่นๆ ระบุวิธีการนำเสนอกราฟิกสำหรับคอนเทนเนอร์เชิงพื้นที่ ส่วนขยายนี้จะกำหนด enum XrSpatialContainerGraphicsPresentationEXT
typedef enum XrSpatialContainerGraphicsPresentationEXT {
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT = 1000813000,
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_CONFORMANCE_AUTOMATION_EXT = 1000814000,
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SYSTEM_RENDERING_EXTX1 = 1000815000,
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialContainerGraphicsPresentationEXT;
คำอธิบาย Enum
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT
คอนเทนเนอร์เชิงพื้นที่ใช้เลเยอร์องค์ประกอบ OpenXR (เพิ่มโดยส่วนขยาย XR_EXT_spatial_container_self_rendering)
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_CONFORMANCE_AUTOMATION_EXT
ระบบสร้างคอนเทนเนอร์เชิงพื้นที่เพื่อทดสอบความสอดคล้องและไม่มีเส้นทางการแสดงผล (เพิ่มโดยส่วนขยาย XR_EXT_spatial_container_conformance_automation)
XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SYSTEM_RENDERING_EXTX1
คอนเทนเนอร์เชิงพื้นที่ใช้การแสดงผลระบบ OpenXR (เพิ่มโดยส่วนขยาย XR_EXTX1_system_renderer)
สถานะคอนเทนเนอร์เชิงพื้นที่
รันไทม์จะจัดการสถานะคอนเทนเนอร์เชิงพื้นที่ตามทั้งคำขอของแอปและความต้องการของผู้ใช้ ด้วยเหตุนี้ แต่ละแง่มุมของสถานะคอนเทนเนอร์เชิงพื้นที่จึงบันทึกสิ่งต่อไปนี้
- เมื่อรันไทม์ได้รับอนุญาตให้เปลี่ยนสถานะคอนเทนเนอร์เชิงพื้นที่ สำหรับสถานะคอนเทนเนอร์เชิงพื้นที่ส่วนใหญ่ รันไทม์อาจเปลี่ยนสถานะได้ทุกเมื่อ
- วิธีที่แอปขอเปลี่ยนแปลงสถานะ รันไทม์อาจเลื่อนคำขอออกไปจนกว่าจะเห็นว่าคำขอนั้นเหมาะสม รันไทม์จะไม่จัดคิวเหตุการณ์เมื่อมีการเลื่อนคำขอ ดังนั้นแอปไม่ควรรอเหตุการณ์ดังกล่าวสำหรับตรรกะที่ไม่เกี่ยวข้อง
- เหตุการณ์ที่รันไทม์จะจัดคิวเมื่อสถานะคอนเทนเนอร์เชิงพื้นที่เปลี่ยนแปลง รันไทม์จะจัดคิวเหตุการณ์สำหรับการเปลี่ยนแปลงทั้งหมด รวมถึงการเปลี่ยนแปลงที่แอปขอและการเปลี่ยนแปลงที่รันไทม์เริ่ม รันไทม์ต้องไม่จัดคิวเหตุการณ์การเปลี่ยนแปลงสถานะที่ไม่ได้บ่งชี้ถึงการเปลี่ยนแปลง เช่น หากแอปส่งคำขอ 2 รายการเพื่อซ่อนคอนเทนเนอร์อย่างรวดเร็วติดต่อกัน
- คิวรันไทม์ของเหตุการณ์ใดเมื่อปฏิเสธคำขอเปลี่ยนแปลงแอป รันไทม์อาจปฏิเสธคำขอด้วยเหตุผลใดก็ได้ ซึ่งโดยปกติแล้วจะเกิดจากนโยบายระบบที่เกี่ยวข้องกับการรักษาประสบการณ์ของผู้ใช้ที่มีคุณภาพสูง
ฟังก์ชัน xrGetSpatialContainerStateEXT จะค้นหาสถานะปัจจุบันของคอนเทนเนอร์เชิงพื้นที่
XrResult xrGetSpatialContainerStateEXT(
XrSpatialContainerEXT spatialContainer,
const XrSpatialContainerStateGetInfoEXT* getInfo,
XrSpatialContainerStateEXT* state);
คำอธิบายพารามิเตอร์
spatialContainerคือ XrSpatialContainerEXT ที่จะค้นหาgetInfoคือ XrSpatialContainerStateGetInfoEXT พร้อมข้อมูลที่ใช้เพื่อรับสถานะของคอนเทนเนอร์เชิงมิติพื้นที่stateเป็นตัวชี้ไปยัง XrSpatialContainerStateEXT ซึ่งจะแสดงผลสถานะคอนเทนเนอร์เชิงมิติพื้นที่
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนเรียกใช้ xrGetSpatialContainerStateEXT -
spatialContainerต้องเป็นแฮนเดิล XrSpatialContainerEXT ที่ถูกต้อง - หาก
getInfoไม่ใช่NULLgetInfoต้องเป็นพอยเตอร์ไปยังโครงสร้าง XrSpatialContainerStateGetInfoEXT ที่ถูกต้อง -
stateต้องเป็นพอยเตอร์ไปยังโครงสร้าง XrSpatialContainerStateEXT
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CONTAINER_CLOSED_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialContainerStateGetInfoEXT ใช้กับ xrGetSpatialContainerStateEXT เพื่อค้นหา XrSpatialContainerStateEXT
typedef struct XrSpatialContainerStateGetInfoEXT {
XrStructureType type;
const void* next;
} XrSpatialContainerStateGetInfoEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrSpatialContainerStateGetInfoEXT -
typeต้องเป็นXR_TYPE_SPATIAL_CONTAINER_STATE_GET_INFO_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
typedef struct XrSpatialContainerStateEXT {
XrStructureType type;
void* next;
XrBool32 visible;
XrBool32 interactable;
XrSpatialContainerBoundsModeEXT boundsMode;
} XrSpatialContainerStateEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้visibleแสดงว่าคอนเทนเนอร์เชิงพื้นที่มองเห็นได้หรือไม่interactableแสดงว่าคอนเทนเนอร์เชิงพื้นที่สามารถรับอินพุตประเภทใดก็ได้ในขณะนี้หรือไม่ ซึ่งคล้ายกับ "โฟกัส" สำหรับระบบการจัดการหน้าต่าง 2 มิติบนเดสก์ท็อป โดยมีความแตกต่างตรงที่คอนเทนเนอร์เชิงพื้นที่หลายรายการอาจโต้ตอบได้พร้อมกันboundsModeคือ XrSpatialContainerBoundsModeEXT ปัจจุบันของคอนเทนเนอร์เชิงพื้นที่
การเปลี่ยนแปลงสถานะของคอนเทนเนอร์เชิงพื้นที่จะสื่อสารผ่านเหตุการณ์
เหตุการณ์การเปลี่ยนแปลงช่อง
visible
XrEventDataSpatialContainerVisibleChangedEXT
interactable
XrEventDataSpatialContainerInteractableChangedEXT
boundsMode
XrEventDataSpatialContainerBoundsChangedEXT
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrSpatialContainerStateEXT -
typeต้องเป็นXR_TYPE_SPATIAL_CONTAINER_STATE_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
ระดับการแชร์
แอปจะขอแสดงหรือซ่อนคอนเทนเนอร์เชิงมิติพื้นที่ด้วย xrRequestSpatialContainerVisibleEXT
XrResult xrRequestSpatialContainerVisibleEXT(
XrSpatialContainerEXT spatialContainer,
const XrSpatialContainerVisibleRequestInfoEXT* info);
คำอธิบายพารามิเตอร์
spatialContainerคือ XrSpatialContainerEXT ที่จะขอเปลี่ยนแปลงinfoเป็นตัวชี้ไปยัง XrSpatialContainerVisibleRequestInfoEXT ที่มีสถานะที่มองเห็นได้ที่ขอ
การแสดงหรือซ่อนคอนเทนเนอร์เชิงพื้นที่เป็นการดำเนินการแบบอะซิงโครนัส
แอปควรส่งคำขอให้ซ่อนคอนเทนเนอร์เชิงพื้นที่ก่อนที่จะทำลาย เพื่อให้รันไทม์แสดงการเปลี่ยนผ่านที่ราบรื่น รันไทม์ควรทำตามคำขอให้ซ่อนคอนเทนเนอร์เชิงพื้นที่
รันไทม์อาจปฏิเสธคำขอแสดงคอนเทนเนอร์เชิงพื้นที่ ซึ่งในกรณีนี้รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerVisibleRequestDeniedEXT ตัวอย่างเช่น รันไทม์บางรายการจะปฏิเสธคำขอให้แสดงคอนเทนเนอร์เชิงพื้นที่ที่ผู้ใช้ซ่อนไว้โดยการโต้ตอบกับปุ่ม "ย่อ" ที่ระบบมีให้
รันไทม์ต้องไม่แสดงคอนเทนเนอร์เชิงพื้นที่ก่อนที่แอปจะขอแสดงคอนเทนเนอร์เชิงพื้นที่นั้นอย่างน้อย 1 ครั้ง หลังจากที่แอปส่งคำขอแรกเพื่อแสดงคอนเทนเนอร์เชิงพื้นที่ รันไทม์อาจเปลี่ยนระดับการมองเห็นของคอนเทนเนอร์เชิงพื้นที่นั้นโดยไม่ขึ้นอยู่กับคำขอของแอป ซึ่งจะช่วยให้แอปควบคุมสถานะเริ่มต้นและเนื้อหาของคอนเทนเนอร์เชิงพื้นที่ได้ และช่วยให้รันไทม์แสดง UI ของระบบ เช่น แถบงานที่ช่วยให้ผู้ใช้เลือกคอนเทนเนอร์เชิงพื้นที่ที่มองเห็นได้
รันไทม์ต้องปฏิเสธคำขอให้แสดงคอนเทนเนอร์เชิงมิติพื้นที่ในโหมดขอบเขตที่ไม่รองรับตาม XrSystemSpatialContainerPropertiesEXT :: supportsBounded และ XrSystemSpatialContainerPropertiesEXT :: supportsImmersive กรณีนี้อาจเกิดขึ้นได้เมื่อระบบไม่รองรับโหมดขอบเขตเริ่มต้น XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT
หมายเหตุ
ในการใช้งานบางอย่าง การแสดงหรือซ่อนคอนเทนเนอร์เชิงพื้นที่ต้องมีการสื่อสารกับบริการของระบบ และอาจเลื่อนออกไปจนกว่าผู้ใช้จะโต้ตอบกับกล่องโต้ตอบของระบบ การออกแบบแบบไม่พร้อมกันสำหรับการขอเปลี่ยนแปลงสถานะระดับการเข้าถึงมีไว้เพื่อให้รันไทม์มีเวลาดำเนินการทั้ง 2 อย่างนี้ให้เสร็จสมบูรณ์
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนเรียกใช้ xrRequestSpatialContainerVisibleEXT -
spatialContainerต้องเป็นแฮนเดิล XrSpatialContainerEXT ที่ถูกต้อง -
infoต้องเป็นพอยเตอร์ไปยังโครงสร้าง XrSpatialContainerVisibleRequestInfoEXT ที่ถูกต้อง
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CONTAINER_CLOSED_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialContainerVisibleRequestInfoEXT ใช้กับ xrRequestSpatialContainerVisibleEXT เพื่อเปลี่ยนระดับการมองเห็นของคอนเทนเนอร์เชิงมิติพื้นที่
typedef struct XrSpatialContainerVisibleRequestInfoEXT {
XrStructureType type;
const void* next;
XrBool32 visible;
} XrSpatialContainerVisibleRequestInfoEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้visibleแสดงว่ามีการขอให้แสดงหรือซ่อนคอนเทนเนอร์เชิงพื้นที่หรือไม่
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrSpatialContainerVisibleRequestInfoEXT -
typeต้องเป็นXR_TYPE_SPATIAL_CONTAINER_VISIBLE_REQUEST_INFO_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
ทุกครั้งที่รันไทม์เปลี่ยนระดับการเข้าถึงของคอนเทนเนอร์เชิงพื้นที่ รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerVisibleChangedEXT ด้วยสถานะใหม่
typedef struct XrEventDataSpatialContainerVisibleChangedEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
XrBool32 visible;
} XrEventDataSpatialContainerVisibleChangedEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้spatialContainerคือ XrSpatialContainerEXT ที่เหตุการณ์นี้มีไว้เพื่อvisibleคือสถานะการมองเห็นใหม่สำหรับคอนเทนเนอร์เชิงพื้นที่
เหตุการณ์นี้จะแทนที่ XR_SESSION_STATE_VISIBLE ซึ่งช่วยให้ค่าแตกต่างกันไปตามคอนเทนเนอร์ เหตุการณ์ต้องอยู่ในคิวสำหรับการเปลี่ยนแปลงทั้งหมด ซึ่งรวมถึงการเปลี่ยนแปลงที่แอปขอและการเปลี่ยนแปลงที่รันไทม์เริ่มต้น
รันไทม์อาจเลื่อนเวลาการแสดงผลคอนเทนเนอร์ออกไป 2-3 เฟรมหลังจากจัดคิวเหตุการณ์นี้โดยตั้งค่า visible เป็น XR_TRUE เพื่อหลีกเลี่ยงการแสดงคอนเทนเนอร์ว่างเปล่าและให้เวลาแอปส่งเนื้อหาเริ่มต้น ในช่วงเวลานี้ XrSpatialContainerStateEXT ::visible จะเป็น XR_TRUE รันไทม์ไม่ควรทำให้การแสดงผลคอนเทนเนอร์ล่าช้าเกิน 0.5 วินาที
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrEventDataSpatialContainerVisibleChangedEXT -
typeต้องเป็นXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_VISIBLE_CHANGED_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
ทุกครั้งที่รันไทม์ปฏิเสธคำขอให้แสดงคอนเทนเนอร์ รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerVisibleRequestDeniedEXT
typedef struct XrEventDataSpatialContainerVisibleRequestDeniedEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
} XrEventDataSpatialContainerVisibleRequestDeniedEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้spatialContainerคือ XrSpatialContainerEXT ที่เหตุการณ์นี้มีไว้เพื่อ
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrEventDataSpatialContainerVisibleRequestDeniedEXT -
typeต้องเป็นXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_VISIBLE_REQUEST_DENIED_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
โต้ตอบได้
แอปไม่สามารถขอให้คอนเทนเนอร์เชิงพื้นที่โต้ตอบได้ คอนเทนเนอร์เชิงพื้นที่ที่โต้ตอบได้จะได้รับการควบคุมโดยรันไทม์อย่างเต็มรูปแบบ คอนเทนเนอร์เชิงพื้นที่ที่โต้ตอบได้ต้องมองเห็นได้ด้วย
ทุกครั้งที่รันไทม์เปลี่ยนสถานะที่โต้ตอบได้ของคอนเทนเนอร์เชิงพื้นที่ รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerInteractableChangedEXT พร้อมสถานะใหม่
typedef struct XrEventDataSpatialContainerInteractableChangedEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
XrBool32 interactable;
} XrEventDataSpatialContainerInteractableChangedEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้spatialContainerคือ XrSpatialContainerEXT ที่เหตุการณ์นี้มีไว้เพื่อinteractableคือสถานะใหม่ที่โต้ตอบได้สำหรับคอนเทนเนอร์เชิงพื้นที่
เหตุการณ์นี้จะแทนที่ XR_SESSION_STATE_FOCUSED ซึ่งช่วยให้ค่าแตกต่างกันไปตามคอนเทนเนอร์ ระบบจะจัดคิวเหตุการณ์สำหรับการเปลี่ยนแปลงทั้งหมด รวมถึงการเปลี่ยนแปลงที่เริ่มต้นระหว่างรันไทม์
รันไทม์อาจเปิดหรือปิดใช้การโต้ตอบกับคอนเทนเนอร์เชิงพื้นที่ได้ทุกเมื่อ หากรันไทม์รองรับคอนเทนเนอร์เชิงพื้นที่ที่โต้ตอบได้สูงสุด 1 รายการต่อครั้ง เมื่อรันไทม์เปลี่ยนคอนเทนเนอร์เชิงพื้นที่ที่โต้ตอบได้ รันไทม์ต้องจัดคิวเหตุการณ์สำหรับคอนเทนเนอร์เชิงพื้นที่ที่หยุดโต้ตอบได้ ( interactable ตั้งค่าเป็นเท็จ) ก่อนเหตุการณ์สำหรับคอนเทนเนอร์ที่เริ่มโต้ตอบได้ ( interactable ตั้งค่าเป็นจริง)
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrEventDataSpatialContainerInteractableChangedEXT -
typeต้องเป็นXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_INTERACTABLE_CHANGED_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
ขอบเขต
คอนเทนเนอร์เชิงพื้นที่ประกอบด้วยโหมดขอบเขตและกรอบล้อมรอบ โหมดขอบเขตของคอนเทนเนอร์เชิงพื้นที่อธิบายลักษณะการทำงานของขอบเขต กรอบล้อมรอบคือสิ่งที่คอนเทนเนอร์เชิงพื้นที่วาดไว้ด้านใน
การแจงนับ XrSpatialContainerBoundsModeEXT จะระบุโหมดต่างๆ ที่ขอบเขตของคอนเทนเนอร์เชิงพื้นที่สามารถอยู่ได้
typedef enum XrSpatialContainerBoundsModeEXT {
XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT = 1,
XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT = 2,
XR_SPATIAL_CONTAINER_BOUNDS_MODE_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialContainerBoundsModeEXT;
คำอธิบาย Enum
XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT
คอนเทนเนอร์เชิงพื้นที่ถูกจำกัดขอบเขต ขอบเขตเป็นกล่องที่มีขอบเขตจำกัด คอนเทนเนอร์เชิงพื้นที่นี้จะปรากฏในภูมิภาคนี้เท่านั้น
XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT
คอนเทนเนอร์เชิงพื้นที่เป็นแบบสมจริงและมีขอบเขตไม่จำกัด คอนเทนเนอร์เชิงมิติพื้นที่จะแสดงเต็มหน้าจอ
คอนเทนเนอร์เชิงพื้นที่ที่อยู่ในโหมดขอบเขต XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT มีข้อกำหนดเพิ่มเติมดังนี้
- รันไทม์ต้องจัดการคอนเทนเนอร์เชิงพื้นที่เหล่านี้เหมือนกับแอปแบบเต็มหน้าจอและแอปที่สมจริงซึ่งสร้างขึ้นโดยไม่ใช้คอนเทนเนอร์เชิงพื้นที่ ยกเว้นการเปลี่ยนแปลงลักษณะการทำงานที่ระบุไว้ในการเปลี่ยนแปลงสถานะเซสชัน
- รันไทม์อาจมีส่วนขยายเพิ่มเติมที่ช่วยให้คอนเทนเนอร์เชิงพื้นที่แบบสมจริงทำงานแตกต่างจากแอปแบบเต็มหน้าจอและแอปแบบสมจริงที่สร้างขึ้นโดยไม่มีส่วนขยายนี้
- รันไทม์ต้องรายงานขอบเขตที่ไม่มีที่สิ้นสุดสำหรับคอนเทนเนอร์เชิงพื้นที่เหล่านี้
- รันไทม์อาจซ่อนคอนเทนเนอร์เชิงพื้นที่อื่นๆ ขณะที่คอนเทนเนอร์เชิงพื้นที่แบบสมจริงปรากฏอยู่ เนื่องจากลักษณะการทำงานนี้อาจแตกต่างกันไปตามรันไทม์ แอปไม่ควรอาศัยคอนเทนเนอร์เชิงพื้นที่ที่แสดงหรือซ่อนโดยอัตโนมัติตามระดับการมองเห็นคอนเทนเนอร์เชิงพื้นที่แบบสมจริง รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerVisibleChangedEXT เมื่อคอนเทนเนอร์เชิงพื้นที่ถูกซ่อนเนื่องจากคอนเทนเนอร์แบบสมจริงปรากฏขึ้น เช่นเดียวกับการเปลี่ยนสถานะที่มองเห็นได้อื่นๆ ทั้งหมด
หมายเหตุ
ข้อกำหนดข้างต้นหมายความว่ารันไทม์ทั้งหมดสามารถใช้เส้นทาง OpenXR 1.x ได้โดยไม่ต้องมีส่วนขยายนี้ โดยการสร้างคอนเทนเนอร์เชิงพื้นที่โดยนัย ตั้งค่าโหมดขอบเขตของคอนเทนเนอร์เป็นแบบสมจริง และขอให้มองเห็นได้
แอปจะขอเปลี่ยนโหมดขอบเขตของคอนเทนเนอร์เชิงมิติพื้นที่ด้วย xrRequestSpatialContainerBoundsModeEXT
XrResult xrRequestSpatialContainerBoundsModeEXT(
XrSpatialContainerEXT spatialContainer,
const XrSpatialContainerBoundsModeRequestInfoEXT* info);
คำอธิบายพารามิเตอร์
spatialContainerคือ XrSpatialContainerEXT ที่จะขอเปลี่ยนแปลงinfoเป็นตัวชี้ไปยัง XrSpatialContainerBoundsModeRequestInfoEXT ที่มีโหมดขอบเขตที่ขอ
การเปลี่ยนโหมดขอบเขตของคอนเทนเนอร์เชิงพื้นที่เป็นการดำเนินการแบบอะซิงโครนัส และรันไทม์อาจจัดคิวเหตุการณ์ที่เปลี่ยนแปลงหรือถูกปฏิเสธหลายวินาทีหลังจากที่แอปขอการเปลี่ยนแปลง ซึ่งจะช่วยให้รันไทม์แสดง UI ที่จำเป็นเพื่อให้ผู้ใช้เข้าสู่โหมดใหญ่พิเศษได้อย่างปลอดภัย
รันไทม์ต้องทำตามคำขอเพื่อเปลี่ยนโหมดขอบเขตสำหรับคอนเทนเนอร์เชิงพื้นที่ที่ไม่แสดง หากรันไทม์ปฏิเสธคำขอโหมดขอบเขตสำหรับคอนเทนเนอร์ที่มองไม่เห็น รันไทม์อาจปฏิเสธหรือเลื่อนคำขอเพื่อแสดงคอนเทนเนอร์เชิงพื้นที่ดังกล่าวแทน ซึ่งจะช่วยให้แอปเริ่มคอนเทนเนอร์เป็นคอนเทนเนอร์ที่สมจริงได้ รันไทม์อาจปฏิเสธคำขอเปลี่ยนโหมดขอบเขตของคอนเทนเนอร์เชิงพื้นที่ที่มองเห็นได้ ซึ่งในกรณีนี้ รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerBoundsModeRequestDeniedEXT ตัวอย่างเช่น รันไทม์บางรายการจะปฏิเสธคำขอเปลี่ยนโหมดขอบเขตของคอนเทนเนอร์เชิงพื้นที่ที่มองเห็นได้ซึ่งผู้ใช้ไม่ได้โต้ตอบด้วย
รันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE หากแอปขอโหมดขอบเขตที่ไม่รองรับตาม XrSystemSpatialContainerPropertiesEXT :: supportsBounded และ XrSystemSpatialContainerPropertiesEXT :: supportsImmersive
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนเรียกใช้ xrRequestSpatialContainerBoundsModeEXT -
spatialContainerต้องเป็นแฮนเดิล XrSpatialContainerEXT ที่ถูกต้อง -
infoต้องเป็นตัวชี้ไปยังโครงสร้าง XrSpatialContainerBoundsModeRequestInfoEXT ที่ถูกต้อง
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CONTAINER_CLOSED_EXTXR_ERROR_VALIDATION_FAILURE
XrSpatialContainerBoundsModeRequestInfoEXT ใช้กับ xrRequestSpatialContainerBoundsModeEXT เพื่อเปลี่ยนโหมดขอบเขตของคอนเทนเนอร์เชิงมิติพื้นที่
typedef struct XrSpatialContainerBoundsModeRequestInfoEXT {
XrStructureType type;
const void* next;
XrSpatialContainerBoundsModeEXT boundsMode;
} XrSpatialContainerBoundsModeRequestInfoEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้boundsModeคือ XrSpatialContainerBoundsModeEXT ที่ต้องการสำหรับคอนเทนเนอร์เชิงมิติพื้นที่
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrSpatialContainerBoundsModeRequestInfoEXT -
typeต้องเป็นXR_TYPE_SPATIAL_CONTAINER_BOUNDS_MODE_REQUEST_INFO_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง -
boundsModeต้องเป็นค่า XrSpatialContainerBoundsModeEXT ที่ถูกต้อง
ทุกครั้งที่รันไทม์เปลี่ยนขอบเขตหรือโหมดขอบเขตของคอนเทนเนอร์เชิงพื้นที่ รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerBoundsChangedEXT พร้อมข้อมูลขอบเขตใหม่
typedef struct XrEventDataSpatialContainerBoundsChangedEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
XrExtent3Df bounds;
XrBool32 infiniteBounds;
XrSpatialContainerBoundsModeEXT boundsMode;
} XrEventDataSpatialContainerBoundsChangedEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้spatialContainerคือ XrSpatialContainerEXT ที่เหตุการณ์นี้มีไว้เพื่อboundsคือความกว้าง ความสูง และความลึกใหม่ของขอบเขตคอนเทนเนอร์เชิงพื้นที่infiniteBoundsจะเป็นจริงหากคอนเทนเนอร์มีขอบเขตไม่สิ้นสุดboundsModeคือ XrSpatialContainerBoundsModeEXT ใหม่ของคอนเทนเนอร์เชิงพื้นที่
ระบบจะจัดคิวเหตุการณ์สำหรับการเปลี่ยนแปลงทั้งหมด ซึ่งรวมถึงการเปลี่ยนแปลงที่แอปขอและการเปลี่ยนแปลงที่เริ่มต้นระหว่างรันไทม์
ขณะที่ผู้ใช้ปรับขนาดคอนเทนเนอร์เชิงพื้นที่แบบอินเทอร์แอกทีฟ รันไทม์ต้องทำงานในลักษณะใดลักษณะหนึ่งต่อไปนี้
- จัดคิวเหตุการณ์จำนวนมาก ซึ่งน่าจะอยู่ที่อัตราเฟรม เนื่องจากผู้ใช้กำลังปรับขนาดคอนเทนเนอร์เชิงพื้นที่
- จัดคิวเหตุการณ์เดียวเมื่อสิ้นสุดการปรับขนาด
หากรันไทม์จัดคิวเหตุการณ์เดียวเมื่อสิ้นสุดการปรับขนาด รันไทม์นั้นต้องรายงานขอบเขตเดิมจาก xrGetSpatialContainerBoundsEXT ต่อไปจนกว่ารันไทม์จะจัดคิวเหตุการณ์การปรับขนาด รันไทม์ต้องรวมเหตุการณ์การเปลี่ยนแปลงขอบเขตที่ไม่ได้สำรวจหลายรายการเข้าด้วยกัน กล่าวคือ หากขอบเขตหรือโหมดขอบเขตเปลี่ยนแปลงขณะที่ยังมีเหตุการณ์ XrEventDataSpatialContainerBoundsChangedEXT อยู่ในคิว รันไทม์ต้องรายงานเฉพาะเหตุการณ์เดียวที่มีการเปลี่ยนแปลงขอบเขตล่าสุดที่เกิดขึ้น เนื่องจากแอปสามารถสำรวจขอบเขตของคอนเทนเนอร์เชิงพื้นที่ได้โดยตรงด้วย xrGetSpatialContainerBoundsEXT จำนวนการเปลี่ยนแปลงขอบเขตจากเหตุการณ์จึงอาจแตกต่างจากจำนวนการเปลี่ยนแปลงจากการสำรวจตามเวลาของการเปลี่ยนแปลงขอบเขตที่สร้างขึ้นในรันไทม์ การเรียกใช้ xrPollEvent ของแอป และการเรียกใช้ xrGetSpatialContainerBoundsEXT ของแอป
เมื่อขอบเขตของคอนเทนเนอร์เชิงพื้นที่เปลี่ยนแปลง จุดเริ่มต้นในเครื่องของคอนเทนเนอร์เชิงพื้นที่อาจเปลี่ยนแปลงด้วย ตัวอย่างเช่น หากรันไทม์อนุญาตให้ผู้ใช้ปรับขนาดขอบเขตของคอนเทนเนอร์เชิงพื้นที่โดยการลากขอบด้านใดด้านหนึ่งของคอนเทนเนอร์ ขอบเขตและจุดเริ่มต้นในเครื่องของคอนเทนเนอร์นั้นจะเปลี่ยนไปเมื่อผู้ใช้ลากขอบด้านเดียว ในสถานการณ์เช่นนี้ รันไทม์ต้องเปลี่ยนขอบเขตและจุดเริ่มต้นในเครื่องพร้อมกัน
รันไทม์ต้องตั้งค่า infiniteBounds เป็น XR_TRUE และตั้งค่าความกว้าง ความสูง และความลึกเป็น 0.0 เพื่อแสดงขอบเขตที่ไม่มีที่สิ้นสุด รันไทม์ต้องตั้งค่า infiniteBounds เป็น XR_FALSE และตั้งค่าความกว้าง ความสูง และความลึกเป็นจำนวนบวกที่จำกัดสำหรับขอบเขตที่จำกัด
รันไทม์ต้องตั้งค่า bounds และ infiniteBounds ตามกฎเดียวกันกับ XrSpatialContainerBoundsEXT
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrEventDataSpatialContainerBoundsChangedEXT -
typeต้องเป็นXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_BOUNDS_CHANGED_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
ทุกครั้งที่รันไทม์ปฏิเสธคำขอเปลี่ยนโหมดขอบเขตของคอนเทนเนอร์ รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerBoundsModeRequestDeniedEXT
typedef struct XrEventDataSpatialContainerBoundsModeRequestDeniedEXT {
XrStructureType type;
const void* next;
XrSpatialContainerEXT spatialContainer;
} XrEventDataSpatialContainerBoundsModeRequestDeniedEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้spatialContainerคือ XrSpatialContainerEXT ที่เหตุการณ์นี้มีไว้เพื่อ
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrEventDataSpatialContainerBoundsModeRequestDeniedEXT -
typeต้องเป็นXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_BOUNDS_MODE_REQUEST_DENIED_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
โครงสร้าง XrSpatialContainerBoundsEXT อธิบายกรอบล้อมรอบของคอนเทนเนอร์เชิงพื้นที่
typedef struct XrSpatialContainerBoundsEXT {
XrStructureType type;
void* next;
XrExtent3Df bounds;
XrBool32 infiniteBounds;
} XrSpatialContainerBoundsEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้boundsคือความกว้าง ความสูง และความลึกของขอบเขตคอนเทนเนอร์เชิงพื้นที่ ขอบเขตมีหน่วยเป็นเมตรinfiniteBoundsจะเป็นจริงหากคอนเทนเนอร์มีขอบเขตไม่สิ้นสุด
รันไทม์ต้องตั้งค่า infiniteBounds เป็น XR_TRUE และตั้งค่าความกว้าง ความสูง และความลึกเป็น 0.0 เพื่อแสดงขอบเขตที่ไม่มีที่สิ้นสุด รันไทม์ต้องตั้งค่า infiniteBounds เป็น XR_FALSE และตั้งค่าความกว้าง ความสูง และความลึกเป็นจำนวนบวกที่จำกัดสำหรับขอบเขตที่จำกัด
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrSpatialContainerBoundsEXT -
typeต้องเป็นXR_TYPE_SPATIAL_CONTAINER_BOUNDS_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
ฟังก์ชัน xrGetSpatialContainerBoundsEXT จะค้นหาขอบเขตปัจจุบันของคอนเทนเนอร์เชิงพื้นที่
XrResult xrGetSpatialContainerBoundsEXT(
XrSpatialContainerEXT spatialContainer,
const XrSpatialContainerBoundsGetInfoEXT* getInfo,
XrSpatialContainerBoundsEXT* bounds);
คำอธิบายพารามิเตอร์
spatialContainerคือ XrSpatialContainerEXT ที่จะค้นหาgetInfoคือ XrSpatialContainerBoundsGetInfoEXT ที่มีข้อมูลที่ใช้เพื่อรับสถานะของคอนเทนเนอร์เชิงมิติพื้นที่boundsคือตัวชี้ไปยัง XrSpatialContainerBoundsEXT ซึ่งจะแสดงขอบเขต
แม้ว่าคอนเทนเนอร์เชิงพื้นที่จะมีขอบเขต แต่ก็ต้องไม่มีขอบเขตที่ไม่มีที่สิ้นสุด ในขณะที่คอนเทนเนอร์เชิงพื้นที่เป็นแบบสมจริงก็ต้องมีขอบเขตที่ไม่มีที่สิ้นสุด
รันไทม์อาจเปลี่ยนขอบเขตของคอนเทนเนอร์เชิงพื้นที่เป็นค่าจำกัดที่เป็นบวกได้ทุกเมื่อขณะที่คอนเทนเนอร์เชิงพื้นที่มีขอบเขต การเปลี่ยนแปลงขอบเขตของคอนเทนเนอร์เชิงมิติพื้นที่จะได้รับการสื่อสารผ่าน XrEventDataSpatialContainerBoundsChangedEXT
เมื่อใช้ส่วนขยายนี้ แอปไม่สามารถขอเปลี่ยนแปลงขอบเขตได้ นอกเหนือจากการเปลี่ยนระหว่างโหมดมีขอบเขตและโหมดสมจริงด้วย xrRequestSpatialContainerBoundsModeEXT ส่วนขยายอื่นๆ อาจมีวิธีดังกล่าวในอนาคต
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนเรียกใช้ xrGetSpatialContainerBoundsEXT -
spatialContainerต้องเป็นแฮนเดิล XrSpatialContainerEXT ที่ถูกต้อง - หาก
getInfoไม่ใช่NULLgetInfoต้องเป็นพอยเตอร์ไปยังโครงสร้าง XrSpatialContainerBoundsGetInfoEXT ที่ถูกต้อง -
boundsต้องเป็นตัวชี้ไปยังโครงสร้าง XrSpatialContainerBoundsEXT
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_CONTAINER_CLOSED_EXTXR_ERROR_VALIDATION_FAILURE
โครงสร้าง XrSpatialContainerBoundsGetInfoEXT เป็นโครงสร้างอินพุตที่มีไว้เพื่อวัตถุประสงค์ในการขยายในอนาคต
typedef struct XrSpatialContainerBoundsGetInfoEXT {
XrStructureType type;
const void* next;
} XrSpatialContainerBoundsGetInfoEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrSpatialContainerBoundsGetInfoEXT -
typeต้องเป็นXR_TYPE_SPATIAL_CONTAINER_BOUNDS_GET_INFO_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
การแจงนับ XrSpatialContainerVolumeClippingEXT จะระบุลักษณะการทำงานของการตัดคลิปวอลุ่มที่แตกต่างกันสำหรับคอนเทนเนอร์เชิงพื้นที่
typedef enum XrSpatialContainerVolumeClippingEXT {
XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_NONE_EXT = 0,
XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT = 1,
XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialContainerVolumeClippingEXT;
คำอธิบาย Enum
XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_NONE_EXT
ไม่มีการครอบตัดเนื้อหาตามปริมาตรขอบเขตของคอนเทนเนอร์เชิงพื้นที่ เนื้อหาอาจแสดงผลนอกขอบเขตของคอนเทนเนอร์เชิงพื้นที่ได้
XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT
เนื้อหาจะถูกตัดให้พอดีกับปริมาตรขอบเขตของคอนเทนเนอร์เชิงพื้นที่อย่างเคร่งครัด
ไม่มีการใช้การแจงนับนี้ในส่วนขยายนี้ ซึ่งกำหนดไว้เพื่ออนุญาตให้ส่วนขยายอื่นๆ ระบุลักษณะการทำงานของการตัดระดับเสียงที่ต้องการได้ ตัวอย่างเช่น แอปอาจต้องการวาดพื้นหลังสำหรับคอนเทนเนอร์เชิงพื้นที่ที่มีขอบเขต คิวบ์แมปแบบตาเดียวเป็นวิธีที่สะดวกในการระบุพื้นหลัง อย่างไรก็ตาม คิวบ์แมปแบบตาเดียวจะอยู่ในตำแหน่งที่ไม่มีที่สิ้นสุดตามแนวคิด ซึ่งอยู่นอกคอนเทนเนอร์
ความสามารถของระบบ
แอปสามารถตรวจสอบความสามารถของระบบได้โดยเชื่อมโยงโครงสร้าง XrSystemSpatialContainerPropertiesEXT กับ XrSystemProperties เมื่อเรียกใช้ xrGetSystemProperties
typedef struct XrSystemSpatialContainerPropertiesEXT {
XrStructureType type;
void* next;
uint32_t maxSpatialContainerCount;
XrBool32 supportsBounded;
XrBool32 supportsImmersive;
} XrSystemSpatialContainerPropertiesEXT;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้maxSpatialContainerCountคือจำนวนคอนเทนเนอร์เชิงพื้นที่สูงสุดที่สร้างได้supportsBoundedจะเป็นจริงหากคอนเทนเนอร์เชิงพื้นที่สามารถกำหนดขอบเขตได้supportsImmersiveจะเป็นจริงหากคอนเทนเนอร์เชิงพื้นที่ได้รับอนุญาตให้แสดงผลแบบสมจริง
รันไทม์ที่รองรับส่วนขยายนี้ควรรองรับแอปที่สร้างคอนเทนเนอร์เชิงพื้นที่จำนวนมาก โดยจำกัดเฉพาะการจัดสรรหน่วยความจำเท่านั้น รันไทม์อาจมีขีดจำกัดที่แตกต่างกันสำหรับจำนวนคอนเทนเนอร์เชิงพื้นที่ที่แสดงพร้อมกัน ไม่มีวิธีค้นหาจำนวนคอนเทนเนอร์ที่แสดงพร้อมกันในส่วนขยายนี้ เนื่องจากรันไทม์อาจจำกัดแอปแต่ละแอปตามสถานะในแอปที่ทำงานอยู่ทั้งหมด สมมติฐานคืออุปกรณ์ที่มีข้อจำกัดสูงและอุปกรณ์ที่มีข้อจำกัดน้อยจะมีขีดจำกัดที่แตกต่างกันสำหรับจำนวนคอนเทนเนอร์ที่แสดงพร้อมกัน อุปกรณ์ที่มีข้อจำกัดสูงอาจรองรับการแสดงคอนเทนเนอร์เชิงพื้นที่ได้ครั้งละ 1 รายการเท่านั้น และอุปกรณ์ที่มีข้อจำกัดน้อยอาจรองรับการแสดงคอนเทนเนอร์เชิงพื้นที่จำนวนมากพร้อมกัน ทั้งนี้ขึ้นอยู่กับขีดจำกัดการประมวลผลการแสดงผล
รันไทม์ที่รองรับส่วนขยายนี้ต้องรองรับคอนเทนเนอร์เชิงพื้นที่แบบมีขอบเขตหรือคอนเทนเนอร์เชิงพื้นที่แบบสมจริงอย่างน้อย 1 รายการ
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrSystemSpatialContainerPropertiesEXT -
typeต้องเป็นXR_TYPE_SYSTEM_SPATIAL_CONTAINER_PROPERTIES_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
ฟังก์ชัน xrEnumerateSupportedSpatialContainerGraphicsPresentationsEXT จะแสดงผลวิธีการนำเสนอกราฟิกที่ระบบรองรับ
XrResult xrEnumerateSupportedSpatialContainerGraphicsPresentationsEXT(
XrInstance instance,
XrSystemId systemId,
uint32_t graphicsPresentationCapacityInput,
uint32_t* graphicsPresentationCountOutput,
XrSpatialContainerGraphicsPresentationEXT* graphicsPresentations);
คำอธิบายพารามิเตอร์
instanceคือ XrInstance ที่ดึงข้อมูลsystemIdมาsystemIdคือXrSystemIdที่มีการค้นหาgraphicsPresentationCapacityInputคือความจุของอาร์เรย์graphicsPresentationsหรือ 0 เพื่อระบุคำขอให้ดึงข้อมูลความจุที่จำเป็นgraphicsPresentationCountOutputคือตัวชี้ไปยังจำนวนการนำเสนอกราฟิกที่เขียน หรือตัวชี้ไปยังความจุที่จำเป็นในกรณีที่graphicsPresentationCapacityInputเป็น 0graphicsPresentationsเป็นตัวชี้ไปยังอาร์เรย์ของค่า XrSpatialContainerGraphicsPresentationEXT แต่สามารถเป็นค่า Null ได้หากgraphicsPresentationCapacityInputเป็น 0- ดูคำอธิบายโดยละเอียดเกี่ยวกับการดึงข้อมูลขนาด
graphicsPresentationsที่จำเป็นได้ที่ส่วนพารามิเตอร์ขนาดบัฟเฟอร์
รันไทม์ต้องแสดงเนื้อหาบัฟเฟอร์ที่เหมือนกันจากการแจงนับนี้เสมอสำหรับ systemId ที่ระบุและตลอดอายุการใช้งานของอินสแตนซ์
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนเรียกใช้ xrEnumerateSupportedSpatialContainerGraphicsPresentationsEXT -
instanceต้องเป็นแฮนเดิล XrInstance ที่ถูกต้อง -
graphicsPresentationCountOutputต้องเป็นตัวชี้ไปยังค่าuint32_t - หาก
graphicsPresentationCapacityInputไม่ใช่0graphicsPresentationsต้องเป็นพอยน์เตอร์ไปยังอาร์เรย์ของค่าgraphicsPresentationCapacityInputXrSpatialContainerGraphicsPresentationEXT
รหัสการคืนสินค้า
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
การเปลี่ยนแปลงสถานะเซสชัน
ระบบจะเปิดใช้การรองรับคอนเทนเนอร์เชิงพื้นที่สำหรับเซสชันโดยเชื่อมโยง XrSessionCreateInfoSpatialContainersEXT เมื่อเรียกใช้ xrCreateSession
typedef struct XrSessionCreateInfoSpatialContainersEXT {
XrStructureType type;
const void* next;
} XrSessionCreateInfoSpatialContainersEXT;
เมื่อเปิดใช้การรองรับคอนเทนเนอร์เชิงพื้นที่ XrSession จะทำงานต่างออกไป เนื่องจากเมื่อใช้คอนเทนเนอร์เชิงพื้นที่ เซสชันจะไม่แสดงเนื้อหารูปภาพบนจอแสดงผลอีกต่อไป แต่คอนเทนเนอร์เชิงพื้นที่จะเป็นผู้แสดงแทน ดังนั้น เมื่อเปิดใช้ส่วนขยายนี้ เซสชันจะ "ไม่มีส่วนหัว" อย่างมีประสิทธิภาพ แอปสามารถส่งข้อมูลรูปภาพผ่านคอนเทนเนอร์เชิงพื้นที่ได้ ซึ่งต่างจากส่วนขยายแบบ Headless อื่นๆ
การเปิดใช้การรองรับคอนเทนเนอร์เชิงพื้นที่จะเปลี่ยนแปลง OpenXR API หลักด้วยวิธีต่อไปนี้
รันไทม์: ระบบหรืออุปกรณ์สูญหาย
รันไทม์: ระบบหรืออุปกรณ์สูญหาย
xrDestroySession
xrDestroySession
ไม่มีการใช้งาน
(กำลังทำงาน)
ไม่มีการใช้งาน...
xrGetSystem
xrCreateSession
xrGetSystem...
xrCreateInstance
xrCreateIn...
xrDestroySession
xrDestroySession
LOSS_PENDING
(ไม่ทำงาน)
LOSS_PENDING...
xrDestroyInstance
xrDestroyInstance
แอป: เปิด XR อีกครั้ง
หากต้องการ
แอป: ไม่บังคับ...
รูปที่ 19 เครื่องสถานะเซสชันใหม่
- เซสชันไม่เคยเข้าสู่สถานะ
XR_SESSION_STATE_VISIBLE,XR_SESSION_STATE_FOCUSEDหรือXR_SESSION_STATE_EXITINGรันไทม์ต้องไม่จัดคิวเหตุการณ์สำหรับสถานะเหล่านี้ สถานะเหล่านี้จะถูกแทนที่ด้วยเหตุการณ์คอนเทนเนอร์เชิงพื้นที่ XrEventDataSpatialContainerVisibleChangedEXT, XrEventDataSpatialContainerInteractableChangedEXT และ XrEventDataSpatialContainerClosedEXT ตามลำดับ - นอกจากนี้ เซสชันจะไม่เข้าสู่สถานะ
XR_SESSION_STATE_READY,XR_SESSION_STATE_SYNCHRONIZED,XR_SESSION_STATE_STOPPINGด้วย รันไทม์ต้องไม่จัดคิวเหตุการณ์สำหรับสถานะเหล่านี้ ไม่มีการแทนที่สำหรับสถานะเหล่านี้ - รันไทม์ต้องถือว่าเซสชันกำลังทำงานเมื่ออยู่ในสถานะ
XR_SESSION_STATE_IDLE - รันไทม์ต้องถือว่าเซสชันเป็นแบบโฟกัสเมื่ออยู่ในสถานะ
XR_SESSION_STATE_IDLEและมีคอนเทนเนอร์เชิงพื้นที่อย่างน้อย 1 รายการที่โต้ตอบได้ - ไม่จำเป็นต้องใช้ฟังก์ชัน xrBeginSession และ xrEndSession อีกต่อไป รันไทม์ต้องแสดงผล
XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXTเมื่อมีการเรียกใช้ฟังก์ชันเหล่านี้ ส่วนขยายอื่นๆ อาจมีฟังก์ชันเหล่านี้ให้ใช้แทน - นอกจากนี้ คุณไม่จำเป็นต้องใช้ฟังก์ชัน xrRequestExitSession อีกต่อไป รันไทม์ต้องแสดงผล
XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXTเมื่อมีการเรียกใช้ฟังก์ชันนี้ แอปที่ต้องการออกจากเซสชันที่กำลังทำงานอยู่แทนสามารถเรียกใช้ xrRequestSpatialContainerVisibleEXT เพื่อซ่อนคอนเทนเนอร์ และทำลายเซสชันหลังจากที่มองไม่เห็นคอนเทนเนอร์ทั้งหมดแล้ว ส่วนขยายที่จะจัดคิวเหตุการณ์เพิ่มเติมเมื่อเซสชันเริ่มทำงานจะได้รับการเรียกใช้ในตอนนี้ และต้องจัดคิวเหตุการณ์เหล่านั้นหลังจากสร้างเซสชัน ส่วนขยายดังกล่าวจะระบุไว้ด้านล่าง
เหตุการณ์ของส่วนขยาย
XR_EXT_user_presence
XrEventDataUserPresenceChangedEXT
XR_META_boundary_visibility
XrEventDataBoundaryVisibilityChangedMETA
- ฟังก์ชัน xrLocateViews ไม่ถูกต้องสำหรับการเรียกใช้เซสชัน รันไทม์ต้องแสดงผล
XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXTจาก xrLocateViews ส่วนขยายอื่นๆ อาจมีวิธีค้นหามุมมองสำหรับคอนเทนเนอร์เชิงพื้นที่หนึ่งๆ - ฟังก์ชัน xrWaitFrame ต้องตั้งค่า XrFrameState ::
shouldRenderเป็น false เสมอ ส่วนขยายอื่นๆ อาจมีวิธีให้ทราบว่าคอนเทนเนอร์เชิงพื้นที่หนึ่งๆ ควรอัปเดตเลเยอร์องค์ประกอบหรือไม่ - ฟังก์ชัน xrEndFrame ไม่ใช่วิธีที่ถูกต้องในการส่งเลเยอร์องค์ประกอบ หากแอปตั้งค่า XrFrameEndInfo ::
layerCountเป็นค่าที่ไม่ใช่ 0 รันไทม์ต้องแสดงผลXR_ERROR_VALIDATION_FAILUREส่วนขยายอื่นๆ อาจมีวิธีส่งเลเยอร์องค์ประกอบสำหรับคอนเทนเนอร์เชิงพื้นที่ที่เฉพาะเจาะจง - การเข้าสู่สถานะ
XR_SESSION_STATE_LOSS_PENDINGจะปิดคอนเทนเนอร์เชิงพื้นที่ทั้งหมดด้วย รันไทม์ต้องจัดคิวเหตุการณ์ XrEventDataSpatialContainerClosedEXT สำหรับคอนเทนเนอร์เชิงพื้นที่ที่ใช้งานอยู่แต่ละรายการก่อนจัดคิวการเปลี่ยนแปลงสถานะเซสชันสำหรับXR_SESSION_STATE_LOSS_PENDING - ฟังก์ชัน xrCreateSession ไม่จำเป็นต้องมีโครงสร้างการเชื่อมโยง Graphics API อีกต่อไป ส่วนขยายอื่นๆ อาจต้องมีการเชื่อมโยงกราฟิก เช่น สำหรับคอนเทนเนอร์เชิงพื้นที่เพื่อแสดงผลโดยใช้ Graphics API
ลักษณะการทำงานข้างต้นแตกต่างจากลักษณะการทำงานใน XR_MND_headless เล็กน้อย รันไทม์ต้องไม่เปิดใช้ลักษณะการทำงานของเซสชันแบบไม่มีส่วนหัวจาก XR_MND_headless เมื่อเปิดใช้การรองรับคอนเทนเนอร์เชิงพื้นที่สำหรับเซสชันนั้น
หมายเหตุ
เมื่อเปิดใช้คอนเทนเนอร์เชิงพื้นที่ เซสชันจะเปลี่ยนสถานะระหว่าง 2 สถานะเท่านั้น ได้แก่ XR_SESSION_STATE_IDLE (กำลังทำงาน) และ XR_SESSION_STATE_LOSS_PENDING (ไม่ได้ทำงาน) ด้วยเหตุนี้ รันไทม์จึงไม่แสดงผล XR_ERROR_SESSION_RUNNING หรือ XR_ERROR_SESSION_NOT_RUNNING อีกต่อไป แต่เมื่อเซสชันไม่ทำงาน รันไทม์จะแสดงผลเป็น XR_ERROR_SESSION_LOST หรือ XR_SESSION_LOSS_PENDING ตามกฎใน OpenXR Core นอกจากนี้ xrBeginSession ซึ่งเป็นฟังก์ชันเดียวที่แสดงผล XR_ERROR_SESSION_RUNNING จะแสดงผล XR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXT เสมอ
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_containerก่อนใช้ XrSessionCreateInfoSpatialContainersEXT -
typeต้องเป็นXR_TYPE_SESSION_CREATE_INFO_SPATIAL_CONTAINERS_EXT -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
รายการ Android Manifest
รันไทม์ที่ใช้ AOSP อาจมีลักษณะการทำงานที่กำหนดเองตามสถานะคอนเทนเนอร์เชิงพื้นที่เริ่มต้นที่เริ่มทำงานก่อนเรียกใช้โค้ดแอป ตัวอย่างเช่น รันไทม์อาจแก้ไขทรัพยากรที่จัดสรรสำหรับกิจกรรม ภาพเคลื่อนไหวเมื่อเปิด หรือการแสดงหน้าจอเริ่มต้น (Splash Screen) พร็อพเพอร์ตี้ต่อไปนี้มีไว้เพื่อวัตถุประสงค์นี้ โดยจะแทนที่แท็ก <category android:name="org.khronos.openxr.intent.category.IMMERSIVE_HMD" /> ซึ่งแอปที่อิงตามคอนเทนเนอร์เชิงพื้นที่ไม่ควรระบุ ยกเว้นเพื่อความเข้ากันได้กับรันไทม์ที่อิงตาม AOSP เวอร์ชันก่อนหน้า
<property android:name="org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_USED_BOUNDS_MODES"
android:value="list of modes" />
พร็อพเพอร์ตี้นี้จะบอกใบ้รันไทม์เกี่ยวกับโหมดขอบเขตที่กิจกรรมใช้ โดยค่าเริ่มต้น รายการนี้จะเป็นรายการว่างเปล่า ซึ่งหมายความว่าไม่มีคำแนะนำ
สตริงต่อไปนี้ใช้ได้กับแอตทริบิวต์นี้ ค่าหลายค่าจะคั่นด้วย | เช่น "bounded|immersive"
ค่า
คำอธิบาย
"2d_panel"
กิจกรรมจะแสดงโดยใช้เฟรมเวิร์กมุมมอง 2 มิติของ Android
"bounded"
กิจกรรมใช้ XR_SPATIAL_CONTAINER_BOUNDS_MODE_BOUNDED_EXT
"immersive"
กิจกรรมใช้ XR_SPATIAL_CONTAINER_BOUNDS_MODE_IMMERSIVE_EXT
<property android:name="org.khronos.openxr.PROPERTY_ACTIVITY_HINT_XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE"
android:value="XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_BOUNDED|
XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_IMMERSIVE|
XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_UNDEFINED" />
พร็อพเพอร์ตี้นี้จะบอกใบ้รันไทม์ถึง XrSpatialContainerBoundsModeEXT เริ่มต้นของกิจกรรมเมื่อสร้างขึ้นครั้งแรก โดยค่าเริ่มต้นจะเป็นสตริง XR_SPATIAL_CONTAINER_INITIAL_BOUNDS_MODE_UNDEFINED ซึ่งหมายความว่าไม่มีคำแนะนำ
รันไทม์ต้องไม่กำหนดให้แอปต้องมีพร็อพเพอร์ตี้เหล่านี้เพื่อให้ทำงานตามข้อกำหนดนี้ รันไทม์ต้องไม่เปลี่ยนแปลงลักษณะการทำงานที่มองเห็นได้ของแอปโดยอิงตามพร็อพเพอร์ตี้เหล่านี้ ข้อมูลเมตาทั้งหมดดังกล่าวต้องระบุได้ที่ระดับ <activity> หรือระดับ <application> หากระบุที่ระดับ <application> จะมีผลกับกิจกรรมทั้งหมดในแอปพลิเคชันที่ไม่ได้ระบุค่าของตนเอง
โค้ดตัวอย่าง
โค้ดต่อไปนี้แสดงวิธีใช้ส่วนขยายนี้สำหรับกรณีการใช้งานที่เน้นการรับรู้เท่านั้นโดยไม่มีการแสดงผล
XrInstance instance; // Already initialized
// Create the session with spatial containers enabled
XrSession session;
XrSessionCreateInfoSpatialContainersEXT spatialContainerCreateInfo {
.type = XR_TYPE_SESSION_CREATE_INFO_SPATIAL_CONTAINERS_EXT,
};
XrSessionCreateInfo sessionCreateInfo {
.type = XR_TYPE_SESSION_CREATE_INFO,
.next = &spatialContainerCreateInfo, // Enable spatial containers
};
(void)sessionCreateInfo.systemId; // Other create fields set in usual way
CHK_XR(xrCreateSession(instance, &sessionCreateInfo, &session));
// Because spatial containers are enabled, the session is considered
// running. App is able to query perception data such as head poses and hand
// poses.
// Based on app logic or when a system lost event happens, destroy the
// session
CHK_XR(xrDestroySession(session));
ประเภทออบเจ็กต์ใหม่
คำสั่งใหม่
- xrCreateSpatialContainerEXT
- xrCreateSpatialContainerSpaceEXT
- xrDestroySpatialContainerEXT
- xrEnumerateSupportedSpatialContainerGraphicsPresentationsEXT
- xrGetSpatialContainerBoundsEXT
- xrGetSpatialContainerStateEXT
- xrRequestSpatialContainerBoundsModeEXT
- xrRequestSpatialContainerVisibleEXT
โครงสร้างใหม่
- XrEventDataSpatialContainerBoundsChangedEXT
- XrEventDataSpatialContainerBoundsModeRequestDeniedEXT
- XrEventDataSpatialContainerClosedEXT
- XrEventDataSpatialContainerInteractableChangedEXT
- XrEventDataSpatialContainerVisibleChangedEXT
- XrEventDataSpatialContainerVisibleRequestDeniedEXT
- XrSpatialContainerBoundsEXT
- XrSpatialContainerBoundsGetInfoEXT
- XrSpatialContainerBoundsModeRequestInfoEXT
- XrSpatialContainerCreateInfoEXT
- XrSpatialContainerSpaceCreateInfoEXT
- XrSpatialContainerStateEXT
- XrSpatialContainerStateGetInfoEXT
- XrSpatialContainerVisibleRequestInfoEXT
การขยาย XrSessionCreateInfo :
การขยาย XrSystemProperties :
Enum ใหม่
- XrSpatialContainerBoundsModeEXT
- XrSpatialContainerGraphicsPresentationEXT
- XrSpatialContainerVolumeClippingEXT
ค่าคงที่ Enum ใหม่
XR_EXT_SPATIAL_CONTAINER_EXTENSION_NAMEXR_EXT_spatial_container_SPEC_VERSIONการขยาย XrObjectType :
XR_OBJECT_TYPE_SPATIAL_CONTAINER_EXT
การขยาย XrResult :
XR_ERROR_COMPATIBLE_SPATIAL_CONTAINER_MISSING_EXTXR_ERROR_SPATIAL_CONTAINERS_ENABLED_EXTXR_ERROR_SPATIAL_CONTAINERS_NOT_ENABLED_EXTXR_ERROR_SPATIAL_CONTAINER_CLOSED_EXT
การขยาย XrStructureType :
XR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_BOUNDS_CHANGED_EXTXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_BOUNDS_MODE_REQUEST_DENIED_EXTXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_CLOSED_EXTXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_INTERACTABLE_CHANGED_EXTXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_VISIBLE_CHANGED_EXTXR_TYPE_EVENT_DATA_SPATIAL_CONTAINER_VISIBLE_REQUEST_DENIED_EXTXR_TYPE_SESSION_CREATE_INFO_SPATIAL_CONTAINERS_EXTXR_TYPE_SPATIAL_CONTAINER_BOUNDS_EXTXR_TYPE_SPATIAL_CONTAINER_BOUNDS_GET_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_BOUNDS_MODE_REQUEST_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_CREATE_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_SPACE_CREATE_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_STATE_EXTXR_TYPE_SPATIAL_CONTAINER_STATE_GET_INFO_EXTXR_TYPE_SPATIAL_CONTAINER_VISIBLE_REQUEST_INFO_EXTXR_TYPE_SYSTEM_SPATIAL_CONTAINER_PROPERTIES_EXT
ปัญหา
เราจะจัดการคำขอที่มองเห็นได้ซึ่งค้างอยู่หลายรายการอย่างไร แอปควรได้รับการเปลี่ยนแปลง/การปฏิเสธกลับมา 1 รายการหรือหลายรายการ คำตอบอาจแตกต่างกันหากการเรียกใช้เกิดขึ้นในหลายเฟรม คำตอบอาจแตกต่างออกไปหากคำขอหลายรายการส่งผลให้ไม่มีการดำเนินการใดๆ เช่น การขอให้คอนเทนเนอร์เชิงพื้นที่ปรากฏขึ้น แล้วไม่ปรากฏสำหรับคอนเทนเนอร์ที่เริ่มต้นด้วยการไม่ปรากฏ
- แก้ไขแล้ว ตัวเลือกที่แตกต่างกันสำหรับเหตุการณ์การเปลี่ยนแปลงและเหตุการณ์ที่ถูกปฏิเสธ คำขอ Noop จะไม่จัดคิวเหตุการณ์การเปลี่ยนแปลง ซึ่งจะสร้างความรบกวนให้กับนักพัฒนาแอปและรันไทม์จะกรองออกได้ง่าย หากคำขอที่มองเห็นได้หลายรายการถูกปฏิเสธ รันไทม์แต่ละรายการต้องสร้างเหตุการณ์ที่ถูกปฏิเสธที่เกี่ยวข้อง
ส่วนขยายการทำงานอัตโนมัติเพื่อความสอดคล้องควรได้รับการกำหนดอย่างไรเพื่อให้ CTS ยังคงทดสอบข้อความข้อมูลจำเพาะที่ไม่บังคับทั้งหมดสำหรับลักษณะการทำงานของนโยบายได้
- แก้ไขแล้ว ส่วนขยายการทดสอบแยกต่างหาก จะมีการติดตั้งรันไทม์ของส่วนขยายการทดสอบสำหรับ CTS เท่านั้น ซึ่งจะช่วยให้ CTS ควบคุมนโยบายระบบทั้งหมดได้
เราจำเป็นต้องมีเหตุการณ์เมื่อตำแหน่งของคอนเทนเนอร์เชิงพื้นที่เปลี่ยนแปลงไหม
- แก้ไขแล้ว ไม่ พื้นที่คอนเทนเนอร์เชิงพื้นที่ไม่ได้ล็อกโลก และพื้นที่อื่นๆ เช่น
XR_REFERENCE_SPACE_TYPE_VIEWจะไม่มีเหตุการณ์เมื่อมีการเปลี่ยนแปลง
- แก้ไขแล้ว ไม่ พื้นที่คอนเทนเนอร์เชิงพื้นที่ไม่ได้ล็อกโลก และพื้นที่อื่นๆ เช่น
xrSyncActions ทำงานอย่างไรหากมีคอนเทนเนอร์เชิงพื้นที่หลายรายการ
- แก้ไขแล้ว ไม่จำเป็นต้องเปลี่ยนแปลง xrSyncActions จะมีผลกับคอนเทนเนอร์เชิงพื้นที่ทั้งหมดในเซสชัน หากแอปต้องการกำหนดทิศทางการดำเนินการอินพุตไปยังคอนเทนเนอร์เชิงพื้นที่ที่เฉพาะเจาะจง แอปสามารถดูสถานะที่โต้ตอบได้ต่อคอนเทนเนอร์เพื่อเลือกคอนเทนเนอร์ที่เป็นเป้าหมายที่ถูกต้อง หากแอปต้องการซิงค์เฉพาะสถานะการดำเนินการอินพุตสำหรับคอนเทนเนอร์เชิงพื้นที่รายการเดียว ก็จะต้องใช้ส่วนขยายเพิ่มเติม อย่างไรก็ตาม เราคาดว่าจะมุ่งเน้นไปที่ส่วนขยายที่ช่วยให้แอปทำงานตามเหตุการณ์ได้อย่างสมบูรณ์ และหลีกเลี่ยงความจำเป็นในการเรียกใช้ xrSyncActions ในลูปเฟรมแทน
แอปที่อัปเดตไม่บ่อยนักจะจัดการกับอินพุตอย่างไร
- แก้ไขแล้ว ไม่ต้องเปลี่ยนแปลง แม้ว่าจะมีประโยชน์สำหรับ EXT_spatial_container แต่ก็มีประโยชน์นอกคอนเทนเนอร์เชิงพื้นที่ด้วย ซึ่งสามารถจัดการได้ผ่านส่วนขยายช่องทางกิจกรรมและใช้ได้ทั้ง 2 กรณี สำหรับคอนเทนเนอร์เชิงพื้นที่ เราจะเพิ่มวิธีอื่นๆ ในการกรองเหตุการณ์สำหรับคอนเทนเนอร์เชิงพื้นที่รายการเดียว
เราจำเป็นต้องรอเพื่อควบคุม/จำกัดเวลาของลูปอินพุตสำหรับแอปที่มีลูปอินพุตและการแสดงผลที่แยกกันหรือไม่
- แก้ไขแล้ว ไม่ต้องเปลี่ยนแปลง ซึ่งคาดว่าจะได้รับการจัดการผ่านช่องทางกิจกรรมและส่วนขยายคำขอปัจจุบัน ส่วนขยายคำขอปัจจุบันช่วยให้การแสดงผลอิงตามเหตุการณ์และแยกออกจากลูปเฟรมได้
คอนเทนเนอร์เชิงพื้นที่สามารถรับท่าทางสัมพัทธ์กับคอนเทนเนอร์เชิงพื้นที่อื่นๆ ได้ไหม สิ่งสำคัญที่ควรพิจารณาคือ เรามีกรณีการใช้งานสำหรับเรื่องนี้ไหม และหากเป็นเช่นนั้น พื้นที่คอนเทนเนอร์เชิงพื้นที่จะเชื่อมต่อกับ LOCAL อย่างไร
- แก้ไขแล้ว ใช่ ซึ่งสามารถทำได้อยู่แล้วสำหรับคอนเทนเนอร์เชิงพื้นที่ภายในเซสชันเดียวกันโดยไปที่
XR_REFERENCE_SPACE_TYPE_VIEWและควรสนับสนุนเนื้อหาที่ขึ้นอยู่กับมุมมอง สำหรับการแชร์ท่าทางของคอนเทนเนอร์เชิงพื้นที่ในเซสชันต่างๆ (เช่น ไปยังกระบวนการอื่น) เส้นทางที่คาดไว้คือการใช้ประโยชน์จากXR_EXT_spatial_anchorรวมถึงรูปแบบการคงอยู่และการแชร์ที่มีอยู่
- แก้ไขแล้ว ใช่ ซึ่งสามารถทำได้อยู่แล้วสำหรับคอนเทนเนอร์เชิงพื้นที่ภายในเซสชันเดียวกันโดยไปที่
หากมองไม่เห็นพื้นที่ของคอนเทนเนอร์เชิงพื้นที่ จะสามารถระบุตำแหน่งได้ไหม
- แก้ไขแล้ว ไม่ คุณจะค้นหาตำแหน่งของพื้นที่ในคอนเทนเนอร์เชิงพื้นที่ไม่ได้เมื่อมองไม่เห็นคอนเทนเนอร์เชิงพื้นที่ ซึ่งหมายความว่าไม่มีเสียงรอบทิศทาง และแอปไม่สามารถ "เตรียม" เนื้อหาที่ขึ้นอยู่กับมุมมองเมื่อมองไม่เห็น spatial_container ทั้ง 2 กรณีนี้ถือว่ายอมรับได้ เนื่องจากเมื่อคอนเทนเนอร์เชิงพื้นที่ไม่ปรากฏ แอปควรหยุดการโหลด CPU/GPU ที่ใช้สำหรับคอนเทนเนอร์เชิงพื้นที่นั้น
คาดว่าจะวางพื้นที่คอนเทนเนอร์เชิงพื้นที่ไว้ที่ใดในคอนเทนเนอร์เชิงพื้นที่ คำแนะนำเป็นจุดศูนย์กลางหรือจุดต่ำสุด (minX, minY, minZ)
- แก้ไขแล้ว ตรงกลาง ไม่มีตำแหน่งใดที่ไม่เคลื่อนไหวในลักษณะที่คาดหวังจาก UX การปรับขนาดคอนเทนเนอร์เชิงพื้นที่ (ขอบที่เคลื่อนไหว) Center มักใช้ในส่วนอื่นๆ ของ OpenXR เราไม่ได้จัดแนวให้สอดคล้องกับหน้าต่างในการประมวลผลแบบ 2 มิติซึ่งใช้พิกัดต่ำสุด เนื่องจากโปรแกรมดูโมเดล 3 มิติมักไม่เป็นไปตามข้อตกลงนี้
รันไทม์ควรสร้างทรัพยากรที่อยู่ภายใต้คอนเทนเนอร์เชิงพื้นที่เมื่อใด ซึ่งบางครั้งเกี่ยวข้องกับ IPC ที่มีบริการของระบบ
- แก้ไขแล้ว พร้อมกันโดยเป็นส่วนหนึ่งของ
xrCreateSpatialContainerEXTแม้ว่าอาจมี IPC เข้ามาเกี่ยวข้อง แต่โดยทั่วไปแล้วการสร้างคอนเทนเนอร์จริงนั้นคาดว่าจะมีค่าใช้จ่ายต่ำ ผู้ให้บริการบางรายมี Mutex ทั่วโลกเกี่ยวกับการจัดการคอนเทนเนอร์ แต่โดยทั่วไปแล้วไม่น่าจะต้องรอนาน ปัญหาเกี่ยวกับการแย่งชิง Mutex เป็นข้อบกพร่องเฉพาะของผู้ให้บริการซึ่งคาดว่าผู้ให้บริการแต่ละรายจะแก้ไขได้
- แก้ไขแล้ว พร้อมกันโดยเป็นส่วนหนึ่งของ
เราจำเป็นต้องมีสัญญาณว่า XrSession จะสร้างคอนเทนเนอร์เชิงพื้นที่หรือไม่ และด้วยเหตุนี้จึงไม่รองรับเส้นทางการแสดงผลเดิม
- แก้ไขแล้ว ใช่ เราเปลี่ยนเครื่องจักรสถานะเซสชันในลักษณะพื้นฐาน
ประวัติเวอร์ชัน
ฉบับแก้ไข 1, 06-08-2026 (Jared Finder, Google)
- คำอธิบายส่วนขยายเริ่มต้น