XR_ANDROID_spatial_annotation_tracking
Name String
XR_ANDROID_spatial_annotation_tracking
ประเภทส่วนขยาย
ส่วนขยายอินสแตนซ์
หมายเลขต่อที่ลงทะเบียน
795
การแก้ไข
1
สถานะการให้สัตยาบัน
ยังไม่ให้สัตยาบัน
การขึ้นต่อกันของส่วนขยายและเวอร์ชัน
XR_EXT_spatial_entity
และ
XR_EXT_spatial_image_tracking
วันที่แก้ไขล่าสุด
2026-01-12
สถานะ IP
ไม่มีการอ้างสิทธิ์ใน IP ที่ทราบ
ผู้เขียน
Levana Chen, Google
Christopher Feil, Google
Martin Sundermeyer, Google
David Joseph Tan, Google
Jared Finder, Google
Nihav Jain, Google
ภาพรวม
ส่วนขยายนี้มีความสามารถในการติดตามคำอธิบายประกอบสำหรับส่วนขยาย XR_EXT_spatial_entity เพื่อติดตามคำอธิบายประกอบต่างๆ ในฉาก ซึ่งช่วยให้แอปพลิเคชันวางภาพซ้อนบนออบเจ็กต์จริงหรือเสมือนจริงที่กำหนดโดยการอ้างอิงรันไทม์ได้
ส่วนขยายนี้มีคำอธิบายประกอบประเภทพื้นฐาน "Quad" ซึ่งเป็นรูปหลายเหลี่ยมที่มี 4 ด้านพอดี นั่นคือ รูปสี่เหลี่ยมมุมนูน ซึ่งแสดงถึงกรอบล้อมรอบ 2 มิติทั่วไปภายในการอ้างอิงรันไทม์ คำอธิบายประกอบสี่เหลี่ยมที่ติดตามจะแสดงเป็นเอนทิตีเชิงพื้นที่ที่มี (หรือ "ซึ่งมี") คอมโพเนนต์ต่อไปนี้
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
โดยทั่วไปแล้ว แอปพลิเคชันสามารถใช้ส่วนขยายการติดตามคำอธิบายประกอบเชิงพื้นที่ในรูปแบบต่อไปนี้
- แอปพลิเคชันจะสร้างแฮนเดิลของ XrSpatialReferenceCacheANDROID ก่อน ซึ่งจะเริ่มบันทึกการอ้างอิงรันไทม์จากแหล่งที่มาที่ระบุ
- จากนั้นแอปพลิเคชันจะบันทึกการอ้างอิงรันไทม์ของ XrSpatialReferenceImageEXT และกำหนดคำอธิบายประกอบที่ต้องการในการอ้างอิงในช่วงเวลาของแคชการอ้างอิง
- จากนั้นแอปพลิเคชันจะสร้างแฮนเดิล XrSpatialContextEXT โดยอิงตาม XrSpatialReferenceImageEXT ที่ได้รับจาก XrSpatialCapabilityConfigurationAnnotationTrackingANDROID
- แอปพลิเคชันสามารถทำลายแฮนเดิล XrSpatialReferenceCacheANDROID เพื่อหยุดการบันทึกการอ้างอิงรันไทม์เพื่อลดการใช้งานหน่วยความจำ หรือรอเหตุการณ์
XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDเพื่อยืนยันผลการเริ่มต้น - จากนั้นแอปพลิเคชันจะดึงเหตุการณ์
XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDเพื่อยืนยันผลการเริ่มต้นของคำอธิบายประกอบ - หากการเริ่มต้นสำเร็จ แอปพลิเคชันจะดึงข้อมูลเหตุการณ์
XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXTเพื่อติดตามคำอธิบายประกอบได้ - หากการเริ่มต้นไม่สำเร็จ แอปพลิเคชันสามารถใช้รหัสข้อผิดพลาดที่แสดงในเหตุการณ์เพื่อระบุสาเหตุที่ทำให้ไม่สำเร็จ และทำลายแฮนเดิล XrSpatialContextEXT ที่มีอยู่เพื่อเริ่มคำอธิบายประกอบใหม่
- ไม่ว่าผลการเริ่มต้นจะเป็นอย่างไร แอปพลิเคชันสามารถปล่อยบัฟเฟอร์รูปภาพเพื่อลดการใช้งานหน่วยความจำหลังจากได้รับเหตุการณ์
- แอปพลิเคชันจะค้นหาและค้นหาคำอธิบายประกอบตามรูปแบบการเข้าถึงเอนทิตีเชิงพื้นที่
- แอปพลิเคชันสามารถสร้างแฮนเดิล XrSpatialContextEXT เพิ่มเติมเพื่อติดตามคำอธิบายประกอบภายในข้อมูลอ้างอิงใหม่ในช่วงเวลาของ XrSpatialReferenceCacheANDROID ที่ถูกต้อง
- แอปพลิเคชันสามารถทำลายแฮนเดิล XrSpatialContextEXT เพื่อลดชุดคำอธิบายประกอบที่ตรวจหาและติดตามได้แบบไดนามิกในขณะรันไทม์
การสนับสนุนรันไทม์
รันไทม์ต้องโฆษณาการรองรับความสามารถในการติดตามคำอธิบายประกอบโดยใช้ xrEnumerateSpatialCapabilitiesEXT โดยแสดงรายการความสามารถต่อไปนี้
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
เมื่อรันไทม์รองรับความสามารถในการติดตามคำอธิบายประกอบ
- โดยต้องรองรับคอมโพเนนต์คำอธิบายประกอบอย่างน้อย 1 รายการโดยการแสดงรายการคอมโพเนนต์คำอธิบายประกอบที่รองรับผ่าน xrEnumerateSpatialCapabilityComponentTypesEXT
- โดยต้องรองรับ XrSpatialReferenceImageFormatEXT อย่างน้อย 1 รายการโดยการแสดงรายการรูปแบบอ้างอิงที่รองรับผ่าน xrEnumerateSpatialReferenceImageFormatsEXT โดยตั้งค่า
capabilityเป็นXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID - โดยต้องรองรับ XrSpatialAnnotationReferenceSourceANDROID อย่างน้อย 1 รายการโดยระบุแหล่งข้อมูลอ้างอิงที่รองรับผ่าน xrEnumerateSpatialAnnotationReferenceSourcesANDROID ที่มี
capabilityตั้งค่าเป็นXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
ฟังก์ชัน xrEnumerateSpatialAnnotationReferenceSourcesANDROID มีคำจำกัดความดังนี้
XrResult xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
XrInstance instance,
XrSystemId systemId,
XrSpatialCapabilityEXT capability,
uint32_t sourceCapacityInput,
uint32_t* sourceCountOutput,
XrSpatialAnnotationReferenceSourceANDROID* sources);
คำอธิบายพารามิเตอร์
instanceเป็นแฮนเดิลของ XrInstancesystemIdคือXrSystemIdที่จะมีการแจงนับแหล่งอ้างอิงcapabilityคือ XrSpatialCapabilityEXT ที่จะมีการแจงนับแหล่งอ้างอิงsourceCapacityInputคือความจุของอาร์เรย์sourcesหรือ 0 เพื่อระบุคำขอเรียกความจุที่จำเป็นsourceCountOutputคือจำนวนแหล่งที่มา หรือความจุที่จำเป็นในกรณีที่sourceCapacityInputไม่เพียงพอsourcesคืออาร์เรย์ของ XrSpatialAnnotationReferenceSourceANDROID อาจเป็นNULLหากsourceCapacityInputเป็น 0- ดูคำอธิบายโดยละเอียดเกี่ยวกับการดึงข้อมูลขนาด
sourcesที่จำเป็นได้ที่ส่วนพารามิเตอร์ขนาดบัฟเฟอร์
แอปพลิเคชันสามารถแสดงรายการแหล่งที่มาอ้างอิงที่ XrSystemId ที่ระบุรองรับได้โดยใช้ xrEnumerateSpatialAnnotationReferenceSourcesANDROID
รันไทม์ต้องไม่แสดงรายการแหล่งที่มาอ้างอิงที่ไม่ได้เปิดใช้ส่วนขยายสำหรับ instance
การใช้งานที่ถูกต้อง (โดยนัย)
- คุณต้องเปิดใช้
XR_ANDROID_spatial_annotation_trackingส่วนขยายก่อนที่จะเรียกใช้ xrEnumerateSpatialAnnotationReferenceSourcesANDROID -
instanceต้องเป็นแฮนเดิล XrInstance ที่ถูกต้อง -
capabilityต้องเป็นค่า XrSpatialCapabilityEXT ที่ถูกต้อง -
sourceCountOutputต้องเป็น Pointer ไปยังค่าuint32_t - หาก
sourceCapacityInputไม่ใช่0sourcesต้องเป็น Pointer ไปยัง อาร์เรย์ ของค่าsourceCapacityInputXrSpatialAnnotationReferenceSourceANDROID
รหัสการคืนสินค้า
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXTXR_ERROR_SYSTEM_INVALIDXR_ERROR_VALIDATION_FAILURE
typedef enum XrSpatialAnnotationReferenceSourceANDROID {
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID = 0,
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MEDIA_PROJECTION_ANDROID = 1,
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSpatialAnnotationReferenceSourceANDROID;
การแจงนับ XrSpatialAnnotationReferenceSourceANDROID อธิบายแหล่งที่มาของการอ้างอิงซึ่งให้ข้อมูลเมตาสำหรับคำอธิบายประกอบ
โดย Enum มีความหมายดังนี้
คำอธิบาย Enum
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID
รูปภาพอ้างอิงคือรูปภาพที่ไม่ได้ครอบตัดซึ่งเอาต์พุตจาก Android Camera API เช่น รูปภาพจาก ImageReader ที่เชื่อมโยงกับ CameraDevice ของ Camera2 หรือ ImageProxy จาก ImageAnalysis ที่เชื่อมโยงกับ CameraX โดยปกติแล้วจะเป็นกล้อง RGB กล้องใดกล้องหนึ่งที่หันไปข้างหน้า
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MEDIA_PROJECTION_ANDROID
รูปภาพอ้างอิงคือรูปภาพที่ไม่ได้ครอบตัดซึ่งเอาต์พุตจาก Android MediaProjection API เช่น รูปภาพจาก ImageReader ที่เชื่อมโยงกับจอแสดงผลเสมือน MediaProjection ซึ่งอาจรวมถึงเนื้อหาเสมือนจริงและเนื้อหาจริง
โครงสร้าง XrSystemSpatialAnnotationPropertiesANDROID มีคำจำกัดความดังนี้
typedef struct XrSystemSpatialAnnotationPropertiesANDROID {
XrStructureType type;
void* next;
uint32_t referenceCacheTimespan;
uint32_t maxReferencePixelWidth;
uint32_t maxReferencePixelHeight;
uint32_t maxReferenceCount;
uint32_t maxAnnotationCount;
} XrSystemSpatialAnnotationPropertiesANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้างreferenceCacheTimespanระบุช่วงเวลาเป็นวินาทีของแฮนเดิล XrSpatialReferenceCacheANDROID ที่ถูกต้องmaxReferencePixelWidthระบุความกว้างสูงสุดของขอบรูปภาพอ้างอิงในหน่วยพิกเซลmaxReferencePixelHeightระบุความสูงสูงสุดของขอบรูปภาพอ้างอิงเป็นพิกเซลmaxReferenceCountระบุจำนวนสูงสุดของรูปภาพอ้างอิงที่จะจัดสรรพร้อมกันmaxAnnotationCountระบุจำนวนสูงสุดของคำอธิบายประกอบที่จะติดตามพร้อมกัน
เมื่อรันไทม์รองรับความสามารถในการติดตามคำอธิบายประกอบ แอปพลิเคชันสามารถตรวจสอบพร็อพเพอร์ตี้ของระบบที่เกี่ยวข้องได้โดยการเชื่อมต่อโครงสร้าง XrSystemSpatialAnnotationPropertiesANDROID กับ XrSystemProperties เมื่อเรียกใช้ xrGetSystemProperties
หาก XrSpatialReferenceImageEXT :: width จาก XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference เกิน maxReferencePixelWidth รันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE เมื่อเรียกใช้ xrCreateSpatialContextAsyncEXT
หาก XrSpatialReferenceImageEXT :: height จาก XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference เกิน maxReferencePixelHeight รันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE เมื่อเรียกใช้ xrCreateSpatialContextAsyncEXT
หาก XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: time อยู่นอกช่วงเวลาของ XrSpatialReferenceCacheANDROID :: cache รันไทม์ต้องแสดงผล XR_ERROR_TIME_INVALID เมื่อเรียกใช้ xrCreateSpatialContextAsyncEXT แอปพลิเคชันสามารถสร้างแฮนเดิล XrSpatialContextEXT ใหม่ด้วยการอ้างอิงใหม่ในช่วงระยะเวลาของ XrSpatialReferenceCacheANDROID
หากจำนวนรูปภาพอ้างอิงที่จัดสรรเกิน maxReferenceCount รันไทม์ต้องแสดงผล XR_ERROR_LIMIT_REACHED และระบุการเริ่มต้นที่ไม่สำเร็จผ่าน XrEventDataSpatialAnnotationTrackingANDROID :: initializationResult แอปพลิเคชันสามารถทำลายแฮนเดิล XrSpatialContextEXT และลองอีกครั้งหลังจากที่การเริ่มต้นที่รอดำเนินการเสร็จสมบูรณ์
หากจำนวนคำอธิบายประกอบที่ใช้งานอยู่เกิน maxAnnotationCount รันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE เมื่อเรียกใช้ xrCreateSpatialContextAsyncEXT
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_spatial_annotation_trackingก่อนจึงจะใช้ XrSystemSpatialAnnotationPropertiesANDROID ได้ -
typeต้องเป็นXR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง
แคชการอ้างอิงรันไทม์
XR_DEFINE_HANDLE(XrSpatialReferenceCacheANDROID)
แฮนเดิล XrSpatialReferenceCacheANDROID แสดงแคชของการอ้างอิงรันไทม์ที่บันทึกจากแหล่งที่มาที่กำหนด
ฟังก์ชัน xrCreateSpatialReferenceCacheAsyncANDROID มีคำจำกัดความดังนี้
XrResult xrCreateSpatialReferenceCacheAsyncANDROID(
XrSession session,
const XrSpatialReferenceCacheCreateInfoANDROID* createInfo,
XrFutureEXT* future);
คำอธิบายพารามิเตอร์
sessionคือ XrSession ที่แคชอ้างอิงจะใช้งานอยู่createInfoคือตัวชี้ไปยัง XrSpatialReferenceCacheCreateInfoANDROID ที่ใช้เพื่อระบุพารามิเตอร์แคชอ้างอิงfutureเป็นตัวชี้ไปยังแฮนเดิลเอาต์พุตของXrFutureEXT
แอปพลิเคชันสามารถสร้างแฮนเดิล XrSpatialReferenceCacheANDROID ได้โดยเรียกใช้ xrCreateSpatialReferenceCacheAsyncANDROID รันไทม์อาจใช้เวลาสักครู่ในการเริ่มต้นบริการติดตาม จากนั้นแอปพลิเคชันจะเรียกใช้ xrCreateSpatialReferenceCacheCompleteANDROID ซ้ำๆ เพื่อตรวจสอบว่าการดำเนินการแบบไม่พร้อมกันนี้เสร็จสมบูรณ์แล้ว
รันไทม์ต้องแสดงผล XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT หาก XrSpatialReferenceCacheCreateInfoANDROID :: capability ไม่ได้แสดงอยู่ใน xrEnumerateSpatialCapabilitiesEXT
รันไทม์ต้องแสดงผล XR_ERROR_FEATURE_UNSUPPORTED หาก XrSpatialReferenceCacheCreateInfoANDROID :: source ไม่ได้แสดงโดย xrEnumerateSpatialAnnotationReferenceSourcesANDROID สำหรับความสามารถที่ระบุ
แอปพลิเคชันสร้างแฮนเดิลได้เพียง 1 รายการต่อแหล่งที่มาสำหรับความสามารถที่กำหนด ไม่เช่นนั้น รันไทม์ต้องแสดงผล XR_ERROR_LIMIT_REACHED
จากนั้นแอปพลิเคชันจะบันทึกการอ้างอิงรันไทม์ในช่วงเวลาของแฮนเดิล XrSpatialReferenceCacheANDROID เพื่อกำหนดค่าแฮนเดิล XrSpatialContextEXT ใหม่ได้
การใช้งานที่ถูกต้อง (โดยนัย)
- คุณต้องเปิดใช้ส่วนขยาย
XR_ANDROID_spatial_annotation_trackingก่อนที่จะเรียกใช้ xrCreateSpatialReferenceCacheAsyncANDROID -
sessionต้องเป็นแฮนเดิล XrSession ที่ถูกต้อง -
createInfoต้องเป็นตัวชี้ไปยังโครงสร้าง XrSpatialReferenceCacheCreateInfoANDROID ที่ถูกต้อง -
futureต้องเป็นตัวชี้ไปยังค่าXrFutureEXT
รหัสการคืนสินค้า
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_SPATIAL_CAPABILITY_UNSUPPORTED_EXTXR_ERROR_VALIDATION_FAILURE
โครงสร้าง XrSpatialReferenceCacheCreateInfoANDROID มีคำจำกัดความดังนี้
typedef struct XrSpatialReferenceCacheCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
XrSpatialAnnotationReferenceSourceANDROID source;
} XrSpatialReferenceCacheCreateInfoANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้capabilityคือ XrSpatialCapabilityEXT ที่อธิบายว่าสร้างแคชอ้างอิงสำหรับความสามารถใดsourceคือ XrSpatialAnnotationReferenceSourceANDROID ที่อธิบายแหล่งที่มาของแคชอ้างอิง
โครงสร้าง XrSpatialReferenceCacheCreateInfoANDROID อธิบายข้อมูลในการสร้างแฮนเดิล XrSpatialReferenceCacheANDROID
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_spatial_annotation_trackingก่อนจึงจะใช้ XrSpatialReferenceCacheCreateInfoANDROID ได้ -
typeต้องเป็นXR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง -
capabilityต้องเป็นค่า XrSpatialCapabilityEXT ที่ถูกต้อง -
sourceต้องเป็นค่า XrSpatialAnnotationReferenceSourceANDROID ที่ถูกต้อง
ฟังก์ชัน xrCreateSpatialReferenceCacheCompleteANDROID มีคำจำกัดความดังนี้
XrResult xrCreateSpatialReferenceCacheCompleteANDROID(
XrSession session,
XrFutureEXT future,
XrCreateSpatialReferenceCacheCompletionANDROID* completion);
คำอธิบายพารามิเตอร์
sessionคือ XrSession ที่ส่งไปยัง xrCreateSpatialReferenceCacheAsyncANDROID ก่อนหน้านี้ ::sessionfutureคือXrFutureEXTที่ได้รับจาก xrCreateSpatialReferenceCacheAsyncANDROID ::futurecompletionเป็น Pointer ไปยัง XrCreateSpatialReferenceCacheCompletionANDROID
แอปพลิเคชันสามารถเรียกใช้ xrCreateSpatialReferenceCacheCompleteANDROID เพื่อรอให้การดำเนินการแบบไม่พร้อมกันที่เริ่มโดย xrCreateSpatialReferenceCacheAsyncANDROID เสร็จสมบูรณ์
รันไทม์ต้องแสดงผล XR_ERROR_FUTURE_PENDING_EXT หาก future ไม่อยู่ในสถานะพร้อมใช้งาน รันไทม์ต้องแสดงผล XR_ERROR_FUTURE_INVALID_EXT หาก future เสร็จสมบูรณ์หรือถูกยกเลิกแล้ว
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_spatial_annotation_trackingก่อนที่จะเรียกใช้ xrCreateSpatialReferenceCacheCompleteANDROID -
sessionต้องเป็นแฮนเดิล XrSession ที่ถูกต้อง -
completionต้องเป็นตัวชี้ไปยังโครงสร้าง XrCreateSpatialReferenceCacheCompletionANDROID
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_FUTURE_INVALID_EXTXR_ERROR_FUTURE_PENDING_EXTXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
โครงสร้าง XrCreateSpatialReferenceCacheCompletionANDROID มีคำจำกัดความดังนี้
typedef struct XrCreateSpatialReferenceCacheCompletionANDROID {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialReferenceCacheANDROID referenceCache;
} XrCreateSpatialReferenceCacheCompletionANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้futureResultคือ XrResult ของการดำเนินการสร้างแคชอ้างอิงreferenceCacheคือแฮนเดิล XrSpatialReferenceCacheANDROID หากการดำเนินการสำเร็จ
รหัสการแสดงผลในอนาคต
ค่า futureResult
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHED
หาก futureResult เป็นรหัสที่ระบุความสำเร็จ รันไทม์ต้องแสดงแฮนเดิล referenceCache ที่ถูกต้อง หาก referenceCache ใช้ได้ ก็จะใช้ได้ภายในอายุการใช้งานของ xrCreateSpatialReferenceCacheAsyncANDROID :: session เท่านั้น หรือจนกว่าแอปพลิเคชันจะทำลายแฮนเดิลด้วย xrDestroySpatialReferenceCacheANDROID แล้วแต่ว่าเหตุการณ์ใดจะเกิดขึ้นก่อน
เมื่อ referenceCache ใช้ได้ ระบบจะบันทึกแคชภายใน XrSystemSpatialAnnotationPropertiesANDROID :: referenceCacheTimespan
การใช้งานที่ถูกต้อง (โดยนัย)
- คุณต้องเปิดใช้ส่วนขยาย
XR_ANDROID_spatial_annotation_trackingก่อนจึงจะใช้ XrCreateSpatialReferenceCacheCompletionANDROID ได้ -
typeต้องเป็นXR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง -
futureResultต้องเป็นค่า XrResult ที่ถูกต้อง -
referenceCacheต้องเป็นแฮนเดิล XrSpatialReferenceCacheANDROID ที่ถูกต้อง
ฟังก์ชัน xrDestroySpatialReferenceCacheANDROID มีคำจำกัดความดังนี้
XrResult xrDestroySpatialReferenceCacheANDROID(
XrSpatialReferenceCacheANDROID cacheHandle);
คำอธิบายพารามิเตอร์
cacheHandleคือ XrSpatialReferenceCacheANDROID ที่สร้างไว้ก่อนหน้านี้โดย xrCreateSpatialReferenceCacheAsyncANDROID
แอปพลิเคชันสามารถเรียกฟังก์ชัน xrDestroySpatialReferenceCacheANDROID เพื่อปล่อยแฮนเดิล cacheHandle และทรัพยากรพื้นฐานเมื่อสร้างบริบทเชิงพื้นที่เสร็จแล้ว
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้
XR_ANDROID_spatial_annotation_trackingส่วนขยายก่อนที่จะเรียกใช้ xrDestroySpatialReferenceCacheANDROID -
cacheHandleต้องเป็นแฮนเดิล XrSpatialReferenceCacheANDROID ที่ถูกต้อง
ความปลอดภัยของเธรด
- การเข้าถึง
cacheHandleและแฮนเดิลย่อยทั้งหมดต้องซิงค์ภายนอก
รหัสการคืนสินค้า
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
การกำหนดค่า
โครงสร้าง XrSpatialCapabilityConfigurationAnnotationTrackingANDROID มีคำจำกัดความดังนี้
typedef struct XrSpatialCapabilityConfigurationAnnotationTrackingANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
XrSpatialReferenceCacheANDROID cache;
XrTime time;
XrSpatialReferenceImageEXT reference;
} XrSpatialCapabilityConfigurationAnnotationTrackingANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้างcapabilityเป็น XrSpatialCapabilityEXT และต้องเป็นXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROIDenabledComponentCountคือuint32_tที่อธิบายจำนวนองค์ประกอบในอาร์เรย์enabledComponentsenabledComponentsเป็นตัวชี้ไปยังอาร์เรย์ของ XrSpatialComponentTypeEXTcacheคือ XrSpatialReferenceCacheANDROID ที่สร้างไว้ก่อนหน้านี้เพื่อบันทึกการอ้างอิงรันไทม์สำหรับการกำหนดค่าreferencetimeคือXrTimeที่บันทึกreferencereferenceคือ XrSpatialReferenceImageEXT ที่มีคำอธิบายประกอบซึ่งเชื่อมโยงกับพอยน์เตอร์ถัดไป
แอปพลิเคชันสามารถเปิดใช้XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROIDความสามารถเชิงพื้นที่ได้โดยการเพิ่มPointerไปยังโครงสร้าง XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ใน XrSpatialContextCreateInfoEXT :: capabilityConfigs
รันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE หาก capability ไม่ใช่ XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
รันไทม์ต้องแสดงผล XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT หาก reference ไม่มีคำอธิบายประกอบ
รันไทม์ต้องแสดง XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT หากคอมโพเนนต์คำอธิบายประกอบแสดงอยู่ใน enabledComponents แต่ไม่มีคำอธิบายประกอบที่สอดคล้องกันซึ่งเชื่อมโยงกับ reference
รันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE หาก cache ไม่ได้เป็นของ XrSession เดียวกันที่ส่งไปยัง xrCreateSpatialContextAsyncEXT
รันไทม์ต้องแสดงผล XR_ERROR_TIME_INVALID หาก time อยู่นอกช่วงเวลาของ cache
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_spatial_annotation_trackingก่อนจึงจะใช้ XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ได้ -
typeต้องเป็นXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง -
capabilityต้องเป็นค่า XrSpatialCapabilityEXT ที่ถูกต้อง -
enabledComponentsต้องเป็นตัวชี้ไปยังอาร์เรย์ของค่า XrSpatialComponentTypeEXT ที่ถูกต้องenabledComponentCount -
cacheต้องเป็นแฮนเดิล XrSpatialReferenceCacheANDROID ที่ถูกต้อง -
referenceต้องเป็นโครงสร้าง XrSpatialReferenceImageEXT ที่ถูกต้อง - พารามิเตอร์
enabledComponentCountต้องมากกว่า0
เหตุการณ์การติดตามคำอธิบายประกอบ
โครงสร้าง XrEventDataSpatialAnnotationTrackingANDROID มีคำจำกัดความดังนี้
typedef struct XrEventDataSpatialAnnotationTrackingANDROID {
XrStructureType type;
const void* next;
XrSpatialContextEXT spatialContext;
uint32_t annotationIndex;
XrResult initializationResult;
} XrEventDataSpatialAnnotationTrackingANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้างspatialContextคือ XrSpatialContextEXT ที่เปิดใช้งานการติดตามคำอธิบายประกอบannotationIndexจะแมปกับดัชนีจากอาร์เรย์คำอธิบายประกอบที่เชื่อมโยงกับ XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ::referenceinitializationResultแสดงผลลัพธ์การเริ่มต้นของคำอธิบายประกอบ หากไม่ใช่XR_SUCCESSแอปพลิเคชันสามารถทำลายและสร้างแฮนเดิล XrSpatialContextEXT ขึ้นใหม่เพื่อเริ่มต้นคำอธิบายประกอบอีกครั้ง หรือใช้spatialContextต่อไปเพื่อติดตามคำอธิบายประกอบอื่นๆ
การใช้งานที่ถูกต้อง (โดยนัย)
- คุณต้องเปิดใช้ส่วนขยาย
XR_ANDROID_spatial_annotation_trackingก่อนจึงจะใช้ XrEventDataSpatialAnnotationTrackingANDROID ได้ -
typeต้องเป็นXR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง
รันไทม์ต้องป้อนข้อมูล XrEventDataSpatialAnnotationTrackingANDROID สำหรับคำอธิบายประกอบแต่ละรายการเพื่อระบุว่าการเริ่มต้นเสร็จสมบูรณ์แล้ว ไม่ว่าผลการเริ่มต้นจะเป็นอย่างไร แอปพลิเคชันสามารถปล่อยบัฟเฟอร์รูปภาพเพื่อลดการใช้งานหน่วยความจำหลังจากได้รับเหตุการณ์
รันไทม์ต้องป้อนข้อมูล initializationResult ด้วย XR_SUCCESS หากเริ่มต้นหมายเหตุสำเร็จ จากนั้นแอปพลิเคชันจะดึงเหตุการณ์ XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT เพื่อติดตามคำอธิบายประกอบได้
ไม่เช่นนั้น รันไทม์ต้องป้อนข้อมูล initializationResult ด้วยรหัสข้อผิดพลาดที่เหมาะสมเพื่อระบุเหตุผลที่ทำให้ดำเนินการไม่สำเร็จ แอปพลิเคชันสามารถทำลายแฮนเดิล XrSpatialContextEXT เพื่อเริ่มคำอธิบายประกอบใหม่หรือใช้ spatialContext ต่อไปเพื่อติดตามคำอธิบายประกอบอื่นๆ
การอธิบายรูปภาพ
รันไทม์ต้องโฆษณาการรองรับคำอธิบายประกอบสี่เหลี่ยมโดยใช้ xrEnumerateSpatialCapabilityComponentTypesEXT โดยแสดงรายการประเภทคอมโพเนนต์ต่อไปนี้
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
Quad Reference
โครงสร้าง XrSpatialAnnotationQuadReferenceANDROID มีคำจำกัดความดังนี้
typedef struct XrSpatialAnnotationQuadReferenceANDROID {
XrStructureType type;
const void* next;
uint32_t quadCount;
const XrSpatialAnnotationQuadANDROID* quads;
} XrSpatialAnnotationQuadReferenceANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้างquadCountคือuint32_tที่อธิบายจำนวนองค์ประกอบในอาร์เรย์quadsquadsคือ Pointer ไปยังอาร์เรย์ของ XrSpatialAnnotationQuadANDROID
เมื่อรันไทม์รองรับคำอธิบายประกอบสี่เหลี่ยม แอปพลิเคชันสามารถกำหนดค่าคำอธิบายประกอบได้โดยการเชื่อมต่อโครงสร้าง XrSpatialAnnotationQuadReferenceANDROID กับ XrSpatialReferenceImageEXT :: next และตั้งค่าการอ้างอิงใน XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference เมื่อสร้างแฮนเดิล XrSpatialContextEXT
รันไทม์ต้องแสดงผล XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT จาก xrCreateSpatialContextAsyncEXT หาก quadCount เป็น 0
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้
XR_ANDROID_spatial_annotation_trackingส่วนขยายก่อนจึงจะใช้ XrSpatialAnnotationQuadReferenceANDROID ได้ -
typeต้องเป็นXR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง -
quadsต้องเป็นตัวชี้ไปยังอาร์เรย์ของโครงสร้างquadCountXrSpatialAnnotationQuadANDROID ที่ถูกต้อง - พารามิเตอร์
quadCountต้องมากกว่า0
โครงสร้าง XrSpatialAnnotationQuadANDROID มีคำจำกัดความดังนี้
typedef struct XrSpatialAnnotationQuadANDROID {
XrSpatialAnnotationQuadAlignmentANDROID alignment;
XrVector2f upperLeft;
XrVector2f upperRight;
XrVector2f lowerRight;
XrVector2f lowerLeft;
} XrSpatialAnnotationQuadANDROID;
คำอธิบายสมาชิก
alignmentคือ XrSpatialAnnotationQuadAlignmentANDROID ของรูปสี่เหลี่ยมupperLeftคือ XrVector2f ที่อธิบายพิกัดของมุมบนซ้ายของรูปสี่เหลี่ยมที่เกี่ยวข้องกับจุดเริ่มต้นupperRightคือ XrVector2f ที่อธิบายพิกัดของมุมขวาบนของรูปสี่เหลี่ยมที่เกี่ยวข้องกับจุดกำเนิดlowerRightคือ XrVector2f ที่อธิบายพิกัดของมุมขวาล่างของรูปสี่เหลี่ยมที่เกี่ยวข้องกับจุดกำเนิดlowerLeftคือ XrVector2f ที่อธิบายพิกัดของมุมซ้ายล่างของรูปสี่เหลี่ยมที่เกี่ยวข้องกับต้นทาง
Quad ในพื้นที่ 2 มิติคือรูปสี่เหลี่ยมด้านขนานนูนที่มีลำดับตามเข็มนาฬิกา ค่าของมุมทั้ง 4 เกี่ยวข้องกับจุดกําเนิด (0, 0) ที่เชื่อมโยงกับรูปสี่เหลี่ยม
- เมื่อเชื่อมโยงกับ XrSpatialReferenceImageEXT ต้นทางคือมุมซ้ายบนของรูปภาพที่ X แมปกับพิกเซลตามความกว้าง และ Y แมปกับพิกเซลตามความสูง
- เมื่อเชื่อมโยงกับ XrSpatialAnnotationQuadDataANDROID ต้นทางจะระบุโดย XrSpaceLocationData ::
poseของ XrSpatialAnnotationQuadDataANDROID ::origin
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_spatial_annotation_trackingก่อนจึงจะใช้ XrSpatialAnnotationQuadANDROID ได้ -
alignmentต้องเป็นค่า XrSpatialAnnotationQuadAlignmentANDROID ที่ถูกต้อง
typedef enum XrSpatialAnnotationQuadAlignmentANDROID {
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SCREEN_ANDROID = 0,
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID = 1,
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSpatialAnnotationQuadAlignmentANDROID;
การแจงนับ XrSpatialAnnotationQuadAlignmentANDROID อธิบายการจัดแนวของคำอธิบายประกอบสี่เหลี่ยม
โดย Enum มีความหมายดังนี้
คำอธิบาย Enum
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SCREEN_ANDROID
สี่เหลี่ยมจัตุรัสของคำอธิบายประกอบจะขนานกับระนาบหน้าจอ ในขณะที่การหมุนในระนาบจะยังคงล็อกไว้กับแรงโน้มถ่วงของโลก เอาต์พุตจะปรากฏเป็นกรอบล้อมรอบปกติที่ตั้งตรง
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID
โดยจะยึดสี่เหลี่ยมจัตุรัสของคำอธิบายประกอบกับออบเจ็กต์โดยตรง ซึ่งจะตรงกับการจัดแนวที่กำหนดไว้ในรูปภาพอ้างอิง เอาต์พุตคือรูปสี่เหลี่ยมด้านขนานนูน ซึ่งจะปรับรูปร่างให้ตรงกับมุมมองของออบเจ็กต์
คอมโพเนนต์ Quad
โครงสร้าง XrSpatialAnnotationQuadDataANDROID มีคำจำกัดความดังนี้
typedef struct XrSpatialAnnotationQuadDataANDROID {
uint32_t annotationIndex;
XrSpaceLocationData origin;
XrSpatialAnnotationQuadANDROID quad;
} XrSpatialAnnotationQuadDataANDROID;
คำอธิบายสมาชิก
annotationIndexคือการแมปดัชนีกับอาร์เรย์ XrSpatialAnnotationQuadReferenceANDROID ::quadsที่เชื่อมโยงกับการอ้างอิงที่ส่งโดย XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ::referenceoriginคือ XrSpaceLocationData ที่อธิบายต้นทางของระนาบ 2 มิติซึ่งมีจุดเริ่มต้นของรูปสี่เหลี่ยม รันไทม์ต้องตั้งค่า XrSpaceLocationData ::locationFlagsเพื่อระบุบิตที่ถูกต้องของท่าทางต้นทางquadคือ XrSpatialAnnotationQuadANDROID ที่แสดงถึงรูปสี่เหลี่ยมในพื้นที่เฉพาะ ใช้originเพื่อเปลี่ยนรูปสี่เหลี่ยมเป็นพื้นที่ท่าทาง
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้
XR_ANDROID_spatial_annotation_trackingส่วนขยายก่อนใช้ XrSpatialAnnotationQuadDataANDROID -
originต้องเป็นโครงสร้าง XrSpaceLocationData ที่ถูกต้อง -
quadต้องเป็นโครงสร้าง XrSpatialAnnotationQuadANDROID ที่ถูกต้อง
โครงสร้าง XrSpatialComponentAnnotationQuadListANDROID มีการกำหนดไว้ดังนี้
typedef struct XrSpatialComponentAnnotationQuadListANDROID {
XrStructureType type;
void* next;
uint32_t quadCount;
XrSpatialAnnotationQuadDataANDROID* quads;
} XrSpatialComponentAnnotationQuadListANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้างquadCountคือuint32_tที่อธิบายจำนวนองค์ประกอบในอาร์เรย์quadsquadsเป็นอาร์เรย์ของ XrSpatialAnnotationQuadDataANDROID
แอปพลิเคชันสามารถค้นหาคอมโพเนนต์คำอธิบายประกอบสี่เหลี่ยมของเอนทิตีเชิงพื้นที่ใน XrSpatialSnapshotEXT ได้โดยการเพิ่ม XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID ใน XrSpatialComponentDataQueryConditionEXT :: componentTypes และเพิ่ม XrSpatialComponentAnnotationQuadListANDROID ลงในเชนพอยน์เตอร์ถัดไปของ XrSpatialComponentDataQueryResultEXT
รันไทม์ต้องส่งคืน XR_ERROR_VALIDATION_FAILURE จาก xrQuerySpatialComponentDataEXT หาก XrSpatialComponentAnnotationQuadListANDROID อยู่ในเชนถัดไปของ XrSpatialComponentDataQueryResultEXT :: next แต่ XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID ไม่ได้รวมอยู่ใน XrSpatialComponentDataQueryConditionEXT :: componentTypes
รันไทม์ต้องส่งคืน XR_ERROR_SIZE_INSUFFICIENT จาก xrQuerySpatialComponentDataEXT หาก quadCount น้อยกว่า XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้
XR_ANDROID_spatial_annotation_trackingส่วนขยายก่อนจึงจะใช้ XrSpatialComponentAnnotationQuadListANDROID ได้ -
typeต้องเป็นXR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง -
quadsต้องเป็นตัวชี้ไปยังอาร์เรย์ของโครงสร้างquadCountXrSpatialAnnotationQuadDataANDROID - พารามิเตอร์
quadCountต้องมากกว่า0
โค้ดตัวอย่าง
ตรวจสอบการรองรับรันไทม์
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีตรวจสอบว่ารันไทม์รองรับความสามารถในการติดตามคำอธิบายประกอบหรือไม่
XrInstance instance; // previously initialized
XrSystemId systemId; // previously initialized
XrSession session; // previously initialized
XrSpace localSpace; // previously initialized, e.g. from
// XR_REFERENCE_SPACE_TYPE_LOCAL
PFN_xrEnumerateSpatialCapabilitiesEXT xrEnumerateSpatialCapabilitiesEXT;
PFN_xrEnumerateSpatialAnnotationReferenceSourcesANDROID xrEnumerateSpatialAnnotationReferenceSourcesANDROID;
PFN_xrEnumerateSpatialReferenceImageFormatsEXT xrEnumerateSpatialReferenceImageFormatsEXT;
PFN_xrEnumerateSpatialCapabilityComponentTypesEXT xrEnumerateSpatialCapabilityComponentTypesEXT;
// Check spatial annotation tracking capability
uint32_t capabilityCount;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0,
&capabilityCount, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCount);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilityCount,
&capabilityCount,
capabilities.data()));
if (std::find(capabilities.begin(), capabilities.end(),
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID) ==
capabilities.end()) {
// System does not support spatial annotation tracking.
return;
}
// Inspect system properties for annotation tracking variables
XrSystemSpatialAnnotationPropertiesANDROID annotationSystemProperties{
XR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROID};
XrSystemProperties systemProperties{.type = XR_TYPE_SYSTEM_PROPERTIES,
.next = &annotationSystemProperties,
.systemId = systemId};
CHK_XR(xrGetSystemProperties(instance, systemId, &systemProperties));
if (annotationSystemProperties.maxAnnotationCount == 0) {
// System does not support any active annotations.
return;
}
// Enumerate supported reference sources
uint32_t sourceCountOutput = 0;
XrSpatialAnnotationReferenceSourceANDROID desiredSource =
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID;
CHK_XR(xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
0, &sourceCountOutput, nullptr));
std::vector<XrSpatialAnnotationReferenceSourceANDROID> sources(sourceCountOutput);
CHK_XR(xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
sourceCountOutput, &sourceCountOutput, sources.data()));
if (std::find(sources.begin(), sources.end(), desiredSource) == sources.end()) {
// The desired source is not supported.
return;
}
// Enumerate supported reference image formats, provided by XR_EXT_spatial_image_tracking.
uint32_t formatCountOutput = 0;
XrSpatialReferenceImageFormatEXT desiredFormat =
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_YUV_420_888_EXT; // Or XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT for screenshot.
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID, 0,
&formatCountOutput, nullptr));
std::vector<XrSpatialReferenceImageFormatEXT> formats(formatCountOutput);
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
formats.size(), &formatCountOutput, formats.data()));
if (std::find(formats.begin(), formats.end(), desiredFormat) == formats.end()) {
// The desired format is not supported
return;
}
// Enumerate supported components for annotation tracking capability.
XrSpatialCapabilityComponentTypesEXT capabilityComponentTypes{
XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
&capabilityComponentTypes));
std::vector<XrSpatialComponentTypeEXT>
annotationTypes(capabilityComponentTypes.componentTypeCountOutput);
capabilityComponentTypes.componentTypeCapacityInput = annotationTypes.size();
capabilityComponentTypes.componentTypes = annotationTypes.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(
instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
&capabilityComponentTypes));
// Check supported annotation components.
XrSpatialComponentTypeEXT desiredComponent =
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID;
const auto supportedComponent = [&annotationTypes](
XrSpatialComponentTypeEXT component) {
return std::find(annotationTypes.begin(), annotationTypes.end(), component) !=
annotationTypes.end();
};
if (!supportedComponent(desiredComponent)) {
// The desired annotation is not supported.
return;
}
กำหนดค่าการอธิบายประกอบแบบสี่เหลี่ยม
โค้ดตัวอย่างต่อไปนี้แสดงวิธีกำหนดค่าคำอธิบายประกอบสี่เหลี่ยม
XrInstance instance; // previously initialized
XrSystemId systemId; // previously initialized
XrSession session; // previously initialized
XrSpace localSpace; // previously initialized, e.g. from
// XR_REFERENCE_SPACE_TYPE_LOCAL
PFN_xrCreateSpatialReferenceCacheAsyncANDROID xrCreateSpatialReferenceCacheAsyncANDROID;
PFN_xrCreateSpatialReferenceCacheCompleteANDROID xrCreateSpatialReferenceCacheCompleteANDROID;
PFN_xrDestroySpatialReferenceCacheANDROID xrDestroySpatialReferenceCacheANDROID;
PFN_xrCreateSpatialContextAsyncEXT xrCreateSpatialContextAsyncEXT;
PFN_xrCreateSpatialContextCompleteEXT xrCreateSpatialContextCompleteEXT;
void (*waitUntilReady)(XrFutureEXT);
XrSpatialReferenceImageFormatEXT desiredFormat;
XrSpatialAnnotationReferenceSourceANDROID desiredSource;
XrSpatialComponentTypeEXT desiredComponent;
// Create and start reference cache to prepare for capturing reference images.
XrSpatialReferenceCacheANDROID referenceCache;
XrSpatialReferenceCacheCreateInfoANDROID cacheCreateInfo{
.type = XR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROID,
.next = nullptr,
.capability = XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
.source = desiredSource,
};
XrFutureEXT cacheFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialReferenceCacheAsyncANDROID(session, &cacheCreateInfo, &cacheFuture));
waitUntilReady(cacheFuture);
XrCreateSpatialReferenceCacheCompletionANDROID cacheCompletion{
XR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROID};
CHK_XR(xrCreateSpatialReferenceCacheCompleteANDROID(session, cacheFuture,
&cacheCompletion));
if (cacheCompletion.futureResult != XR_SUCCESS) {
// Error, reference cache creation failed
return;
}
referenceCache = cacheCompletion.referenceCache;
// Create the reference image with quad annotations
// YUV 4:2:0 Planar:
// ----------------------
// | Y |Cb |Cr |
// ----------------------
XrSpatialReferenceImagePlaneEXT cameraImagePlanes[3];
// for each plane (0=Y, 1=U(cb), 2=V(Cr)) return by Image#getPlanes().
for (int i = 0; i < 3; ++i) {
cameraImagePlanes[i].buffer; // read from Plane#getBuffer().
cameraImagePlanes[i].bufferSize; // set each buffer size. Y = width * height (bytes); U = Y / 4 (bytes); V = Y / 4 (bytes).
cameraImagePlanes[i].rowStride; // read from Plane#getRowStride().
cameraImagePlanes[i].pixelStride; // read from Plane#getPixelStride().
}
XrSpatialReferenceImageEXT referenceImage{
XR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT};
referenceImage.width = 640;
referenceImage.height = 480;
referenceImage.format = desiredFormat;
referenceImage.planeCount = 3;
referenceImage.planes = cameraImagePlanes;
XrSpatialAnnotationQuadANDROID
quad; // quad coordinates within the reference image.
quad.alignment = XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID;
// Set unnormalized pixel coordinates of 4 corners.
quad.upperLeft = {0.0, 0.0};
quad.upperRight = {0.0, 100.0};
quad.lowerRight = {100.0, 100.0};
quad.lowerLeft = {0.0, 100.0};
XrSpatialAnnotationQuadReferenceANDROID quadReference{
XR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROID};
quadReference.quads = &quad;
quadReference.quadCount = 1;
referenceImage.next = &quadReference;
// Create the spatial context with annotation configuration.
XrSpatialContextEXT spatialContext{};
{
const std::array<XrSpatialComponentTypeEXT, 1> enabledComponents = {
desiredComponent,
};
// Configure annotation tracking
XrSpatialCapabilityConfigurationAnnotationTrackingANDROID annotationConfig{
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROID};
annotationConfig.capability =
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID;
annotationConfig.enabledComponentCount = enabledComponents.size();
annotationConfig.enabledComponents = enabledComponents.data();
annotationConfig.cache = referenceCache;
annotationConfig.time; // The time when this reference image is captured.
annotationConfig.reference = referenceImage;
std::vector<XrSpatialCapabilityConfigurationBaseHeaderEXT *>
capabilityConfigs;
capabilityConfigs.push_back(
reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT *>(
&annotationConfig));
XrSpatialContextCreateInfoEXT spatialContextCreateInfo{
XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
XrFutureEXT createContextFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo,
&createContextFuture));
waitUntilReady(createContextFuture);
XrCreateSpatialContextCompletionEXT completion{
XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture,
&completion));
if (completion.futureResult != XR_SUCCESS) {
// Error, spatial context creation failed
return;
}
spatialContext = completion.spatialContext;
CHK_XR(xrDestroySpatialReferenceCacheANDROID(referenceCache));
}
ดูคำอธิบายประกอบที่ใช้งานอยู่
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีค้นหาและค้นหาคำอธิบายประกอบ
XrInstance instance; // previously initialized
XrSession session; // previously initialized
XrSpace localSpace; // previously initialized, e.g. from
// XR_REFERENCE_SPACE_TYPE_LOCAL
XrSpatialContextEXT spatialContext; // previously created
PFN_xrCreateSpatialDiscoverySnapshotAsyncEXT xrCreateSpatialDiscoverySnapshotAsyncEXT;
PFN_xrCreateSpatialDiscoverySnapshotCompleteEXT xrCreateSpatialDiscoverySnapshotCompleteEXT;
PFN_xrQuerySpatialComponentDataEXT xrQuerySpatialComponentDataEXT;
PFN_xrDestroySpatialSnapshotEXT xrDestroySpatialSnapshotEXT;
PFN_xrPollEvent xrPollEvent;
PFN_xrDestroySpatialContextEXT xrDestroySpatialContextEXT;
void (*waitUntilReady)(XrFutureEXT);
XrSpatialComponentTypeEXT desiredComponent; // e.g. XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
auto discoverAnnotations = [&](XrSpatialContextEXT spatialContext, XrTime time,
XrSpace baseSpace) {
std::array<XrSpatialComponentTypeEXT, 1> snapshotComponents{desiredComponent};
XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{
XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
snapshotCreateInfo.componentTypes = snapshotComponents.data();
XrFutureEXT discoveryFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(
spatialContext, &snapshotCreateInfo, &discoveryFuture));
waitUntilReady(discoveryFuture);
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{
XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
completionInfo.baseSpace = baseSpace;
completionInfo.time = time;
completionInfo.future = discoveryFuture;
XrCreateSpatialDiscoverySnapshotCompletionEXT completion{
XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(
spatialContext, &completionInfo, &completion));
if (completion.futureResult == XR_SUCCESS) {
// Query for desired annotation data, e.g. quad.
XrSpatialComponentTypeEXT componentsToQuery[] = {
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID};
XrSpatialComponentDataQueryConditionEXT queryCond{
XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypeCount = 1;
queryCond.componentTypes = componentsToQuery;
XrSpatialComponentDataQueryResultEXT queryResult{
XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond,
&queryResult));
std::vector<XrSpatialEntityIdEXT> entityIds(
queryResult.entityIdCountOutput);
std::vector<XrSpatialEntityTrackingStateEXT> entityStates(
queryResult.entityStateCountOutput);
queryResult.entityIdCapacityInput = entityIds.size();
queryResult.entityIds = entityIds.data();
queryResult.entityStateCapacityInput = entityStates.size();
queryResult.entityStates = entityStates.data();
std::vector<XrSpatialAnnotationQuadDataANDROID> quads(
queryResult.entityIdCountOutput);
XrSpatialComponentAnnotationQuadListANDROID quadList{
XR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROID};
quadList.quadCount = quads.size();
quadList.quads = quads.data();
queryResult.next = &quadList;
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond,
&queryResult));
for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
if (entityStates[i] == XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT) {
const XrSpatialAnnotationQuadDataANDROID ¤tQuad = quads[i];
// Rendering quad in the view.
}
}
CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
}
};
while (1) {
// For every frame in frame loop
XrSpace space; // Application's play space.
XrFrameState frameState; // Previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
// Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
XrResult result = xrPollEvent(instance, &event);
if (result == XR_SUCCESS) {
switch (event.type) {
case XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROID: {
const XrEventDataSpatialAnnotationTrackingANDROID &eventdata =
*reinterpret_cast<XrEventDataSpatialAnnotationTrackingANDROID *>(
&event);
if (eventdata.initializationResult != XR_SUCCESS) {
// handle initialization failure.
// e.g. CHK_XR(xrDestroySpatialContextEXT(spatialContext));
}
break;
}
case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
const XrEventDataSpatialDiscoveryRecommendedEXT &eventdata =
*reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT *>(
&event);
// Discover spatial entities for the context that we received the
// "discovery recommended" event for.
//discoverSpatialEntities(eventdata.spatialContext, time, space);
break;
}
}
}
// Finish frame loop
}
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
ประเภทออบเจ็กต์ใหม่
คำสั่งใหม่
- xrCreateSpatialReferenceCacheAsyncANDROID
- xrCreateSpatialReferenceCacheCompleteANDROID
- xrDestroySpatialReferenceCacheANDROID
- xrEnumerateSpatialAnnotationReferenceSourcesANDROID
โครงสร้างใหม่
- XrCreateSpatialReferenceCacheCompletionANDROID
- XrEventDataSpatialAnnotationTrackingANDROID
- XrSpatialAnnotationQuadANDROID
- XrSpatialAnnotationQuadDataANDROID
- XrSpatialCapabilityConfigurationAnnotationTrackingANDROID
- XrSpatialReferenceCacheCreateInfoANDROID
การขยาย XrSpatialComponentDataQueryResultEXT :
การขยาย XrSpatialReferenceImageEXT :
การขยาย XrSystemProperties :
Enum ใหม่
ค่าคงที่ Enum ใหม่
XR_ANDROID_SPATIAL_ANNOTATION_TRACKING_EXTENSION_NAMEXR_ANDROID_spatial_annotation_tracking_SPEC_VERSIONการขยาย XrObjectType :
XR_OBJECT_TYPE_SPATIAL_REFERENCE_CACHE_ANDROID
การขยาย XrSpatialCapabilityEXT :
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
การขยาย XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
การขยาย XrStructureType :
XR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROIDXR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDXR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROIDXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROIDXR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROIDXR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROIDXR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROID
ปัญหา
ประวัติเวอร์ชัน
การแก้ไขครั้งที่ 1, 2025-09-17 (Levana Chen)
- คำอธิบายส่วนขยายเริ่มต้น