XR_ANDROID_spatial_annotation_tracking
Name String
XR_ANDROID_spatial_annotation_tracking
Loại tiện ích
Tiện ích phiên bản
Số máy nhánh đã đăng ký
795
Bản sửa đổi
1
Trạng thái phê chuẩn
Chưa được phê chuẩn
Phần mở rộng và các phần phụ thuộc vào phiên bản
XR_EXT_spatial_entity
và
XR_EXT_spatial_image_tracking
Ngày sửa đổi gần đây nhất
2026-01-12
Trạng thái IP
Không có thông báo xác nhận quyền sở hữu nào đã biết về quyền sở hữu trí tuệ.
Cộng tác viên
Levana Chen, Google
Christopher Feil, Google
Martin Sundermeyer, Google
David Joseph Tan, Google
Jared Finder, Google
Nihav Jain, Google
Tổng quan
Tiện ích này cung cấp khả năng theo dõi chú thích cho tiện ích XR_EXT_spatial_entity để theo dõi nhiều chú thích trong cảnh. Thư viện này cho phép các ứng dụng đặt lớp phủ lên các đối tượng thực hoặc ảo do các tham chiếu thời gian chạy xác định.
Tiện ích này cung cấp một loại chú thích cơ bản là "Quad", tức là một đa giác có đúng 4 cạnh, tức là tứ giác lồi, đại diện cho một khung hình chữ nhật 2D tổng quát trong một tham chiếu thời gian chạy. Chú thích tứ giác được theo dõi được biểu thị dưới dạng một thực thể không gian có (hoặc "có") các thành phần sau:
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
Các ứng dụng có thể thường sử dụng tiện ích theo dõi chú thích không gian theo các mẫu sau:
- Trước tiên, ứng dụng sẽ tạo một đối tượng XrSpatialReferenceCacheANDROID để bắt đầu ghi các đối tượng tham chiếu thời gian chạy từ nguồn đã cho.
- Sau đó, ứng dụng sẽ ghi lại một tham chiếu thời gian chạy của XrSpatialReferenceImageEXT và xác định chú thích mong muốn trong tham chiếu trong khoảng thời gian của bộ nhớ đệm tham chiếu.
- Sau đó, ứng dụng sẽ tạo một giá trị nhận dạng XrSpatialContextEXT dựa trên XrSpatialReferenceImageEXT do XrSpatialCapabilityConfigurationAnnotationTrackingANDROID cung cấp .
- Ứng dụng có thể huỷ bỏ tay cầm XrSpatialReferenceCacheANDROID để dừng ghi các tệp đối chiếu thời gian chạy nhằm giảm mức sử dụng bộ nhớ hoặc đợi sự kiện
XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDđể xác nhận kết quả khởi động. - Sau đó, ứng dụng sẽ kéo sự kiện
XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDđể xác nhận kết quả khởi tạo của chú thích. - Nếu quá trình khởi tạo thành công, ứng dụng có thể kéo sự kiện
XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXTđể theo dõi chú thích. - Nếu quá trình khởi chạy không thành công, ứng dụng có thể sử dụng mã lỗi được trả về trong sự kiện để xác định lý do thất bại và hủy bỏ tay cầm XrSpatialContextEXT hiện có để bắt đầu chú giải mới.
- Bất kể kết quả khởi chạy là gì, ứng dụng có thể giải phóng bộ đệm hình ảnh để giảm mức sử dụng bộ nhớ sau khi nhận được sự kiện.
- Ứng dụng sẽ khám phá và truy vấn chú thích theo các mẫu truy cập thực thể không gian.
- Ứng dụng có thể tạo thêm đối tượng XrSpatialContextEXT để theo dõi chú thích trong một đối tượng tham chiếu mới trong khoảng thời gian của XrSpatialReferenceCacheANDROID hợp lệ .
- Ứng dụng có thể hủy bỏ các handle XrSpatialContextEXT để giảm tập hợp các chú giải có thể phát hiện và theo dõi một cách linh động trong thời gian chạy.
Hỗ trợ thời gian chạy
Một thời gian chạy phải quảng cáo khả năng hỗ trợ tính năng theo dõi chú thích bằng cách sử dụng xrEnumerateSpatialCapabilitiesEXT bằng cách liệt kê chức năng sau:
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
Khi thời gian chạy hỗ trợ khả năng theo dõi chú thích:
- Nền tảng này phải hỗ trợ ít nhất một thành phần chú giải bằng cách liệt kê các thành phần chú giải được hỗ trợ thông qua xrEnumerateSpatialCapabilityComponentTypesEXT .
- Nền tảng này phải hỗ trợ ít nhất một trong các XrSpatialReferenceImageFormatEXT bằng cách liệt kê các định dạng tham chiếu được hỗ trợ thông qua xrEnumerateSpatialReferenceImageFormatsEXT với
capabilityđược đặt thànhXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID. - Nền tảng này phải hỗ trợ ít nhất một trong các XrSpatialAnnotationReferenceSourceANDROID bằng cách liệt kê các nguồn tham chiếu được hỗ trợ thông qua xrEnumerateSpatialAnnotationReferenceSourcesANDROID với
capabilityđược đặt thànhXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID.
Hàm xrEnumerateSpatialAnnotationReferenceSourcesANDROID được xác định như sau:
XrResult xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
XrInstance instance,
XrSystemId systemId,
XrSpatialCapabilityEXT capability,
uint32_t sourceCapacityInput,
uint32_t* sourceCountOutput,
XrSpatialAnnotationReferenceSourceANDROID* sources);
Nội dung mô tả về tham số
instancelà một handle cho XrInstance .systemIdlàXrSystemIdmà nguồn tham chiếu sẽ được liệt kê.capabilitylà XrSpatialCapabilityEXT mà các nguồn tham chiếu sẽ được liệt kê.sourceCapacityInputlà dung lượng của mảngsourceshoặc 0 để cho biết yêu cầu truy xuất dung lượng cần thiết.sourceCountOutputlà số lượng nguồn hoặc công suất cần thiết trong trường hợpsourceCapacityInputkhông đủ.sourceslà một mảng XrSpatialAnnotationReferenceSourceANDROID . Giá trị này có thể làNULLnếusourceCapacityInputlà 0.- Hãy xem phần Tham số kích thước bộ nhớ đệm để biết nội dung mô tả chi tiết về cách truy xuất kích thước
sourcescần thiết.
Ứng dụng có thể liệt kê danh sách các nguồn tham chiếu mà một XrSystemId nhất định hỗ trợ bằng cách sử dụng xrEnumerateSpatialAnnotationReferenceSourcesANDROID .
Thời gian chạy không được liệt kê các nguồn tham chiếu có tiện ích không được bật cho instance .
Cách sử dụng hợp lệ (ngầm)
- Bạn phải bật tiện ích
XR_ANDROID_spatial_annotation_trackingtrước khi gọi xrEnumerateSpatialAnnotationReferenceSourcesANDROID -
instancephải là một đối tượng XrInstance hợp lệ -
capabilityphải là một giá trị XrSpatialCapabilityEXT hợp lệ -
sourceCountOutputphải là con trỏ đến giá trịuint32_t - Nếu
sourceCapacityInputkhông phải là0, thìsourcesphải là con trỏ đến một mảng gồm các giá trịsourceCapacityInputXrSpatialAnnotationReferenceSourceANDROID
Mã trả về
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;
Liệt kê XrSpatialAnnotationReferenceSourceANDROID mô tả nguồn của thông tin tham chiếu cung cấp siêu dữ liệu cho chú thích.
Các enum có ý nghĩa như sau:
Nội dung mô tả enum
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID
Hình ảnh tham khảo là hình ảnh đầu ra chưa được cắt của một API camera Android, chẳng hạn như Hình ảnh từ ImageReader được liên kết với CameraDevice Camera2 hoặc ImageProxy từ ImageAnalysis được liên kết với CameraX. Đây thường là một trong các camera RGB hướng về phía trước.
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MEDIA_PROJECTION_ANDROID
Hình ảnh tham khảo là hình ảnh chưa được cắt do Android MediaProjection API xuất ra, ví dụ: Hình ảnh từ ImageReader được liên kết với màn hình ảo MediaProjection. Nội dung này có thể bao gồm nội dung ảo và nội dung thực.
Cấu trúc XrSystemSpatialAnnotationPropertiesANDROID được xác định như sau:
typedef struct XrSystemSpatialAnnotationPropertiesANDROID {
XrStructureType type;
void* next;
uint32_t referenceCacheTimespan;
uint32_t maxReferencePixelWidth;
uint32_t maxReferencePixelHeight;
uint32_t maxReferenceCount;
uint32_t maxAnnotationCount;
} XrSystemSpatialAnnotationPropertiesANDROID;
Nội dung mô tả thành viên
typelà XrStructureType của cấu trúc này.nextlàNULLhoặc con trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.referenceCacheTimespancho biết khoảng thời gian tính bằng giây của một đối tượng XrSpatialReferenceCacheANDROID hợp lệ.maxReferencePixelWidthcho biết chiều rộng tối đa của cạnh hình ảnh tham chiếu tính bằng pixel.maxReferencePixelHeightcho biết chiều cao tối đa của cạnh hình ảnh tham chiếu tính bằng pixel.maxReferenceCountcho biết số lượng tối đa hình ảnh tham chiếu sẽ được phân bổ cùng một lúc.maxAnnotationCountcho biết số lượng chú thích tối đa cần theo dõi cùng một lúc.
Khi thời gian chạy hỗ trợ khả năng theo dõi chú thích, một ứng dụng có thể kiểm tra các thuộc tính hệ thống có liên quan bằng cách liên kết cấu trúc XrSystemSpatialAnnotationPropertiesANDROID với XrSystemProperties khi gọi xrGetSystemProperties .
Nếu XrSpatialReferenceImageEXT :: width từ XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference vượt quá maxReferencePixelWidth , thì thời gian chạy phải trả về XR_ERROR_VALIDATION_FAILURE khi gọi xrCreateSpatialContextAsyncEXT .
Nếu XrSpatialReferenceImageEXT :: height từ XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference vượt quá maxReferencePixelHeight , thì thời gian chạy phải trả về XR_ERROR_VALIDATION_FAILURE khi gọi xrCreateSpatialContextAsyncEXT .
Nếu XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: time nằm ngoài khoảng thời gian của XrSpatialReferenceCacheANDROID :: cache , thì thời gian chạy phải trả về XR_ERROR_TIME_INVALID khi gọi xrCreateSpatialContextAsyncEXT . Ứng dụng có thể tạo lại đối tượng XrSpatialContextEXT bằng một thông tin tham chiếu mới trong khoảng thời gian của XrSpatialReferenceCacheANDROID .
Nếu số lượng hình ảnh tham chiếu được phân bổ vượt quá maxReferenceCount , thì thời gian chạy phải trả về XR_ERROR_LIMIT_REACHED và cho biết lỗi khởi tạo thông qua XrEventDataSpatialAnnotationTrackingANDROID :: initializationResult . Ứng dụng có thể hủy bỏ tay cầm XrSpatialContextEXT và thử lại sau khi quá trình khởi tạo đang chờ xử lý hoàn tất.
Nếu số lượng chú thích đang hoạt động vượt quá maxAnnotationCount , thì thời gian chạy phải trả về XR_ERROR_VALIDATION_FAILURE khi gọi xrCreateSpatialContextAsyncEXT .
Cách sử dụng hợp lệ (ngầm)
- Bạn phải bật tiện ích
XR_ANDROID_spatial_annotation_trackingtrước khi sử dụng XrSystemSpatialAnnotationPropertiesANDROID -
typephải làXR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROID -
nextphải làNULLhoặc một con trỏ hợp lệ đến cấu trúc tiếp theo trong chuỗi cấu trúc
Bộ nhớ đệm tham chiếu thời gian chạy
XR_DEFINE_HANDLE(XrSpatialReferenceCacheANDROID)
Xử lý XrSpatialReferenceCacheANDROID đại diện cho bộ nhớ đệm của các lượt tham chiếu thời gian chạy được ghi lại từ một nguồn nhất định.
Hàm xrCreateSpatialReferenceCacheAsyncANDROID được xác định như sau:
XrResult xrCreateSpatialReferenceCacheAsyncANDROID(
XrSession session,
const XrSpatialReferenceCacheCreateInfoANDROID* createInfo,
XrFutureEXT* future);
Nội dung mô tả về tham số
sessionlà một XrSession mà bộ nhớ đệm tham chiếu sẽ hoạt động.createInfolà một con trỏ đến XrSpatialReferenceCacheCreateInfoANDROID dùng để chỉ định các tham số bộ nhớ đệm tham chiếu.futurelà con trỏ đến giá trị nhận dạng đầu ra củaXrFutureEXT.
Ứng dụng có thể tạo một đối tượng XrSpatialReferenceCacheANDROID bằng cách gọi xrCreateSpatialReferenceCacheAsyncANDROID . Thời gian chạy có thể mất một chút thời gian để khởi động các dịch vụ theo dõi. Sau đó, ứng dụng có thể gọi xrCreateSpatialReferenceCacheCompleteANDROID nhiều lần để kiểm tra xem thao tác không đồng bộ này đã hoàn tất hay chưa.
Thời gian chạy phải trả về XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT nếu XrSpatialReferenceCacheCreateInfoANDROID :: capability không được xrEnumerateSpatialCapabilitiesEXT liệt kê .
Thời gian chạy phải trả về XR_ERROR_FEATURE_UNSUPPORTED nếu XrSpatialReferenceCacheCreateInfoANDROID :: source không được xrEnumerateSpatialAnnotationReferenceSourcesANDROID liệt kê cho khả năng đã cho.
Ứng dụng chỉ có thể tạo một giá trị nhận dạng cho mỗi nguồn đối với một chức năng nhất định. Nếu không, thời gian chạy phải trả về XR_ERROR_LIMIT_REACHED .
Sau đó, ứng dụng có thể ghi lại các tham chiếu thời gian chạy trong khoảng thời gian của đối tượng XrSpatialReferenceCacheANDROID để định cấu hình đối tượng XrSpatialContextEXT mới.
Cách sử dụng hợp lệ (ngầm)
- Bạn phải bật tiện ích
XR_ANDROID_spatial_annotation_trackingtrước khi gọi xrCreateSpatialReferenceCacheAsyncANDROID -
sessionphải là một đối tượng XrSession hợp lệ -
createInfophải là con trỏ đến một cấu trúc XrSpatialReferenceCacheCreateInfoANDROID hợp lệ -
futurephải là con trỏ đến giá trịXrFutureEXT
Mã trả về
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
Cấu trúc XrSpatialReferenceCacheCreateInfoANDROID được xác định như sau:
typedef struct XrSpatialReferenceCacheCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
XrSpatialAnnotationReferenceSourceANDROID source;
} XrSpatialReferenceCacheCreateInfoANDROID;
Nội dung mô tả thành viên
typelà XrStructureType của cấu trúc này.nextlàNULLhoặc con trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc. Không có cấu trúc nào như vậy được xác định trong OpenXR cốt lõi hoặc tiện ích này.capabilitylà một XrSpatialCapabilityEXT mô tả khả năng mà bộ nhớ đệm tham chiếu được tạo ra.sourcelà một XrSpatialAnnotationReferenceSourceANDROID mô tả nguồn của bộ nhớ đệm tham chiếu.
Cấu trúc XrSpatialReferenceCacheCreateInfoANDROID mô tả thông tin để tạo một đối tượng XrSpatialReferenceCacheANDROID.
Cách sử dụng hợp lệ (ngầm)
- Bạn phải bật tiện ích
XR_ANDROID_spatial_annotation_trackingtrước khi sử dụng XrSpatialReferenceCacheCreateInfoANDROID -
typephải làXR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROID -
nextphải làNULLhoặc một con trỏ hợp lệ đến cấu trúc tiếp theo trong chuỗi cấu trúc -
capabilityphải là một giá trị XrSpatialCapabilityEXT hợp lệ -
sourcemust là một giá trị XrSpatialAnnotationReferenceSourceANDROID hợp lệ
Hàm xrCreateSpatialReferenceCacheCompleteANDROID được xác định như sau:
XrResult xrCreateSpatialReferenceCacheCompleteANDROID(
XrSession session,
XrFutureEXT future,
XrCreateSpatialReferenceCacheCompletionANDROID* completion);
Nội dung mô tả về tham số
sessionlà XrSession được truyền trước đó đến xrCreateSpatialReferenceCacheAsyncANDROID ::session.futurelàXrFutureEXTnhận được từ xrCreateSpatialReferenceCacheAsyncANDROID ::future.completionlà con trỏ đến XrCreateSpatialReferenceCacheCompletionANDROID .
Ứng dụng có thể gọi xrCreateSpatialReferenceCacheCompleteANDROID để chờ hoàn tất thao tác không đồng bộ do xrCreateSpatialReferenceCacheAsyncANDROID bắt đầu .
Thời gian chạy phải trả về XR_ERROR_FUTURE_PENDING_EXT nếu future không ở trạng thái sẵn sàng. Thời gian chạy phải trả về XR_ERROR_FUTURE_INVALID_EXT nếu future đã hoàn tất hoặc bị huỷ.
Cách sử dụng hợp lệ (ngầm)
- Bạn phải bật tiện ích
XR_ANDROID_spatial_annotation_trackingtrước khi gọi xrCreateSpatialReferenceCacheCompleteANDROID -
sessionphải là một đối tượng XrSession hợp lệ -
completionphải là con trỏ đến cấu trúc XrCreateSpatialReferenceCacheCompletionANDROID
Mã trả về
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
Cấu trúc XrCreateSpatialReferenceCacheCompletionANDROID được xác định như sau:
typedef struct XrCreateSpatialReferenceCacheCompletionANDROID {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialReferenceCacheANDROID referenceCache;
} XrCreateSpatialReferenceCacheCompletionANDROID;
Nội dung mô tả thành viên
typelà XrStructureType của cấu trúc này.nextlàNULLhoặc con trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc. Không có cấu trúc nào như vậy được xác định trong OpenXR cốt lõi hoặc tiện ích này.futureResultlà XrResult của thao tác tạo bộ nhớ đệm tham chiếu.referenceCachelà giá trị nhận dạng XrSpatialReferenceCacheANDROID nếu thao tác thành công.
Mã trả về trong tương lai
Giá trị 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
Nếu futureResult là mã thành công, thì thời gian chạy phải trả về một giá trị nhận dạng referenceCache hợp lệ. Nếu referenceCache hợp lệ, thì nó chỉ hợp lệ trong vòng đời của xrCreateSpatialReferenceCacheAsyncANDROID :: session hoặc cho đến khi ứng dụng huỷ tay cầm bằng xrDestroySpatialReferenceCacheANDROID, tuỳ theo điều kiện nào đến trước.
Khi referenceCache hợp lệ, nó sẽ ghi lại các bộ nhớ đệm trong XrSystemSpatialAnnotationPropertiesANDROID :: referenceCacheTimespan .
Cách sử dụng hợp lệ (ngầm)
- Bạn phải bật tiện ích
XR_ANDROID_spatial_annotation_trackingtrước khi sử dụng XrCreateSpatialReferenceCacheCompletionANDROID -
typephải làXR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROID -
nextphải làNULLhoặc một con trỏ hợp lệ đến cấu trúc tiếp theo trong chuỗi cấu trúc -
futureResultphải là giá trị XrResult hợp lệ -
referenceCachephải là một đối tượng XrSpatialReferenceCacheANDROID hợp lệ
Hàm xrDestroySpatialReferenceCacheANDROID được xác định như sau:
XrResult xrDestroySpatialReferenceCacheANDROID(
XrSpatialReferenceCacheANDROID cacheHandle);
Nội dung mô tả về tham số
cacheHandlelà một XrSpatialReferenceCacheANDROID do xrCreateSpatialReferenceCacheAsyncANDROID tạo trước đó .
Ứng dụng có thể gọi hàm xrDestroySpatialReferenceCacheANDROID để giải phóng đối tượng cacheHandle và các tài nguyên cơ bản khi hoàn tất quá trình tạo ngữ cảnh không gian.
Cách sử dụng hợp lệ (ngầm)
- Bạn phải bật tiện ích
XR_ANDROID_spatial_annotation_trackingtrước khi gọi xrDestroySpatialReferenceCacheANDROID -
cacheHandlephải là một đối tượng XrSpatialReferenceCacheANDROID hợp lệ
Độ an toàn cho luồng
- Quyền truy cập vào
cacheHandlevà mọi đối tượng con phải được đồng bộ hoá bên ngoài
Mã trả về
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
Cấu hình
Cấu trúc XrSpatialCapabilityConfigurationAnnotationTrackingANDROID được xác định như sau:
typedef struct XrSpatialCapabilityConfigurationAnnotationTrackingANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
XrSpatialReferenceCacheANDROID cache;
XrTime time;
XrSpatialReferenceImageEXT reference;
} XrSpatialCapabilityConfigurationAnnotationTrackingANDROID;
Nội dung mô tả thành viên
typelà XrStructureType của cấu trúc này.nextlàNULLhoặc con trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.capabilitylà một XrSpatialCapabilityEXT và phải làXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID.enabledComponentCountlà mộtuint32_tmô tả số lượng phần tử trong mảngenabledComponents.enabledComponentslà con trỏ đến một mảng XrSpatialComponentTypeEXT .cachelà một XrSpatialReferenceCacheANDROID được tạo trước đó để ghi lại các thông tin tham chiếu trong thời gian chạy cho cấu hìnhreference.timelàXrTimemàreferenceđược thu thập.referencelà một XrSpatialReferenceImageEXT có các chú thích được xâu chuỗi vào con trỏ tiếp theo của nó.
Các ứng dụng có thể bật chức năng XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID không gian bằng cách thêm một con trỏ vào cấu trúc XrSpatialCapabilityConfigurationAnnotationTrackingANDROID trong XrSpatialContextCreateInfoEXT :: capabilityConfigs .
Thời gian chạy phải trả về XR_ERROR_VALIDATION_FAILURE nếu capability không phải là XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID .
Thời gian chạy phải trả về XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT nếu reference không chứa chú giải nào.
Thời gian chạy phải trả về XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT nếu thành phần chú giải được liệt kê trong enabledComponents nhưng không có chú giải tương ứng nào được liên kết với reference .
Thời gian chạy phải trả về XR_ERROR_VALIDATION_FAILURE nếu cache không thuộc sở hữu của cùng một XrSession truyền đến xrCreateSpatialContextAsyncEXT .
Thời gian chạy phải trả về XR_ERROR_TIME_INVALID nếu time nằm ngoài khoảng thời gian của cache .
Cách sử dụng hợp lệ (ngầm)
- Bạn phải bật tiện ích
XR_ANDROID_spatial_annotation_trackingtrước khi sử dụng XrSpatialCapabilityConfigurationAnnotationTrackingANDROID -
typephải làXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROID -
nextphải làNULLhoặc một con trỏ hợp lệ đến cấu trúc tiếp theo trong chuỗi cấu trúc -
capabilityphải là một giá trị XrSpatialCapabilityEXT hợp lệ -
enabledComponentsphải là con trỏ đến một mảng gồmenabledComponentCountgiá trị XrSpatialComponentTypeEXT hợp lệ -
cachephải là một đối tượng XrSpatialReferenceCacheANDROID hợp lệ -
referencephải là một cấu trúc XrSpatialReferenceImageEXT hợp lệ - Tham số
enabledComponentCountphải lớn hơn0
Sự kiện theo dõi chú thích
Cấu trúc XrEventDataSpatialAnnotationTrackingANDROID được xác định như sau:
typedef struct XrEventDataSpatialAnnotationTrackingANDROID {
XrStructureType type;
const void* next;
XrSpatialContextEXT spatialContext;
uint32_t annotationIndex;
XrResult initializationResult;
} XrEventDataSpatialAnnotationTrackingANDROID;
Nội dung mô tả thành viên
typelà XrStructureType của cấu trúc này.nextlàNULLhoặc con trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.spatialContextlà XrSpatialContextEXT đã kích hoạt tính năng theo dõi chú thích.annotationIndexánh xạ đến chỉ mục từ mảng chú thích được liên kết với XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ::reference.initializationResultcho biết kết quả khởi tạo của chú thích. Nếu không phải làXR_SUCCESS, ứng dụng có thể hủy bỏ và tạo lại handle XrSpatialContextEXT để khởi động lại chú giải, hoặc tiếp tục dùngspatialContextđể theo dõi các chú giải khác.
Cách sử dụng hợp lệ (ngầm)
- Bạn phải bật tiện ích
XR_ANDROID_spatial_annotation_trackingtrước khi sử dụng XrEventDataSpatialAnnotationTrackingANDROID -
typephải làXR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROID -
nextphải làNULLhoặc một con trỏ hợp lệ đến cấu trúc tiếp theo trong chuỗi cấu trúc
Thời gian chạy phải điền sẵn XrEventDataSpatialAnnotationTrackingANDROID cho từng chú thích để cho biết quá trình khởi tạo đã hoàn tất. Bất kể kết quả khởi chạy là gì, ứng dụng có thể giải phóng bộ đệm hình ảnh để giảm mức sử dụng bộ nhớ sau khi nhận được sự kiện.
Thời gian chạy phải điền sẵn initializationResult bằng XR_SUCCESS nếu chú thích được khởi chạy thành công. Sau đó, ứng dụng có thể kéo sự kiện XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT để theo dõi chú thích.
Nếu không, thời gian chạy phải điền sẵn initializationResult bằng một mã lỗi thích hợp để cho biết lý do thất bại. Ứng dụng có thể hủy bỏ handle XrSpatialContextEXT để bắt đầu chú giải mới hoặc tiếp tục dùng spatialContext để theo dõi các chú giải khác.
Chú thích bốn phần
Thời gian chạy phải quảng cáo khả năng hỗ trợ chú giải tứ giác bằng cách sử dụng xrEnumerateSpatialCapabilityComponentTypesEXT bằng cách liệt kê loại thành phần sau:
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
Quad Reference
Cấu trúc XrSpatialAnnotationQuadReferenceANDROID được xác định như sau:
typedef struct XrSpatialAnnotationQuadReferenceANDROID {
XrStructureType type;
const void* next;
uint32_t quadCount;
const XrSpatialAnnotationQuadANDROID* quads;
} XrSpatialAnnotationQuadReferenceANDROID;
Nội dung mô tả thành viên
typelà XrStructureType của cấu trúc này.nextlàNULLhoặc con trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.quadCountlà mộtuint32_tmô tả số lượng phần tử trong mảngquads.quadslà con trỏ đến một mảng XrSpatialAnnotationQuadANDROID .
Khi thời gian chạy hỗ trợ chú thích tứ giác, ứng dụng có thể định cấu hình chú thích bằng cách liên kết cấu trúc XrSpatialAnnotationQuadReferenceANDROID với XrSpatialReferenceImageEXT :: next và đặt tham chiếu trong XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference khi tạo đối tượng XrSpatialContextEXT.
Thời gian chạy phải trả về XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT từ xrCreateSpatialContextAsyncEXT nếu quadCount là 0.
Cách sử dụng hợp lệ (ngầm)
- Bạn phải bật tiện ích
XR_ANDROID_spatial_annotation_trackingtrước khi sử dụng XrSpatialAnnotationQuadReferenceANDROID -
typephải làXR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROID -
nextphải làNULLhoặc một con trỏ hợp lệ đến cấu trúc tiếp theo trong chuỗi cấu trúc -
quadsphải là con trỏ đến một mảng gồmquadCountcấu trúc XrSpatialAnnotationQuadANDROID hợp lệ - Tham số
quadCountphải lớn hơn0
Cấu trúc XrSpatialAnnotationQuadANDROID được xác định như sau:
typedef struct XrSpatialAnnotationQuadANDROID {
XrSpatialAnnotationQuadAlignmentANDROID alignment;
XrVector2f upperLeft;
XrVector2f upperRight;
XrVector2f lowerRight;
XrVector2f lowerLeft;
} XrSpatialAnnotationQuadANDROID;
Nội dung mô tả thành viên
alignmentlà XrSpatialAnnotationQuadAlignmentANDROID của tứ giác.upperLeftlà một XrVector2f mô tả toạ độ của góc trên cùng bên trái của tứ giác liên quan đến điểm gốc.upperRightlà một XrVector2f mô tả toạ độ của góc trên bên phải của tứ giác liên quan đến nguồn gốc.lowerRightlà một XrVector2f mô tả toạ độ của góc dưới cùng bên phải của tứ giác liên quan đến gốc.lowerLeftlà một XrVector2f mô tả toạ độ của góc dưới cùng bên trái của tứ giác liên quan đến nguồn gốc.
Hình tứ giác trong không gian 2D là một tứ giác lồi có thứ tự theo chiều kim đồng hồ. Giá trị của 4 góc có liên quan đến gốc (0, 0) mà tứ giác được liên kết.
- Khi được liên kết với XrSpatialReferenceImageEXT, gốc toạ độ sẽ là góc trên cùng bên trái của hình ảnh, trong đó X ánh xạ đến pixel theo chiều rộng và Y ánh xạ đến pixel theo chiều cao.
- Khi được liên kết với XrSpatialAnnotationQuadDataANDROID , nguồn gốc được biểu thị bằng XrSpaceLocationData ::
posecủa XrSpatialAnnotationQuadDataANDROID ::origin.
Cách sử dụng hợp lệ (ngầm)
- Bạn phải bật tiện ích
XR_ANDROID_spatial_annotation_trackingtrước khi sử dụng XrSpatialAnnotationQuadANDROID -
alignmentphải là một giá trị XrSpatialAnnotationQuadAlignmentANDROID hợp lệ
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;
Liệt kê XrSpatialAnnotationQuadAlignmentANDROID mô tả sự liên kết của chú thích tứ giác.
Các enum có ý nghĩa như sau:
Nội dung mô tả enum
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SCREEN_ANDROID
Tứ giác chú thích song song với mặt phẳng màn hình, trong khi chế độ xoay trên mặt phẳng vẫn bị khoá theo trọng lực của thế giới. Đầu ra xuất hiện dưới dạng một khung hình chữ nhật thẳng đứng thông thường.
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID
Tứ giác chú thích được neo trực tiếp vào đối tượng, khớp với hướng căn chỉnh được xác định trong hình ảnh tham khảo. Đầu ra là một tứ giác lồi, điều chỉnh hình dạng để phù hợp với góc nhìn của đối tượng.
Thành phần Quad
Cấu trúc XrSpatialAnnotationQuadDataANDROID được xác định như sau:
typedef struct XrSpatialAnnotationQuadDataANDROID {
uint32_t annotationIndex;
XrSpaceLocationData origin;
XrSpatialAnnotationQuadANDROID quad;
} XrSpatialAnnotationQuadDataANDROID;
Nội dung mô tả thành viên
annotationIndexlà chỉ mục ánh xạ đến mảng XrSpatialAnnotationQuadReferenceANDROID ::quadsđược liên kết với tham chiếu do XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ::referencetruyền .originlà một XrSpaceLocationData mô tả nguồn gốc của một mặt phẳng 2D nơi tứ giác được đặt. Thời gian chạy phải đặt XrSpaceLocationData ::locationFlagsđể cho biết các bit hợp lệ của tư thế gốc.quadlà XrSpatialAnnotationQuadANDROID đại diện cho tứ giác trong không gian cục bộ. Dùngoriginđể biến đổi tứ giác thành không gian tư thế.
Cách sử dụng hợp lệ (ngầm)
- Bạn phải bật tiện ích
XR_ANDROID_spatial_annotation_trackingtrước khi sử dụng XrSpatialAnnotationQuadDataANDROID -
originphải là một cấu trúc XrSpaceLocationData hợp lệ -
quadphải là một cấu trúc XrSpatialAnnotationQuadANDROID hợp lệ
Cấu trúc XrSpatialComponentAnnotationQuadListANDROID được xác định như sau:
typedef struct XrSpatialComponentAnnotationQuadListANDROID {
XrStructureType type;
void* next;
uint32_t quadCount;
XrSpatialAnnotationQuadDataANDROID* quads;
} XrSpatialComponentAnnotationQuadListANDROID;
Nội dung mô tả thành viên
typelà XrStructureType của cấu trúc này.nextlàNULLhoặc con trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.quadCountlà mộtuint32_tmô tả số lượng phần tử trong mảngquads.quadslà một mảng XrSpatialAnnotationQuadDataANDROID .
Ứng dụng có thể truy vấn thành phần chú thích tứ giác của các thực thể không gian trong XrSpatialSnapshotEXT bằng cách thêm XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID vào XrSpatialComponentDataQueryConditionEXT :: componentTypes và thêm XrSpatialComponentAnnotationQuadListANDROID vào chuỗi con trỏ tiếp theo của XrSpatialComponentDataQueryResultEXT .
Thời gian chạy phải trả về XR_ERROR_VALIDATION_FAILURE từ xrQuerySpatialComponentDataEXT nếu XrSpatialComponentAnnotationQuadListANDROID nằm trong chuỗi tiếp theo của XrSpatialComponentDataQueryResultEXT :: next nhưng XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID không có trong XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Thời gian chạy phải trả về XR_ERROR_SIZE_INSUFFICIENT từ xrQuerySpatialComponentDataEXT nếu quadCount nhỏ hơn XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
Cách sử dụng hợp lệ (ngầm)
- Bạn phải bật tiện ích
XR_ANDROID_spatial_annotation_trackingtrước khi sử dụng XrSpatialComponentAnnotationQuadListANDROID -
typephải làXR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROID -
nextphải làNULLhoặc một con trỏ hợp lệ đến cấu trúc tiếp theo trong chuỗi cấu trúc -
quadsphải là con trỏ đến một mảng gồmquadCountcấu trúc XrSpatialAnnotationQuadDataANDROID - Tham số
quadCountphải lớn hơn0
Mã ví dụ
Kiểm tra khả năng hỗ trợ thời gian chạy
Đoạn mã ví dụ sau đây minh hoạ cách kiểm tra xem thời gian chạy có hỗ trợ tính năng theo dõi chú thích hay không.
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;
}
Định cấu hình chú thích tứ giác
Đoạn mã ví dụ sau đây minh hoạ cách định cấu hình chú thích tứ giác.
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));
}
Khám phá chú thích đang hoạt động
Đoạn mã ví dụ sau đây minh hoạ cách khám phá và truy vấn chú thích.
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));
Các loại đối tượng mới
Lệnh mới
- xrCreateSpatialReferenceCacheAsyncANDROID
- xrCreateSpatialReferenceCacheCompleteANDROID
- xrDestroySpatialReferenceCacheANDROID
- xrEnumerateSpatialAnnotationReferenceSourcesANDROID
Cấu trúc mới
- XrCreateSpatialReferenceCacheCompletionANDROID
- XrEventDataSpatialAnnotationTrackingANDROID
- XrSpatialAnnotationQuadANDROID
- XrSpatialAnnotationQuadDataANDROID
- XrSpatialCapabilityConfigurationAnnotationTrackingANDROID
- XrSpatialReferenceCacheCreateInfoANDROID
Mở rộng XrSpatialComponentDataQueryResultEXT :
Mở rộng XrSpatialReferenceImageEXT :
Mở rộng XrSystemProperties :
Enum mới
Hằng số Enum mới
XR_ANDROID_SPATIAL_ANNOTATION_TRACKING_EXTENSION_NAMEXR_ANDROID_spatial_annotation_tracking_SPEC_VERSIONMở rộng XrObjectType :
XR_OBJECT_TYPE_SPATIAL_REFERENCE_CACHE_ANDROID
Mở rộng XrSpatialCapabilityEXT :
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
Mở rộng XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
Mở rộng 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
Vấn đề
Nhật ký phiên bản
Bản sửa đổi 1, ngày 17 tháng 9 năm 2025 (Levana Chen)
- Nội dung mô tả ban đầu về tiện ích.