XR_EXT_spatial_image_tracking
Name String
XR_EXT_spatial_image_tracking
Tipo de extensión
Extensión de instancia
Número de extensión registrado
783
Revisión
1
Estado de ratificación
No ratificado
Dependencias de extensiones y versiones
XR_EXT_spatial_entity
Colaboradores
Daniel Guttenberg, Qualcomm
Nihav Jain, Google
Jared Finder, Google
Zhipeng Liu, ByteDance
Descripción general
Esta extensión proporciona la capacidad de seguimiento de imágenes para la extensión XR_EXT_spatial_entity. Permite que las aplicaciones detecten y hagan un seguimiento de imágenes planas específicas, según lo que se indique en los conjuntos de imágenes de referencia de entrada.
Una imagen con seguimiento se representa como una entidad espacial con los siguientes componentes:
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXTXR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
Por lo general, las aplicaciones usan la extensión de seguimiento de imágenes espaciales con el siguiente patrón:
- Primero, una aplicación crea uno o varios controladores XrSpatialImageTrackingDatabaseEXT basados en conjuntos de datos de imágenes de referencia precargados.
- Luego, la aplicación crea un controlador XrSpatialContextEXT basado en los controladores XrSpatialImageTrackingDatabaseEXT creados anteriormente.
- Luego, la aplicación libera los datos de la imagen de referencia para reducir su consumo de memoria.
- La aplicación descubre y consulta imágenes según los patrones de acceso de la entidad espacial.
- La aplicación puede cargar conjuntos adicionales de imágenes de referencia y crear XrSpatialImageTrackingDatabaseEXT adicionales y, posteriormente, XrSpatialContextEXT a partir de ellos para extender el conjunto de imágenes detectables y rastreables de forma dinámica durante el tiempo de ejecución.
- La aplicación puede destruir los controladores XrSpatialImageTrackingDatabaseEXT para reducir el conjunto de imágenes detectables y rastreables de forma dinámica durante el tiempo de ejecución.
- La aplicación puede destruir los controladores XrSpatialContextEXT para reducir el conjunto de imágenes detectables y rastreables de forma dinámica durante el tiempo de ejecución.
Asistencia del entorno de ejecución
Un entorno de ejecución debe anunciar su compatibilidad con la función de seguimiento de imágenes usando xrEnumerateSpatialCapabilitiesEXT y enumerando la siguiente función:
XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT
Configuración
Para habilitar la detección y el seguimiento de imágenes planas, la aplicación puede pasar estructuras XrSpatialCapabilityConfigurationImageTrackingEXT en XrSpatialContextCreateInfoEXT :: capabilityConfigs cuando se llama a la función xrCreateSpatialContextAsyncEXT y se pasan arrays de estructuras< XrSpatialImageTrackingDatabaseEXT en cada XrSpatialCapabilityConfigurationImageTrackingEXT :: imageTrackingDatabases .
Creación de conjuntos de imágenes de entrada
Para especificar las imágenes de referencia que se detectarán y seguirán, la aplicación debe crear al menos un conjunto de imágenes de referencia de entrada. Un conjunto de imágenes de referencia de entrada se representa con un controlador XrSpatialImageTrackingDatabaseEXT y contiene al menos una imagen.
XR_DEFINE_HANDLE(XrSpatialImageTrackingDatabaseEXT)
El controlador XrSpatialImageTrackingDatabaseEXT representa los recursos para descubrir y actualizar una cantidad de imágenes espaciales en el entorno del usuario. Las aplicaciones pueden usar este controlador para descubrir y actualizar imágenes espaciales con otras funciones de esta extensión.
Crea la base de datos de seguimiento de imágenes espaciales
La función xrCreateSpatialImageTrackingDatabaseAsyncEXT se define de la siguiente manera:
XrResult xrCreateSpatialImageTrackingDatabaseAsyncEXT(
XrSession session,
const XrSpatialImageTrackingDatabaseCreateInfoEXT* createInfo,
XrFutureEXT* future);
Descripciones de los parámetros
sessiones una XrSession en la que estará activa la base de datos de seguimiento de imágenes espaciales.createInfoes el XrSpatialImageTrackingDatabaseCreateInfoEXT que se usa para especificar los parámetros de la base de datos de seguimiento de imágenes espaciales.futurees un puntero a unXrFutureEXT.
Una aplicación puede crear un controlador XrSpatialImageTrackingDatabaseEXT con la función xrCreateSpatialImageTrackingDatabaseAsyncEXT y configurar los conjuntos de imágenes de referencia de entrada de la base de datos de seguimiento de imágenes con createInfo .
El entorno de ejecución debe mostrar XR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXT si xrEnumerateSpatialReferenceImageFormatsEXT no enumera el format de XrSpatialReferenceImageEXT de ninguna de las imágenes de referencia de entrada.
El entorno de ejecución debe devolver XR_ERROR_SPATIAL_IMAGE_INVALID_EXT si el array XrSpatialReferenceImageEXT :: planes de cualquiera de las imágenes de referencia de entrada no se puede evaluar según los metadatos de la imagen de referencia de XrSpatialReferenceImageEXT .
El entorno de ejecución debe devolver XR_ERROR_SPATIAL_IMAGE_INVALID_EXT si el array XrSpatialReferenceImageEXT :: planes de cualquiera de las imágenes de referencia de entrada no proporciona exactamente la misma cantidad de planos que los canales de color que tiene XrSpatialReferenceImageEXT :: format.
Si un entorno de ejecución aplica un sistema de permisos para controlar el acceso de la aplicación a la función de seguimiento de imágenes, el entorno de ejecución debe devolver XR_ERROR_PERMISSION_INSUFFICIENT si no se otorgaron esos permisos a esta aplicación.
Esta función inicia una operación asíncrona y crea un XrFutureEXT correspondiente, que se puede usar con xrPollFutureEXT y funciones relacionadas. El valor que se muestra de esta función solo indica si los parámetros eran aceptables para programar la operación asíncrona. La función de finalización correspondiente es xrCreateSpatialImageTrackingDatabaseCompleteEXT , que se puede usar cuando un futuro de esta función está en el estado READY, con los resultados propagados por esa función en la estructura de finalización XrCreateSpatialImageTrackingDatabaseCompletionEXT .
Uso válido (implícito)
- La extensión
XR_EXT_spatial_image_trackingdebe estar habilitada antes de llamar a xrCreateSpatialImageTrackingDatabaseAsyncEXT. -
sessiondebe ser un controlador XrSession válido -
createInfodebe ser un puntero a una estructura XrSpatialImageTrackingDatabaseCreateInfoEXT válida -
futuredebe ser un puntero a un valorXrFutureEXT
Códigos de retorno
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_PERMISSION_INSUFFICIENTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXTXR_ERROR_SPATIAL_IMAGE_INVALID_EXTXR_ERROR_SPATIAL_IMAGE_SIZE_MISSING_EXTXR_ERROR_VALIDATION_FAILURE
La estructura XrSpatialImageTrackingDatabaseCreateInfoEXT se define de la siguiente manera:
typedef struct XrSpatialImageTrackingDatabaseCreateInfoEXT {
XrStructureType type;
const void* next;
uint32_t spatialReferenceImageCount;
const XrSpatialReferenceImageEXT* spatialReferenceImages;
} XrSpatialImageTrackingDatabaseCreateInfoEXT;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.spatialReferenceImageCountes la cantidad de elementos en el arrayspatialReferenceImages.spatialReferenceImageses un array de XrSpatialReferenceImageEXT .
La estructura XrSpatialImageTrackingDatabaseCreateInfoEXT describe la información para crear un controlador XrSpatialImageTrackingDatabaseEXT.
Cada XrSpatialImageTrackingDatabaseEXT debe crearse con al menos un XrSpatialReferenceImageEXT en el array XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages.
Uso válido (implícito)
- La extensión
XR_EXT_spatial_image_trackingdebe estar habilitada antes de usar XrSpatialImageTrackingDatabaseCreateInfoEXT. -
typedebe serXR_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_CREATE_INFO_EXT -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras . Consulta también: XrSpatialImageSizeEXT , XrSpatialImageStaticOptimizationEXT -
spatialReferenceImagesdebe ser un puntero a un array de estructuras XrSpatialReferenceImageEXT válidas despatialReferenceImageCount - El parámetro
spatialReferenceImageCountdebe ser mayor que0.
La función xrCreateSpatialImageTrackingDatabaseCompleteEXT se define de la siguiente manera:
XrResult xrCreateSpatialImageTrackingDatabaseCompleteEXT(
XrSession session,
XrFutureEXT future,
XrCreateSpatialImageTrackingDatabaseCompletionEXT* completion);
Descripciones de los parámetros
sessiones la XrSession que se pasó anteriormente a xrCreateSpatialContextAsyncEXT ::session.futurees elXrFutureEXTque se recibe de xrCreateSpatialContextAsyncEXT .completiones un puntero a un XrCreateSpatialImageTrackingDatabaseCompletionEXT .
xrCreateSpatialImageTrackingDatabaseCompleteEXT completa la operación asíncrona que inició xrCreateSpatialImageTrackingDatabaseAsyncEXT .
El entorno de ejecución no debe acceder a ningún puntero XrSpatialReferenceImagePlaneEXT :: buffer que haya proporcionado el array de entrada XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages para esta llamada a xrCreateSpatialImageTrackingDatabaseAsyncEXT después de que se haya completado. La aplicación puede liberar cualquier dato de XrSpatialReferenceImagePlaneEXT :: buffer después de que se haya completado xrCreateSpatialImageTrackingDatabaseAsyncEXT para reducir su espacio en memoria.
El entorno de ejecución debe mostrar XR_ERROR_FUTURE_PENDING_EXT si future no está en estado listo. El entorno de ejecución debe devolver XR_ERROR_FUTURE_INVALID_EXT si future ya se completó o canceló.
Uso válido (implícito)
- La extensión
XR_EXT_spatial_image_trackingdebe estar habilitada antes de llamar a xrCreateSpatialImageTrackingDatabaseCompleteEXT. -
sessiondebe ser un controlador XrSession válido -
completiondebe ser un puntero a una estructura XrCreateSpatialImageTrackingDatabaseCompletionEXT.
Códigos de retorno
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_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
La estructura XrCreateSpatialImageTrackingDatabaseCompletionEXT se define de la siguiente manera:
typedef struct XrCreateSpatialImageTrackingDatabaseCompletionEXT {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialImageTrackingDatabaseEXT database;
} XrCreateSpatialImageTrackingDatabaseCompletionEXT;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.futureResultes el XrResult de la operación de creación de la base de datos de seguimiento de imágenes espaciales.databasees un XrSpatialImageTrackingDatabaseEXT creado con los datos y la configuración en xrCreateSpatialImageTrackingDatabaseAsyncEXT ::createInfo.
Códigos de devolución futuros
Valores de futureResult:
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXTXR_ERROR_SPATIAL_IMAGE_INVALID_EXT
Si futureResult es un código de éxito, database debe ser un controlador válido. Si database es válido, solo lo será dentro del ciclo de vida de xrCreateSpatialImageTrackingDatabaseAsyncEXT :: session o hasta que la aplicación destruya el database con xrDestroySpatialImageTrackingDatabaseEXT , lo que ocurra primero.
Uso válido (implícito)
- La extensión
XR_EXT_spatial_image_trackingdebe estar habilitada antes de usar XrCreateSpatialImageTrackingDatabaseCompletionEXT. -
typedebe serXR_TYPE_CREATE_SPATIAL_IMAGE_TRACKING_DATABASE_COMPLETION_EXT -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras -
futureResultdebe ser un valor XrResult válido. -
databasedebe ser un controlador XrSpatialImageTrackingDatabaseEXT válido.
Destruye la base de datos de seguimiento de imágenes espaciales
La función xrDestroySpatialImageTrackingDatabaseEXT se define de la siguiente manera:
XrResult xrDestroySpatialImageTrackingDatabaseEXT(
XrSpatialImageTrackingDatabaseEXT database);
Descripciones de los parámetros
databasees un XrSpatialImageTrackingDatabaseEXT creado anteriormente por xrCreateSpatialImageTrackingDatabaseAsyncEXT .
La aplicación puede llamar a la función xrDestroySpatialImageTrackingDatabaseEXT para liberar el controlador database y los recursos subyacentes cuando finalicen las tareas de descubrimiento y actualización de imágenes espaciales.
La aplicación puede llamar a la función xrDestroySpatialImageTrackingDatabaseEXT antes de llamar a xrDestroySpatialContextEXT . El entorno de ejecución no debe informar más imágenes administradas por este XrSpatialImageTrackingDatabaseEXT destruido. El entorno de ejecución debe seguir informando las imágenes administradas por otras bases de datos.
El entorno de ejecución debe garantizar que las instantáneas de descubrimiento que muestra xrCreateSpatialDiscoverySnapshotCompleteEXT no contengan imágenes que pertenezcan a controladores XrSpatialImageTrackingDatabaseEXT destruidos o no válidos, incluso si el controlador se destruyó después de que la aplicación llamó a xrCreateSpatialDiscoverySnapshotAsyncEXT . Dado que los datos de una instantánea espacial son inmutables, la aplicación debería destruir cualquier controlador XrSpatialSnapshotEXT que se haya creado antes de destruir database. De lo contrario, la aplicación podría recibir controladores XrSpatialImageTrackingDatabaseEXT no válidos cuando se use xrQuerySpatialComponentDataEXT.
La aplicación puede llamar a la función xrDestroySpatialContextEXT para liberar el controlador XrSpatialContextEXT antes de destruir cualquiera de los controladores XrSpatialImageTrackingDatabaseEXT con los que se creó XrSpatialContextEXT. El entorno de ejecución no debe destruir de forma implícita estos controladores XrSpatialImageTrackingDatabaseEXT cuando se destruye el XrSpatialContextEXT.
Administrar el ciclo de vida de XrSpatialContextEXT y XrSpatialImageTrackingDatabaseEXT de forma independiente permite que las aplicaciones reutilicen los controladores de XrSpatialImageTrackingDatabaseEXT creados anteriormente sin necesidad de volver a realizar el costoso procedimiento de creación.
Por ejemplo, destruir un XrSpatialContextEXT y, luego, volver a crear otro XrSpatialContextEXT con el mismo XrSpatialImageTrackingDatabaseEXT permite pausar y reanudar el seguimiento de imágenes sin necesidad de realizar otro procedimiento de inicialización.
Uso válido (implícito)
- La extensión
XR_EXT_spatial_image_trackingdebe estar habilitada antes de llamar a xrDestroySpatialImageTrackingDatabaseEXT. -
databasedebe ser un controlador XrSpatialImageTrackingDatabaseEXT válido.
Seguridad de subprocesos
- El acceso a
databasey a cualquier controlador secundario debe sincronizarse de forma externa.
Códigos de retorno
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_RUNTIME_FAILURE
Compatibilidad con formatos de imagen de entrada
Las aplicaciones deben llamar a xrEnumerateSpatialReferenceImageFormatsEXT para obtener la lista de formatos de imagen de referencia de entrada admitidos.
La función xrEnumerateSpatialReferenceImageFormatsEXT se define de la siguiente manera:
XrResult xrEnumerateSpatialReferenceImageFormatsEXT(
XrInstance instance,
XrSystemId systemId,
XrSpatialCapabilityEXT capability,
uint32_t formatCapacityInput,
uint32_t* formatCountOutput,
XrSpatialReferenceImageFormatEXT* formats);
Descripciones de los parámetros
instancees un controlador de un XrInstance .systemIdes elXrSystemIdcuyos formatos de imagen de referencia de entrada se enumerarán.capabilityes el XrSpatialCapabilityEXT para el que se enumerarán los formatos de imagen de referencia de entrada.formatCapacityInputes la capacidad del arrayformats, o 0 para indicar una solicitud de recuperación de la capacidad requerida.formatCountOutputes la cantidad de formatos o la capacidad requerida en caso de queformatCapacityInputsea insuficiente.formatses un array de XrSpatialReferenceImageFormatEXT . Puede serNULLsiformatCapacityInputes 0.- Consulta la sección Parámetros de tamaño del búfer para obtener una descripción detallada de cómo recuperar el tamaño de
formatsrequerido.
La aplicación puede enumerar la lista de formatos de imagen de referencia de entrada que admite un XrSystemId determinado para un XrSpatialCapabilityEXT determinado con xrEnumerateSpatialReferenceImageFormatsEXT .
El entorno de ejecución no debe enumerar los formatos de las extensiones que no están habilitadas para instance .
Uso válido (implícito)
- La extensión
XR_EXT_spatial_image_trackingdebe estar habilitada antes de llamar a xrEnumerateSpatialReferenceImageFormatsEXT. -
instancedebe ser un controlador XrInstance válido. -
capabilitydebe ser un valor XrSpatialCapabilityEXT válido -
formatCountOutputdebe ser un puntero a un valoruint32_t - Si
formatCapacityInputno es0,formatsdebe ser un puntero a una matriz deformatCapacityInputXrSpatialReferenceImageFormatEXT valores
Códigos de retorno
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
Consulta XrSpatialReferenceImageFormatEXT para obtener una lista completa de todos los formatos de imagen de referencia que admite cualquier extensión.
typedef enum XrSpatialReferenceImageFormatEXT {
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT = 1,
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGB_888_EXT = 2,
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_YUV_420_888_EXT = 3,
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialReferenceImageFormatEXT;
La enumeración XrSpatialReferenceImageFormatEXT identifica los formatos de imagen de referencia de entrada que el entorno de ejecución puede admitir.
Se deben admitir, como mínimo, los valores XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT y XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGB_888_EXT.
Los enumerantes tienen el siguiente significado:
Descripciones de enumerantes
XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT: Es un búfer RGBA. El formato no garantiza el diseño de los datos de píxeles en la memoria. Se debe acceder a los píxeles con los metadatos que proporcionan las estructuras XrSpatialReferenceImagePlaneEXT correspondientes. Cada canal de color de píxel tiene un tamaño de 8 bits, lo que hace que cada píxel tenga un tamaño de 32 bits.XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGB_888_EXT: Es un búfer RGB. El formato no garantiza el diseño de los datos de píxeles en la memoria. Se debe acceder a los píxeles con los metadatos que proporcionan las estructuras XrSpatialReferenceImagePlaneEXT correspondientes. Cada canal de color de píxel tiene un tamaño de 8 bits, lo que hace que cada píxel tenga un tamaño de 24 bits.XR_SPATIAL_REFERENCE_IMAGE_FORMAT_YUV_420_888_EXT: Es un búfer YUV con submuestreo de crominancia de patrón 4:2:0. El formato no garantiza el diseño de los datos de píxeles en la memoria. Se debe acceder a los píxeles con los metadatos que proporcionan las estructuras XrSpatialReferenceImagePlaneEXT correspondientes. Cada canal de color de píxel RGB decodificado tiene un tamaño de 8 bits, lo que hace que cada píxel tenga un tamaño de 24 bits.
Configuración del seguimiento de imágenes espaciales
Esta extensión proporciona estructuras opcionales que la aplicación puede usar para configurar la capacidad de seguimiento de imágenes.
Optimización de imágenes estáticas
La estructura XrSpatialImageStaticOptimizationEXT se define de la siguiente manera:
typedef struct XrSpatialImageStaticOptimizationEXT {
XrStructureType type;
const void* next;
XrBool32 optimizeForStaticImage;
} XrSpatialImageStaticOptimizationEXT;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.optimizeForStaticImagees unXrBool32que indica si las imágenes se mueven o no. Un valor deXR_TRUEindica que las imágenes no se mueven.
Si XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT se enumera con xrEnumerateSpatialCapabilityFeaturesEXT para la capacidad XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, la aplicación puede encadenar XrSpatialImageStaticOptimizationEXT a la cadena XrSpatialImageTrackingDatabaseCreateInfoEXT :: next o XrSpatialReferenceImageEXT :: next .
Si la aplicación encadena XrSpatialImageStaticOptimizationEXT a la estructura XrSpatialImageTrackingDatabaseCreateInfoEXT, el entorno de ejecución debe suponer que todas las imágenes de ese XrSpatialImageTrackingDatabaseEXT son estáticas si optimizeForStaticImage se establece en XR_TRUE . En consecuencia, el entorno de ejecución debe suponer que todas las imágenes de ese XrSpatialImageTrackingDatabaseEXT no son estáticas si optimizeForStaticImage se establece en XR_FALSE .
Si la aplicación encadena XrSpatialImageStaticOptimizationEXT a la estructura XrSpatialReferenceImageEXT, el entorno de ejecución debe suponer que esta imagen de referencia es estática si optimizeForStaticImage se establece en XR_TRUE . En consecuencia, el entorno de ejecución debe suponer que esta imagen de referencia no es estática si optimizeForStaticImage se establece en XR_FALSE . Encadenar la estructura XrSpatialImageStaticOptimizationEXT a la estructura XrSpatialReferenceImageEXT tiene prioridad sobre encadenarla a la estructura XrSpatialImageTrackingDatabaseCreateInfoEXT.
Si xrEnumerateSpatialCapabilityFeaturesEXT no enumera XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT para la capacidad XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT y la aplicación encadena una estructura XrSpatialImageStaticOptimizationEXT a cualquiera de las siguientes cadenas aplicables, el entorno de ejecución debe devolver XR_ERROR_VALIDATION_FAILURE de xrCreateSpatialImageTrackingDatabaseAsyncEXT .
Esto puede permitir que el entorno de ejecución genere una pose y un tamaño más precisos.
Esto puede permitir que el entorno de ejecución reduzca el consumo de energía.
Uso válido (implícito)
- La extensión
XR_EXT_spatial_image_trackingdebe estar habilitada antes de usar XrSpatialImageStaticOptimizationEXT. -
typedebe serXR_TYPE_SPATIAL_IMAGE_STATIC_OPTIMIZATION_EXT -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras
Ancho de la imagen de referencia
La estructura XrSpatialImageSizeEXT se define de la siguiente manera:
typedef struct XrSpatialImageSizeEXT {
XrStructureType type;
const void* next;
float physicalWidth;
} XrSpatialImageSizeEXT;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.physicalWidthes un valorfloatque representa el ancho físico en metros que se establecerá.
Si xrEnumerateSpatialCapabilityFeaturesEXT enumera XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT para la capacidad XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, la aplicación puede encadenar XrSpatialImageSizeEXT a XrSpatialImageTrackingDatabaseCreateInfoEXT :: next o XrSpatialReferenceImageEXT :: next .
Si la aplicación encadena XrSpatialImageSizeEXT a la estructura XrSpatialImageTrackingDatabaseCreateInfoEXT, el entorno de ejecución debe suponer que todas las imágenes de esa XrSpatialImageTrackingDatabaseEXT tienen un ancho de physicalWidth metros y una altura según la relación de aspecto que se proporciona de forma implícita a través de XrSpatialReferenceImageEXT :: width y XrSpatialReferenceImageEXT :: height .
Si la aplicación encadena XrSpatialImageSizeEXT a la estructura XrSpatialReferenceImageEXT, el entorno de ejecución debe suponer que esta imagen de referencia tiene un ancho de physicalWidth metros y una altura según la relación de aspecto que se proporciona de forma implícita a través de XrSpatialReferenceImageEXT :: width y XrSpatialReferenceImageEXT :: height . Encadenar la estructura XrSpatialImageSizeEXT a la estructura XrSpatialReferenceImageEXT tiene prioridad sobre encadenarla a la estructura XrSpatialImageTrackingDatabaseCreateInfoEXT.
Esto puede permitir que el entorno de ejecución devuelva una pose y un tamaño más precisos.
El entorno de ejecución debe enumerar XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT o XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT, o ambos.
Si XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT se enumera con xrEnumerateSpatialCapabilityFeaturesEXT, el entorno de ejecución debe proporcionar tamaños de imagen automáticamente para las imágenes para las que la aplicación no proporcionó ninguna estructura XrSpatialImageSizeEXT como parte de ninguna de las cadenas siguientes aplicables.
Para que el entorno de ejecución pueda generar tamaños de imágenes de forma automática y precisa, es posible que se requieran ciertas capacidades del dispositivo y requisitos previos, como cámaras estéreo y parámetros extrínsecos e intrínsecos de la cámara calibrados con precisión.
Si xrEnumerateSpatialCapabilityFeaturesEXT no enumera XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT, la aplicación debe vincular las estructuras XrSpatialImageSizeEXT a las siguientes cadenas aplicables de modo que todas las imágenes tengan un tamaño explícito proporcionado para ellas; de lo contrario, el entorno de ejecución debe devolver XR_ERROR_SPATIAL_IMAGE_SIZE_MISSING_EXT desde xrCreateSpatialImageTrackingDatabaseAsyncEXT .
Uso válido (implícito)
- La extensión
XR_EXT_spatial_image_trackingdebe estar habilitada antes de usar XrSpatialImageSizeEXT. -
typedebe serXR_TYPE_SPATIAL_IMAGE_SIZE_EXT -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras
La estructura XrSpatialCapabilityConfigurationImageTrackingEXT se define de la siguiente manera:
typedef struct XrSpatialCapabilityConfigurationImageTrackingEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
uint32_t imageTrackingDatabaseCount;
const XrSpatialImageTrackingDatabaseEXT* imageTrackingDatabases;
} XrSpatialCapabilityConfigurationImageTrackingEXT;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.capabilityes un XrSpatialCapabilityEXT y debe serXR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT.enabledComponentCountes unuint32_tque especifica la cantidad de elementos enenabledComponents.enabledComponentses un array de XrSpatialComponentTypeEXT que especifica los componentes que se habilitarán para esta capacidad.imageTrackingDatabaseCountes ununint32_tque especifica la cantidad de elementos enimageTrackingDatabases.imageTrackingDatabaseses un array de controladores XrSpatialImageTrackingDatabaseEXT que especifica las bases de datos de seguimiento de imágenes que se habilitarán para el contexto espacial.
Si se admite el seguimiento de imágenes, el entorno de ejecución debe habilitarlo si se pasa una estructura XrSpatialCapabilityConfigurationImageTrackingEXT en XrSpatialContextCreateInfoEXT :: capabilityConfigs cuando se llama a xrCreateSpatialContextAsyncEXT .
La estructura XrSpatialCapabilityConfigurationImageTrackingEXT permite que la aplicación descubra las imágenes de referencia representadas por los controladores XrSpatialImageTrackingDatabaseEXT en imageTrackingDatabases .
El entorno de ejecución debe devolver XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT si xrEnumerateSpatialCapabilitiesEXT no enumera XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT.
Uso válido (implícito)
- La extensión
XR_EXT_spatial_image_trackingdebe estar habilitada antes de usar XrSpatialCapabilityConfigurationImageTrackingEXT. -
typedebe serXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_IMAGE_TRACKING_EXT -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras -
capabilitydebe ser un valor XrSpatialCapabilityEXT válido -
enabledComponentsdebe ser un puntero a un array de valoresenabledComponentCountXrSpatialComponentTypeEXT válidos -
imageTrackingDatabasesdebe ser un puntero a un array de controladores XrSpatialImageTrackingDatabaseEXT válidos deimageTrackingDatabaseCount - El parámetro
enabledComponentCountdebe ser mayor que0. - El parámetro
imageTrackingDatabaseCountdebe ser mayor que0.
Imagen de referencia espacial
La estructura XrSpatialReferenceImagePlaneEXT se define de la siguiente manera:
typedef struct XrSpatialReferenceImagePlaneEXT {
uint32_t bufferSize;
uint8_t* buffer;
uint32_t rowStride;
uint32_t pixelStride;
} XrSpatialReferenceImagePlaneEXT;
Descripciones de los parámetros
bufferSizees el tamaño del arraybuffer.bufferes un array de datosuint8_tque representa los datos del plano.rowStridees la distancia en bytes entre dos posiciones iniciales de filas de datos de píxeles consecutivas.pixelStridees la distancia en bytes entre dos píxeles consecutivos.
El entorno de ejecución debe acceder a buffer según los patrones que proporcionan los parámetros rowStride y pixelStride.
La aplicación debe establecer rowStride y pixelStride de modo que el entorno de ejecución solo extraiga los píxeles significativos de este XrSpatialReferenceImagePlaneEXT.
Uso válido (implícito)
- La extensión
XR_EXT_spatial_image_trackingdebe estar habilitada antes de usar XrSpatialReferenceImagePlaneEXT. -
bufferdebe ser un puntero a un array de valoresbufferSizeuint8_t - El parámetro
bufferSizedebe ser mayor que0.
La estructura XrSpatialReferenceImageEXT se define de la siguiente manera:
typedef struct XrSpatialReferenceImageEXT {
XrStructureType type;
const void* next;
uint32_t width;
uint32_t height;
XrSpatialReferenceImageFormatEXT format;
uint32_t planeCount;
const XrSpatialReferenceImagePlaneEXT* planes;
} XrSpatialReferenceImageEXT;
Descripciones de los parámetros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.widthes el ancho en píxeles de la imagen de referencia.heightes la altura en píxeles de la imagen de referencia.formates un XrSpatialReferenceImageFormatEXT que representa el formato de la imagen.planeCountes la cantidad de elementos en el arrayplanes.planeses un array de estructuras XrSpatialReferenceImagePlaneEXT que representan los planos de los datos de la imagen.
La aplicación puede crear una o más estructuras XrSpatialReferenceImageEXT, cada una de las cuales representa una sola imagen de referencia de entrada que se pasará a la función xrCreateSpatialImageTrackingDatabaseAsyncEXT a través de XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages cuando se cree un controlador XrSpatialImageTrackingDatabaseEXT.
La aplicación debe proporcionar los datos de XrSpatialReferenceImagePlaneEXT :: buffer en un orden de píxeles de izquierda a derecha y de arriba abajo.
La aplicación debe proporcionar una estructura XrSpatialReferenceImagePlaneEXT en el array XrSpatialReferenceImageEXT :: planes para cada canal de color de XrSpatialReferenceImageEXT :: format .
Uso válido (implícito)
- La extensión
XR_EXT_spatial_image_trackingdebe estar habilitada antes de usar XrSpatialReferenceImageEXT. -
typedebe serXR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras . Consulta también: XrSpatialAnnotationQuadReferenceANDROID, XrSpatialImageSizeEXT y XrSpatialImageStaticOptimizationEXT -
formatdebe ser un valor válido de XrSpatialReferenceImageFormatEXT -
planesdebe ser un puntero a un array de estructuras XrSpatialReferenceImagePlaneEXT válidas deplaneCount - El parámetro
planeCountdebe ser mayor que0.
Componentes garantizados
Un entorno de ejecución que admita XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT debe proporcionar los siguientes componentes espaciales como componentes garantizados de todas las entidades descubiertas por esas capacidades y debe enumerarlos en xrEnumerateSpatialCapabilityComponentTypesEXT :
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXTXR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
Componente de imagen 2D
Struct de lista de componentes para consultar datos
La estructura XrSpatialComponentImage2DListEXT se define de la siguiente manera:
typedef struct XrSpatialComponentImage2DListEXT {
XrStructureType type;
const void* next;
uint32_t imageCount;
XrSpatialImage2DDataEXT* images;
} XrSpatialComponentImage2DListEXT;
Descripciones de los parámetros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.imageCountes la cantidad de elementos en el arrayimages.imageses un array de XrSpatialImage2DDataEXT .
El entorno de ejecución debe devolver XR_ERROR_VALIDATION_FAILURE de xrQuerySpatialComponentDataEXT si XrSpatialComponentImage2DListEXT está en la cadena XrSpatialComponentDataQueryResultEXT :: next, pero XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT no se incluye en XrSpatialComponentDataQueryConditionEXT :: componentTypes .
El entorno de ejecución debe devolver XR_ERROR_SIZE_INSUFFICIENT de xrQuerySpatialComponentDataEXT si imageCount es menor que XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
Uso válido (implícito)
- La extensión
XR_EXT_spatial_image_trackingdebe estar habilitada antes de usar XrSpatialComponentImage2DListEXT. -
typedebe serXR_TYPE_SPATIAL_COMPONENT_IMAGE_2D_LIST_EXT -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras -
imagesdebe ser un puntero a un array de estructurasimageCountXrSpatialImage2DDataEXT. - El parámetro
imageCountdebe ser mayor que0.
Datos de componentes
La estructura XrSpatialImage2DDataEXT se define de la siguiente manera:
typedef struct XrSpatialImage2DDataEXT {
XrSpatialImageTrackingDatabaseEXT imageTrackingDatabase;
uint32_t referenceImageIndex;
} XrSpatialImage2DDataEXT;
Descripciones de los parámetros
imageTrackingDatabasees el XrSpatialImageTrackingDatabaseEXT que detectó o hizo un seguimiento de la imagen.referenceImageIndexes el índice que se asigna al array XrSpatialImageTrackingDatabaseCreateInfoEXT ::spatialReferenceImagesde imágenes de referencia de entrada con las que se creóimageTrackingDatabase.
La aplicación puede usar imageTrackingDatabase para identificar qué XrSpatialImageTrackingDatabaseEXT creado anteriormente contiene la imagen de referencia de esta estructura XrSpatialImage2DDataEXT. Para ese XrSpatialImageTrackingDatabaseEXT , la aplicación puede usar referenceImageIndex para identificar el XrSpatialReferenceImageEXT de esta estructura XrSpatialImage2DDataEXT haciéndolo coincidir con el orden de entrada del array XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages.
El conjunto de imágenes de referencia definido por el conjunto de todas las bases de datos activas no debería incluir imágenes duplicadas. Incluir imágenes duplicadas puede causar un comportamiento adverso de descubrimiento o seguimiento, es decir, que se devuelvan índices incoherentes o múltiples.
Uso válido (implícito)
- La extensión
XR_EXT_spatial_image_trackingdebe estar habilitada antes de usar XrSpatialImage2DDataEXT. -
imageTrackingDatabasedebe ser un controlador XrSpatialImageTrackingDatabaseEXT válido.
Configuración
Si XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT se enumera en XrSpatialCapabilityComponentTypesEXT :: componentTypes para alguna capacidad, la aplicación puede habilitarla incluyendo el valor de enumeración en la lista XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents. Este componente no requiere ninguna configuración especial para incluirse en la siguiente cadena de XrSpatialCapabilityConfigurationBaseHeaderEXT .
Componente 2D delimitado
El componente 2D delimitado proporciona el centro y las extensiones de la imagen espacial representada por la entidad en la que se encuentra. Consulta Bounded 2D para obtener más detalles sobre el componente Bounded 2D.
Código de ejemplo
Descubre imágenes espaciales y consulta datos de componentes
En el siguiente ejemplo de código, se muestra cómo descubrir entidades espaciales para la función de seguimiento de imágenes y consultar los datos de sus componentes.
XrInstance instance; // Previously initialized
XrSystemId systemId; // Previously initialized
XrSession session; // Previously initialized
uint32_t capabilityCountOutput = 0;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0, &capabilityCountOutput, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCountOutput);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilities.size(), &capabilityCountOutput, capabilities.data()));
if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT) == capabilities.end()) {
// Image tracking not supported
}
XrSpatialCapabilityComponentTypesEXT imageTrackingComponents{XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, &imageTrackingComponents));
std::vector<XrSpatialComponentTypeEXT> imageTrackingCapabilityComponents(imageTrackingComponents.componentTypeCountOutput);
imageTrackingComponents.componentTypes = imageTrackingCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, &imageTrackingComponents));
if (std::find(imageTrackingCapabilityComponents.begin(), imageTrackingCapabilityComponents.end(), XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT) == imageTrackingCapabilityComponents.end()) {
// The image2d component is not supported
}
uint32_t capabilityFeatureCountOutput = 0;
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, 0, &capabilityFeatureCountOutput, nullptr));
std::vector<XrSpatialCapabilityFeatureEXT> capabilityFeatures(capabilityFeatureCountOutput);
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, capabilityFeatures.size(), &capabilityFeatureCountOutput, capabilityFeatures.data()));
// Helper function to query optional feature support
const auto supportsFeature = [&capabilityFeatures](XrSpatialCapabilityFeatureEXT feature) {
return std::find(capabilityFeatures.begin(), capabilityFeatures.end(), feature) != capabilityFeatures.end();
};
// supported state for optional features
const bool supportsAutomaticScaleEstimation = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT);
const bool supportsStaticImages = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT);
const bool supportsFixedSizeImages = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT);
uint32_t formatCountOutput = 0;
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, 0, &formatCountOutput, nullptr));
std::vector<XrSpatialReferenceImageFormatEXT> formats(formatCountOutput);
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, formats.size(), &formatCountOutput, formats.data()));
if (std::find(formats.begin(), formats.end(), XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT) == formats.end()) {
// The desired format is not supported
}
// Helper function to wait for XrFutureEXT completion
auto waitUntilReady = [&](XrFutureEXT future) {
XrFuturePollInfoEXT pollInfo{XR_TYPE_FUTURE_POLL_INFO_EXT};
XrFuturePollResultEXT pollResult{XR_TYPE_FUTURE_POLL_RESULT_EXT};
pollInfo.future = future;
do {
// sleep(1);
CHK_XR(xrPollFutureEXT(instance, &pollInfo, &pollResult));
} while (pollResult.state != XR_FUTURE_STATE_READY_EXT);
};
// Data/metadata about reference images (identifiers, 3D models, trigger functions, etc.)
std::vector<std::string> referenceImageIdentifiers;
XrSpatialImageTrackingDatabaseEXT imageTrackingDatabase{};
{
uint32_t imgSize; // preloaded interleaved RGBA buffer size
uint8_t* img; // preloaded interleaved RGBA buffer data
// interleaved RGBA buffer memory layout and buffer positions
// first row of pixels
// img[0] | img[1] | img[2] | img[3] | img[0]+pStride | img[1]+pStride | ...
// R0 | G0 | B0 | A0 | R1 | G1 | ...
// second row of pixels
// img[0]+rStride | img[1]+rStride | img[2]+rStride | img[3]+rStride | img[0]+rStride+pStride | ...
// R640 | G640 | B640 | A640 | R641 | ...
XrSpatialReferenceImagePlaneEXT spatialReferenceImagePlanes[4];
for (int i = 0; i < 4; ++i) { // for each plane (0=R, 1=G, 2=B, 3=A)
spatialReferenceImagePlanes[i].buffer = img + i; // set each plane buffer pointer to the first pixel of the plane
spatialReferenceImagePlanes[i].bufferSize = imgSize - i; // adjust remeinaing buffer size according to offset applied
spatialReferenceImagePlanes[i].rowStride = 640 * 4; // set byte offset to start of next row for this plane
spatialReferenceImagePlanes[i].pixelStride = 4; // set byte offset to next pixel for this plane
}
XrSpatialReferenceImageEXT spatialReferenceImage{XR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT};
spatialReferenceImage.width = 640;
spatialReferenceImage.height = 480;
spatialReferenceImage.format = XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT;
spatialReferenceImage.planeCount = 4;
spatialReferenceImage.planes = spatialReferenceImagePlanes;
referenceImageIdentifiers.emplace_back("MyReferenceImage");
// Helper function to append to the next chain
XrBaseOutStructure* appendTo = reinterpret_cast<XrBaseOutStructure*>(&spatialReferenceImage);
const auto appendToNextChain = [&appendTo](XrBaseOutStructure* toAppend) {
appendTo->next = toAppend;
appendTo = toAppend;
};
XrSpatialImageSizeEXT imageSize{XR_TYPE_SPATIAL_IMAGE_SIZE_EXT};
imageSize.physicalWidth = 0.1f;
if (!supportsAutomaticScaleEstimation) {
if (supportsFixedSizeImages) {
appendToNextChain(reinterpret_cast<XrBaseOutStructure*>(&imageSize));
}
}
XrSpatialImageStaticOptimizationEXT imageStaticOptimization{XR_TYPE_SPATIAL_IMAGE_STATIC_OPTIMIZATION_EXT};
imageStaticOptimization.optimizeForStaticImage = XR_TRUE;
if (supportsStaticImages) {
appendToNextChain(reinterpret_cast<XrBaseOutStructure*>(&imageStaticOptimization));
}
XrSpatialImageTrackingDatabaseCreateInfoEXT spatialImageTrackingDatabaseCreateInfo{XR_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_CREATE_INFO_EXT};
spatialImageTrackingDatabaseCreateInfo.spatialReferenceImages = &spatialReferenceImage;
spatialImageTrackingDatabaseCreateInfo.spatialReferenceImageCount = 1;
XrFutureEXT createImageTrackingDatabaseFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialImageTrackingDatabaseAsyncEXT(session, &spatialImageTrackingDatabaseCreateInfo, &createImageTrackingDatabaseFuture));
waitUntilReady(createImageTrackingDatabaseFuture);
XrCreateSpatialImageTrackingDatabaseCompletionEXT imageTrackingCompletion{XR_TYPE_CREATE_SPATIAL_IMAGE_TRACKING_DATABASE_COMPLETION_EXT};
CHK_XR(xrCreateSpatialImageTrackingDatabaseCompleteEXT(session, createImageTrackingDatabaseFuture, &imageTrackingCompletion));
if (imageTrackingCompletion.futureResult != XR_SUCCESS) {
// Error, image tracking database creation failed
}
imageTrackingDatabase = imageTrackingCompletion.database;
}
XrSpatialContextEXT spatialContext{};
{
const std::array<XrSpatialComponentTypeEXT, 2> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT
};
// Configure the image tracking capability for the spatial context
XrSpatialCapabilityConfigurationImageTrackingEXT imageTrackingCapabilityConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_IMAGE_TRACKING_EXT};
imageTrackingCapabilityConfig.capability = XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT;
imageTrackingCapabilityConfig.enabledComponentCount = enabledComponents.size();
imageTrackingCapabilityConfig.enabledComponents = enabledComponents.data();
imageTrackingCapabilityConfig.imageTrackingDatabaseCount = 1;
imageTrackingCapabilityConfig.imageTrackingDatabases = &imageTrackingDatabase;
std::vector<XrSpatialCapabilityConfigurationBaseHeaderEXT*> capabilityConfigs;
capabilityConfigs.push_back(reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&imageTrackingCapabilityConfig));
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
}
spatialContext = completion.spatialContext;
}
auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
// We want to look for entities that have the following components
std::array<XrSpatialComponentTypeEXT, 2> snapshotComponents {XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT, XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT};
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 = localSpace;
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 the bounded2d component data
XrSpatialComponentTypeEXT componentsToQuery[] = {XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT, XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT};
XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
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<XrSpatialBounded2DDataEXT> bounded2d(queryResult.entityIdCountOutput);
XrSpatialComponentBounded2DListEXT boundsList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT};
boundsList.boundCount = bounded2d.size();
boundsList.bounds = bounded2d.data();
queryResult.next = &boundsList;
std::vector<XrSpatialImage2DDataEXT> image2d(queryResult.entityIdCountOutput);
XrSpatialComponentImage2DListEXT imagesList{XR_TYPE_SPATIAL_COMPONENT_IMAGE_2D_LIST_EXT};
imagesList.imageCount = image2d.size();
imagesList.images = image2d.data();
queryResult.next = &imagesList;
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 XrSpatialImage2DDataEXT& currentImage2d = image2d[i];
const std::string& currentReferenceImageIdentifier = referenceImageIdentifiers[currentImage2d.referenceImageIndex];
std::cout << currentReferenceImageIdentifier << std::endl; // Outputs the "MyReferenceImage" string the app defined previously; could be any other assocatied data or action.
// Access bounded2d[i] for image bounds
}
}
CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
}
};
while (1) {
// For every frame in frame loop
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_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);
break;
}
}
}
// Finish frame loop
}
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
// Unload spatial image tracking resources internally
CHK_XR(xrDestroySpatialImageTrackingDatabaseEXT(imageTrackingDatabase));
Nuevos tipos de objetos
Comandos nuevos
- xrCreateSpatialImageTrackingDatabaseAsyncEXT
- xrCreateSpatialImageTrackingDatabaseCompleteEXT
- xrDestroySpatialImageTrackingDatabaseEXT
- xrEnumerateSpatialReferenceImageFormatsEXT
Estructuras nuevas
- XrCreateSpatialImageTrackingDatabaseCompletionEXT
- XrSpatialCapabilityConfigurationImageTrackingEXT
- XrSpatialImage2DDataEXT
- XrSpatialImageTrackingDatabaseCreateInfoEXT
- XrSpatialReferenceImageEXT
- XrSpatialReferenceImagePlaneEXT
Extiende XrSpatialComponentDataQueryResultEXT :
Extiende XrSpatialReferenceImageEXT , XrSpatialImageTrackingDatabaseCreateInfoEXT :
Enums nuevas
Nuevas constantes de enum
XR_EXT_SPATIAL_IMAGE_TRACKING_EXTENSION_NAMEXR_EXT_spatial_image_tracking_SPEC_VERSIONExtiende XrObjectType :
XR_OBJECT_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_EXT
Extiende XrResult :
XR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXTXR_ERROR_SPATIAL_IMAGE_INVALID_EXTXR_ERROR_SPATIAL_IMAGE_SIZE_MISSING_EXT
Extiende XrSpatialCapabilityEXT :
XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT
Extensión de XrSpatialCapabilityFeatureEXT :
XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXTXR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXTXR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT
Extiende XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT
Extiende XrStructureType :
XR_TYPE_CREATE_SPATIAL_IMAGE_TRACKING_DATABASE_COMPLETION_EXTXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_IMAGE_TRACKING_EXTXR_TYPE_SPATIAL_COMPONENT_IMAGE_2D_LIST_EXTXR_TYPE_SPATIAL_IMAGE_SIZE_EXTXR_TYPE_SPATIAL_IMAGE_STATIC_OPTIMIZATION_EXTXR_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_CREATE_INFO_EXTXR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT
Problemas
Historial de versiones
Revisión 1, 22 de abril de 2025 (Daniel Guttenberg, Qualcomm)
- Descripción inicial de la extensión