XR_ANDROID_spatial_annotation_tracking
String de nome
XR_ANDROID_spatial_annotation_tracking
Tipo de extensão
Extensão de instância
Número da extensão registrada
795
Revisão
1
Status de ratificação
Não ratificado
Dependências de extensão e versão
XR_EXT_spatial_entity
e
XR_EXT_spatial_image_tracking
Data da última modificação
2026-01-12
Status do IP
Não há reivindicações de IP conhecidas.
Colaboradores
Levana Chen, Google
Christopher Feil, Google
Martin Sundermeyer, Google
David Joseph Tan, Google
Jared Finder, Google
Nihav Jain, Google
Visão geral
Essa extensão oferece a capacidade de rastreamento de anotações para a extensão XR_EXT_spatial_entity, permitindo rastrear várias anotações na cena. Ele permite que os aplicativos coloquem sobreposições em objetos físicos ou virtuais definidos por referências de tempo de execução.
Essa extensão oferece um tipo de anotação básica "Quad", que é um polígono com exatamente quatro lados, ou seja, um quadrilátero convexo, representando uma caixa delimitadora 2D generalizada em uma referência de tempo de execução. Uma anotação de quadra rastreada é representada como uma entidade espacial com (ou "que tem") os seguintes componentes:
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
Os aplicativos podem usar a extensão de rastreamento de anotação espacial nos seguintes padrões:
- Primeiro, um aplicativo cria um identificador de XrSpatialReferenceCacheANDROID, que começa a gravar referências de tempo de execução da origem especificada.
- Em seguida, o aplicativo captura uma referência de tempo de execução de XrSpatialReferenceImageEXT e define uma anotação desejada dentro da referência durante o período do cache de referência.
- Em seguida, o aplicativo cria um identificador XrSpatialContextEXT com base no XrSpatialReferenceImageEXT fornecido por XrSpatialCapabilityConfigurationAnnotationTrackingANDROID .
- O aplicativo pode destruir o identificador XrSpatialReferenceCacheANDROID para interromper a gravação de referências de tempo de execução e reduzir o uso da memória ou aguardar o evento
XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDpara confirmar o resultado da inicialização. - Em seguida, o aplicativo extrai o evento
XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROIDpara confirmar o resultado da inicialização da anotação. - Se a inicialização for bem-sucedida, o aplicativo poderá extrair o evento
XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXTpara rastrear a anotação. - Se a inicialização falhar, o aplicativo poderá usar o código de erro retornado no evento para determinar o motivo da falha e destruir o identificador XrSpatialContextEXT atual para iniciar uma nova anotação.
- Independente do resultado da inicialização, o aplicativo pode liberar o buffer de imagem para reduzir o uso da memória após receber o evento.
- O aplicativo descobre e consulta anotações de acordo com os padrões de acesso a entidades espaciais.
- O aplicativo pode criar um identificador XrSpatialContextEXT adicional para rastrear anotações em uma nova referência durante o período de um XrSpatialReferenceCacheANDROID válido .
- O aplicativo pode destruir identificadores XrSpatialContextEXT para reduzir o conjunto de anotações detectáveis e rastreáveis de forma dinâmica durante a execução.
Suporte ao ambiente de execução
Um ambiente de execução precisa anunciar o suporte ao recurso de rastreamento de anotações usando xrEnumerateSpatialCapabilitiesEXT ao listar a seguinte capability:
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
Quando o ambiente de execução é compatível com o recurso de acompanhamento de anotações:
- Ele precisa oferecer suporte a pelo menos um componente de anotação, listando os componentes de anotação aceitos usando xrEnumerateSpatialCapabilityComponentTypesEXT .
- Ele precisa oferecer suporte a pelo menos um dos XrSpatialReferenceImageFormatEXT , listando os formatos de referência compatíveis via xrEnumerateSpatialReferenceImageFormatsEXT com a configuração
capabilitycomoXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID. - Ele precisa oferecer suporte a pelo menos um XrSpatialAnnotationReferenceSourceANDROID , listando as fontes de referência compatíveis via xrEnumerateSpatialAnnotationReferenceSourcesANDROID com a configuração
capabilitycomoXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID.
A função xrEnumerateSpatialAnnotationReferenceSourcesANDROID é definida como:
XrResult xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
XrInstance instance,
XrSystemId systemId,
XrSpatialCapabilityEXT capability,
uint32_t sourceCapacityInput,
uint32_t* sourceCountOutput,
XrSpatialAnnotationReferenceSourceANDROID* sources);
Descrições dos parâmetros
instanceé um identificador de uma XrInstance .systemIdé oXrSystemIdcujas fontes de referência serão enumeradas.capabilityé o XrSpatialCapabilityEXT para o qual as fontes de referência serão enumeradas.sourceCapacityInputé a capacidade da matrizsourcesou 0 para indicar uma solicitação de recuperação da capacidade necessária.sourceCountOutputé o número de fontes ou a capacidade necessária casosourceCapacityInputseja insuficiente.sourcesé uma matriz de XrSpatialAnnotationReferenceSourceANDROID . Ele pode serNULLsesourceCapacityInputfor 0.- Consulte a seção Parâmetros de tamanho do buffer para uma descrição detalhada de como recuperar o tamanho
sourcesnecessário.
O aplicativo pode enumerar a lista de fontes de referência compatíveis com um determinado XrSystemId usando xrEnumerateSpatialAnnotationReferenceSourcesANDROID .
O tempo de execução não pode enumerar as fontes de referência cuja extensão não está ativada para instance .
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_annotation_trackingprecisa ser ativada antes de chamar xrEnumerateSpatialAnnotationReferenceSourcesANDROID. -
instanceprecisa ser um identificador XrInstance válido -
capabilityprecisa ser um valor XrSpatialCapabilityEXT válido -
sourceCountOutputprecisa ser um ponteiro para um valoruint32_t. - Se
sourceCapacityInputnão for0,sourcesprecisa ser um ponteiro para uma matriz de valoressourceCapacityInputXrSpatialAnnotationReferenceSourceANDROID.
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
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;
A enumeração XrSpatialAnnotationReferenceSourceANDROID descreve a origem da referência que fornece os metadados de uma anotação.
Os tipos enumerados têm os seguintes significados:
Descrição da enumeração
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID
A imagem de referência é uma imagem sem corte gerada por uma API de câmera do Android, por exemplo, uma imagem de um ImageReader associado a um CameraDevice do Camera2 ou um ImageProxy de uma ImageAnalysis associada ao CameraX. Normalmente, é uma das câmeras RGB voltadas para a frente.
XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MEDIA_PROJECTION_ANDROID
A imagem de referência é uma imagem sem corte gerada pela API Android MediaProjection, por exemplo, uma imagem de um ImageReader associado a uma tela virtual MediaProjection. Ele pode incluir conteúdo virtual e real.
A estrutura XrSystemSpatialAnnotationPropertiesANDROID é definida como:
typedef struct XrSystemSpatialAnnotationPropertiesANDROID {
XrStructureType type;
void* next;
uint32_t referenceCacheTimespan;
uint32_t maxReferencePixelWidth;
uint32_t maxReferencePixelHeight;
uint32_t maxReferenceCount;
uint32_t maxAnnotationCount;
} XrSystemSpatialAnnotationPropertiesANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas.referenceCacheTimespanindica o período em segundos de um identificador XrSpatialReferenceCacheANDROID válido.maxReferencePixelWidthindica a largura máxima da borda das imagens de referência em pixels.maxReferencePixelHeightindica a altura máxima da borda das imagens de referência em pixels.maxReferenceCountindica o número máximo de imagens de referência a serem alocadas ao mesmo tempo.maxAnnotationCountindica o número máximo de anotações a serem rastreadas ao mesmo tempo.
Quando o ambiente de execução oferece suporte ao recurso de rastreamento de anotações, um aplicativo pode inspecionar as propriedades relevantes do sistema encadeando uma estrutura XrSystemSpatialAnnotationPropertiesANDROID ao XrSystemProperties ao chamar xrGetSystemProperties .
Se XrSpatialReferenceImageEXT :: width de XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference exceder maxReferencePixelWidth , o tempo de execução deverá retornar XR_ERROR_VALIDATION_FAILURE ao chamar xrCreateSpatialContextAsyncEXT .
Se XrSpatialReferenceImageEXT :: height de XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference exceder maxReferencePixelHeight , o tempo de execução deverá retornar XR_ERROR_VALIDATION_FAILURE ao chamar xrCreateSpatialContextAsyncEXT .
Se XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: time estiver fora do período de XrSpatialReferenceCacheANDROID :: cache , o tempo de execução deverá retornar XR_ERROR_TIME_INVALID ao chamar xrCreateSpatialContextAsyncEXT . O aplicativo pode recriar o identificador XrSpatialContextEXT com uma nova referência durante o período do XrSpatialReferenceCacheANDROID .
Se o número de imagens de referência alocadas exceder maxReferenceCount , o ambiente de execução deverá retornar XR_ERROR_LIMIT_REACHED e indicar a falha de inicialização via XrEventDataSpatialAnnotationTrackingANDROID :: initializationResult . O aplicativo pode destruir o identificador XrSpatialContextEXT e tentar de novo depois que a inicialização pendente for concluída.
Se o número de anotações ativas exceder maxAnnotationCount , o tempo de execução deverá retornar XR_ERROR_VALIDATION_FAILURE ao chamar xrCreateSpatialContextAsyncEXT .
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_annotation_trackingprecisa ser ativada antes de usar XrSystemSpatialAnnotationPropertiesANDROID. -
typeprecisa serXR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas.
Cache de referência do ambiente de execução
XR_DEFINE_HANDLE(XrSpatialReferenceCacheANDROID)
O identificador XrSpatialReferenceCacheANDROID representa um cache de referências de tempo de execução gravadas de uma determinada origem.
A função xrCreateSpatialReferenceCacheAsyncANDROID é definida como:
XrResult xrCreateSpatialReferenceCacheAsyncANDROID(
XrSession session,
const XrSpatialReferenceCacheCreateInfoANDROID* createInfo,
XrFutureEXT* future);
Descrições dos parâmetros
sessioné uma XrSession em que o cache de referência vai estar ativo.createInfoé um ponteiro para um XrSpatialReferenceCacheCreateInfoANDROID usado para especificar os parâmetros de cache de referência.futureé um ponteiro para o handle de saída de umXrFutureEXT.
O aplicativo pode criar um identificador XrSpatialReferenceCacheANDROID chamando xrCreateSpatialReferenceCacheAsyncANDROID . O ambiente de execução pode levar algum tempo para inicializar os serviços de rastreamento. O aplicativo pode chamar xrCreateSpatialReferenceCacheCompleteANDROID repetidamente para verificar a conclusão dessa operação assíncrona.
O tempo de execução precisa retornar XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT se XrSpatialReferenceCacheCreateInfoANDROID :: capability não estiver listado por xrEnumerateSpatialCapabilitiesEXT .
O tempo de execução deve retornar XR_ERROR_FEATURE_UNSUPPORTED se XrSpatialReferenceCacheCreateInfoANDROID :: source não estiver listado por xrEnumerateSpatialAnnotationReferenceSourcesANDROID para o recurso especificado.
O aplicativo pode criar apenas um identificador por origem para uma determinada capacidade. Caso contrário, o tempo de execução precisa retornar XR_ERROR_LIMIT_REACHED .
O aplicativo pode capturar referências de tempo de execução durante o período do identificador XrSpatialReferenceCacheANDROID para configurar um novo identificador XrSpatialContextEXT.
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_annotation_trackingprecisa ser ativada antes de chamar xrCreateSpatialReferenceCacheAsyncANDROID. -
sessionprecisa ser um identificador XrSession válido -
createInfoprecisa ser um ponteiro para uma estrutura XrSpatialReferenceCacheCreateInfoANDROID válida -
futureprecisa ser um ponteiro para um valorXrFutureEXT
Códigos de retorno
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
A estrutura XrSpatialReferenceCacheCreateInfoANDROID é definida como:
typedef struct XrSpatialReferenceCacheCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
XrSpatialAnnotationReferenceSourceANDROID source;
} XrSpatialReferenceCacheCreateInfoANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas. Nenhuma dessas estruturas é definida no OpenXR principal ou nesta extensão.capabilityé um XrSpatialCapabilityEXT que descreve para qual recurso o cache de referência é criado.sourceé um XrSpatialAnnotationReferenceSourceANDROID que descreve a origem do cache de referência.
A estrutura XrSpatialReferenceCacheCreateInfoANDROID descreve as informações para criar um identificador XrSpatialReferenceCacheANDROID.
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_annotation_trackingprecisa ser ativada antes de usar XrSpatialReferenceCacheCreateInfoANDROID. -
typeprecisa serXR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas. -
capabilityprecisa ser um valor XrSpatialCapabilityEXT válido -
sourceprecisa ser um valor XrSpatialAnnotationReferenceSourceANDROID válido
A função xrCreateSpatialReferenceCacheCompleteANDROID é definida como:
XrResult xrCreateSpatialReferenceCacheCompleteANDROID(
XrSession session,
XrFutureEXT future,
XrCreateSpatialReferenceCacheCompletionANDROID* completion);
Descrições dos parâmetros
sessioné o XrSession transmitido anteriormente para xrCreateSpatialReferenceCacheAsyncANDROID ::session.futureé oXrFutureEXTrecebido de xrCreateSpatialReferenceCacheAsyncANDROID ::future.completioné um ponteiro para um XrCreateSpatialReferenceCacheCompletionANDROID .
O aplicativo pode chamar xrCreateSpatialReferenceCacheCompleteANDROID para aguardar a conclusão da operação assíncrona iniciada por xrCreateSpatialReferenceCacheAsyncANDROID .
O tempo de execução precisa retornar XR_ERROR_FUTURE_PENDING_EXT se future não estiver no estado pronto. O tempo de execução precisa retornar XR_ERROR_FUTURE_INVALID_EXT se future já tiver sido concluído ou cancelado.
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_annotation_trackingprecisa ser ativada antes de chamar xrCreateSpatialReferenceCacheCompleteANDROID. -
sessionprecisa ser um identificador XrSession válido -
completionprecisa ser um ponteiro para uma estrutura XrCreateSpatialReferenceCacheCompletionANDROID
Códigos de retorno
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
A estrutura XrCreateSpatialReferenceCacheCompletionANDROID é definida da seguinte forma:
typedef struct XrCreateSpatialReferenceCacheCompletionANDROID {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialReferenceCacheANDROID referenceCache;
} XrCreateSpatialReferenceCacheCompletionANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas. Nenhuma dessas estruturas é definida no OpenXR principal ou nesta extensão.futureResulté o XrResult da operação de criação de cache de referência.referenceCacheé o identificador XrSpatialReferenceCacheANDROID se a operação for bem-sucedida.
Códigos de retorno futuros
Valores de 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
Se futureResult for um código de sucesso, o tempo de execução deverá retornar um identificador referenceCache válido. Se referenceCache for válido, ele permanecerá assim apenas durante o ciclo de vida de xrCreateSpatialReferenceCacheAsyncANDROID :: session ou até que o aplicativo destrua o identificador com xrDestroySpatialReferenceCacheANDROID, o que ocorrer primeiro.
Quando referenceCache é válido, ele grava caches em XrSystemSpatialAnnotationPropertiesANDROID :: referenceCacheTimespan .
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_annotation_trackingprecisa ser ativada antes de usar XrCreateSpatialReferenceCacheCompletionANDROID. -
typeprecisa serXR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas. -
futureResultprecisa ser um valor XrResult válido -
referenceCacheprecisa ser um identificador XrSpatialReferenceCacheANDROID válido
A função xrDestroySpatialReferenceCacheANDROID é definida como:
XrResult xrDestroySpatialReferenceCacheANDROID(
XrSpatialReferenceCacheANDROID cacheHandle);
Descrições dos parâmetros
cacheHandleé um XrSpatialReferenceCacheANDROID criado anteriormente por xrCreateSpatialReferenceCacheAsyncANDROID .
O aplicativo pode chamar a função xrDestroySpatialReferenceCacheANDROID para liberar o identificador cacheHandle e os recursos subjacentes quando a criação do contexto espacial for concluída.
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_annotation_trackingprecisa ser ativada antes de chamar xrDestroySpatialReferenceCacheANDROID. -
cacheHandleprecisa ser um identificador XrSpatialReferenceCacheANDROID válido
Concorrência segura
- O acesso a
cacheHandlee a qualquer identificador filho precisa ser sincronizado externamente.
Códigos de retorno
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
Configuração
A estrutura XrSpatialCapabilityConfigurationAnnotationTrackingANDROID é definida como:
typedef struct XrSpatialCapabilityConfigurationAnnotationTrackingANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
XrSpatialReferenceCacheANDROID cache;
XrTime time;
XrSpatialReferenceImageEXT reference;
} XrSpatialCapabilityConfigurationAnnotationTrackingANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas.capabilityé um XrSpatialCapabilityEXT e precisa serXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID.enabledComponentCounté umuint32_tque descreve a contagem de elementos na matrizenabledComponents.enabledComponentsé um ponteiro para uma matriz de XrSpatialComponentTypeEXT .cacheé um XrSpatialReferenceCacheANDROID criado anteriormente para registrar referências de tempo de execução para a configuraçãoreference.timeé oXrTimeem que oreferenceé capturado.referenceé um XrSpatialReferenceImageEXT com anotações encadeadas ao próximo ponteiro.
Os aplicativos podem ativar o recurso espacial XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID adicionando um ponteiro à estrutura XrSpatialCapabilityConfigurationAnnotationTrackingANDROID em XrSpatialContextCreateInfoEXT :: capabilityConfigs .
O tempo de execução deve retornar XR_ERROR_VALIDATION_FAILURE se capability não for XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID .
O tempo de execução precisa retornar XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT se reference não contiver anotações.
O tempo de execução precisa retornar XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT se o componente de anotação estiver listado em enabledComponents, mas nenhuma anotação correspondente estiver associada a reference .
O tempo de execução deve retornar XR_ERROR_VALIDATION_FAILURE se cache não for de propriedade da mesma XrSession transmitida para xrCreateSpatialContextAsyncEXT .
O tempo de execução deve retornar XR_ERROR_TIME_INVALID se time estiver fora do período de cache .
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_annotation_trackingprecisa ser ativada antes de usar XrSpatialCapabilityConfigurationAnnotationTrackingANDROID. -
typeprecisa serXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas. -
capabilityprecisa ser um valor XrSpatialCapabilityEXT válido -
enabledComponentsprecisa ser um ponteiro para uma matriz deenabledComponentCountvalores XrSpatialComponentTypeEXT válidos. -
cacheprecisa ser um identificador XrSpatialReferenceCacheANDROID válido -
referenceprecisa ser uma estrutura XrSpatialReferenceImageEXT válida - O parâmetro
enabledComponentCountprecisa ser maior que0
Eventos de rastreamento de anotações
A estrutura XrEventDataSpatialAnnotationTrackingANDROID é definida da seguinte forma:
typedef struct XrEventDataSpatialAnnotationTrackingANDROID {
XrStructureType type;
const void* next;
XrSpatialContextEXT spatialContext;
uint32_t annotationIndex;
XrResult initializationResult;
} XrEventDataSpatialAnnotationTrackingANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas.spatialContexté o XrSpatialContextEXT para o qual o rastreamento de anotações foi ativado.annotationIndexmapeia o índice da matriz de anotações associada a XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ::reference.initializationResultindica o resultado da inicialização da anotação. Se não forXR_SUCCESS, o aplicativo poderá destruir e recriar o identificador XrSpatialContextEXT para reinicializar a anotação ou continuar usando ospatialContextpara rastrear outras anotações.
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_annotation_trackingprecisa ser ativada antes de usar XrEventDataSpatialAnnotationTrackingANDROID. -
typeprecisa serXR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas.
O tempo de execução precisa preencher o XrEventDataSpatialAnnotationTrackingANDROID para cada anotação e indicar a conclusão da inicialização. Independente do resultado da inicialização, o aplicativo pode liberar o buffer de imagem para reduzir o uso da memória depois de receber o evento.
O tempo de execução precisa preencher initializationResult com XR_SUCCESS se a anotação for inicializada. O aplicativo pode extrair o evento XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT para rastrear a anotação.
Caso contrário, o tempo de execução precisa preencher initializationResult com um código de erro adequado para indicar o motivo da falha. O aplicativo pode destruir o identificador XrSpatialContextEXT para iniciar uma nova anotação ou continuar usando o spatialContext para rastrear outras anotações.
Anotação de quadrante
Um ambiente de execução precisa anunciar a compatibilidade com anotações de quadrilátero usando xrEnumerateSpatialCapabilityComponentTypesEXT ao listar o seguinte tipo de componente:
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
Referência de quadriciclo
A estrutura XrSpatialAnnotationQuadReferenceANDROID é definida como:
typedef struct XrSpatialAnnotationQuadReferenceANDROID {
XrStructureType type;
const void* next;
uint32_t quadCount;
const XrSpatialAnnotationQuadANDROID* quads;
} XrSpatialAnnotationQuadReferenceANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas.quadCounté umuint32_tque descreve a contagem de elementos na matrizquads.quadsé o ponteiro para uma matriz de XrSpatialAnnotationQuadANDROID .
Quando o tempo de execução oferece suporte a anotações quádruplas, um aplicativo pode configurar anotações encadeando uma estrutura XrSpatialAnnotationQuadReferenceANDROID ao XrSpatialReferenceImageEXT :: next e definir a referência em XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference ao criar o identificador XrSpatialContextEXT.
O tempo de execução precisa retornar XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT de xrCreateSpatialContextAsyncEXT se quadCount for 0.
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_annotation_trackingprecisa ser ativada antes de usar XrSpatialAnnotationQuadReferenceANDROID. -
typeprecisa serXR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas. -
quadsprecisa ser um ponteiro para uma matriz dequadCountestruturas XrSpatialAnnotationQuadANDROID válidas. - O parâmetro
quadCountprecisa ser maior que0
A estrutura XrSpatialAnnotationQuadANDROID é definida da seguinte forma:
typedef struct XrSpatialAnnotationQuadANDROID {
XrSpatialAnnotationQuadAlignmentANDROID alignment;
XrVector2f upperLeft;
XrVector2f upperRight;
XrVector2f lowerRight;
XrVector2f lowerLeft;
} XrSpatialAnnotationQuadANDROID;
Descrições de membros
alignmenté o XrSpatialAnnotationQuadAlignmentANDROID do quadrilátero.upperLefté um XrVector2f que descreve a coordenada do canto superior esquerdo do quad relacionada à origem.upperRighté um XrVector2f que descreve a coordenada do canto superior direito do quad em relação à origem.lowerRighté um XrVector2f que descreve a coordenada do canto inferior direito do quad em relação à origem.lowerLefté um XrVector2f que descreve a coordenada do canto inferior esquerdo do quad em relação à origem.
Um quadrilátero em um espaço 2D é um quadrilátero convexo com ordem horária. O valor dos quatro cantos está relacionado à origem (0, 0) em que o quadrilátero está associado.
- Quando associada a uma XrSpatialReferenceImageEXT, a origem é o canto superior esquerdo da imagem, em que X é mapeado para o pixel na largura e Y é mapeado para o pixel na altura.
- Quando associada a um XrSpatialAnnotationQuadDataANDROID , a origem é indicada por XrSpaceLocationData ::
posede XrSpatialAnnotationQuadDataANDROID ::origin.
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_annotation_trackingprecisa ser ativada antes de usar XrSpatialAnnotationQuadANDROID. -
alignmentprecisa ser um valor XrSpatialAnnotationQuadAlignmentANDROID válido
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;
A enumeração XrSpatialAnnotationQuadAlignmentANDROID descreve o alinhamento da anotação de quad.
Os tipos enumerados têm os seguintes significados:
Descrição da enumeração
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SCREEN_ANDROID
O quadrilátero de anotação é paralelo ao plano da tela, enquanto a rotação no plano permanece bloqueada à gravidade do mundo. A saída aparece como uma caixa delimitadora regular e vertical.
XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID
O quadrilátero de anotação é ancorado diretamente ao objeto, correspondendo ao alinhamento definido na imagem de referência. A saída é um quadrilátero convexo, ajustando a forma para corresponder à perspectiva do objeto.
Componentes de quatro vias
A estrutura XrSpatialAnnotationQuadDataANDROID é definida como:
typedef struct XrSpatialAnnotationQuadDataANDROID {
uint32_t annotationIndex;
XrSpaceLocationData origin;
XrSpatialAnnotationQuadANDROID quad;
} XrSpatialAnnotationQuadDataANDROID;
Descrições de membros
annotationIndexé o mapeamento de índice para a matriz XrSpatialAnnotationQuadReferenceANDROID ::quadsassociada à referência transmitida por XrSpatialCapabilityConfigurationAnnotationTrackingANDROID ::reference.originé um XrSpaceLocationData que descreve a origem de um plano 2D em que o quad está enraizado. O tempo de execução precisa definir XrSpaceLocationData ::locationFlagspara indicar os bits válidos da postura de origem.quadé um XrSpatialAnnotationQuadANDROID que representa o quad no espaço local. Useoriginpara transformar o quadrilátero em espaço de postura.
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_annotation_trackingprecisa ser ativada antes de usar XrSpatialAnnotationQuadDataANDROID. -
originprecisa ser uma estrutura XrSpaceLocationData válida -
quadprecisa ser uma estrutura XrSpatialAnnotationQuadANDROID válida
A estrutura XrSpatialComponentAnnotationQuadListANDROID é definida da seguinte forma:
typedef struct XrSpatialComponentAnnotationQuadListANDROID {
XrStructureType type;
void* next;
uint32_t quadCount;
XrSpatialAnnotationQuadDataANDROID* quads;
} XrSpatialComponentAnnotationQuadListANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas.quadCounté umuint32_tque descreve a contagem de elementos na matrizquads.quadsé uma matriz de XrSpatialAnnotationQuadDataANDROID .
O aplicativo pode consultar o componente de anotação de quadrilátero das entidades espaciais em um XrSpatialSnapshotEXT adicionando XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID em XrSpatialComponentDataQueryConditionEXT :: componentTypes e adicionando XrSpatialComponentAnnotationQuadListANDROID à próxima cadeia de ponteiros de XrSpatialComponentDataQueryResultEXT .
O tempo de execução precisa retornar XR_ERROR_VALIDATION_FAILURE de xrQuerySpatialComponentDataEXT se XrSpatialComponentAnnotationQuadListANDROID estiver na próxima cadeia de XrSpatialComponentDataQueryResultEXT :: next, mas XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID não estiver incluído em XrSpatialComponentDataQueryConditionEXT :: componentTypes .
O tempo de execução precisa retornar XR_ERROR_SIZE_INSUFFICIENT de xrQuerySpatialComponentDataEXT se quadCount for menor que XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_annotation_trackingprecisa ser ativada antes de usar XrSpatialComponentAnnotationQuadListANDROID. -
typeprecisa serXR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas. -
quadsprecisa ser um ponteiro para uma matriz de estruturasquadCountXrSpatialAnnotationQuadDataANDROID - O parâmetro
quadCountprecisa ser maior que0
Exemplo de código
Verificar o suporte do ambiente de execução
O exemplo de código a seguir demonstra como verificar se o ambiente de execução oferece suporte ao recurso de rastreamento de anotações.
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;
}
Configurar anotação de quadrante
O exemplo de código a seguir demonstra como configurar a anotação de quadrilátero.
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));
}
Descobrir anotações ativas
O exemplo de código a seguir demonstra como descobrir e consultar anotações.
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));
Novos tipos de objeto
Novos comandos
- xrCreateSpatialReferenceCacheAsyncANDROID
- xrCreateSpatialReferenceCacheCompleteANDROID
- xrDestroySpatialReferenceCacheANDROID
- xrEnumerateSpatialAnnotationReferenceSourcesANDROID
Novas estruturas
- XrCreateSpatialReferenceCacheCompletionANDROID
- XrEventDataSpatialAnnotationTrackingANDROID
- XrSpatialAnnotationQuadANDROID
- XrSpatialAnnotationQuadDataANDROID
- XrSpatialCapabilityConfigurationAnnotationTrackingANDROID
- XrSpatialReferenceCacheCreateInfoANDROID
Extensão de XrSpatialComponentDataQueryResultEXT :
Extensão de XrSpatialReferenceImageEXT :
Extensão de XrSystemProperties :
Novos tipos enumerados
Novas constantes de enumeração
XR_ANDROID_SPATIAL_ANNOTATION_TRACKING_EXTENSION_NAMEXR_ANDROID_spatial_annotation_tracking_SPEC_VERSIONExtensão de XrObjectType :
XR_OBJECT_TYPE_SPATIAL_REFERENCE_CACHE_ANDROID
Extensão de XrSpatialCapabilityEXT :
XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
Extensão de XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
Extensão de 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
Problemas
Histórico de versões
Revisão 1, 17/09/2025 (Levana Chen)
- Descrição inicial da extensão.